Daten zeilenweise aus Tabellenblättern extrahieren und in ein anderes Tabellenblatt schreiben
Ich versuche eine Auswertung aus mehreren Tabellenblättern, die z.T. dynamisch generiert werden, sich ändern und deren Inhalte wieder gelöscht werden. Die Auswertung sollte jedoch alle extrahierten Daten enthalten.
Hallo,
ich möchte aus zwei Tabellenblättern, automatisch Daten extrahieren und in ein drittes schreiben. Konkret sieht das so aus, dass nur Zeilen, die einen Eintrag in Spalte D haben, fortlaufend auf das dritte Blatt kopiert werden sollen. Dazu soll jede Änderung in der Spalte D sofort erkannt werden und die Zeile anschließend kopiert werden.
Wenn ich das nötige Makro mit:
in den Worksheets aufrufe, passiert das zwar sofort, aber alle Daten werden neu übernommen und nicht nur die letzte Änderung. Problematisch ist für mich auch, die fortlaufende Liste. Zum Teil werden momentan alte Zeilen von neuen überschrieben oder ich habe doppelte.
Wie muss der korrekte Ansatz lauten?
Hat jemand eine praktische Idee?
Gruß
Alexander
Hallo,
ich möchte aus zwei Tabellenblättern, automatisch Daten extrahieren und in ein drittes schreiben. Konkret sieht das so aus, dass nur Zeilen, die einen Eintrag in Spalte D haben, fortlaufend auf das dritte Blatt kopiert werden sollen. Dazu soll jede Änderung in der Spalte D sofort erkannt werden und die Zeile anschließend kopiert werden.
Wenn ich das nötige Makro mit:
Private Sub Worksheet_Change(ByVal Target As Range)
Call Makro
End Sub
in den Worksheets aufrufe, passiert das zwar sofort, aber alle Daten werden neu übernommen und nicht nur die letzte Änderung. Problematisch ist für mich auch, die fortlaufende Liste. Zum Teil werden momentan alte Zeilen von neuen überschrieben oder ich habe doppelte.
Wie muss der korrekte Ansatz lauten?
Hat jemand eine praktische Idee?
Gruß
Alexander
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 151781
Url: https://administrator.de/contentid/151781
Ausgedruckt am: 23.11.2024 um 00:11 Uhr
10 Kommentare
Neuester Kommentar
Hallo Alexander!
Zu ersteinmal ist diese Funktion bei mehreren Blättern besser geeignet und der Code wird in "DieseArbeitsmappe" eingefügt:
Das Problem bei solchen Erreignis-Funktionen ist, dass diese auch bei Aktivitäten ausgelöst werden, die sich auf mehrere Zellen beziehen. D.h. je nach Aktion werden hier nicht nur einzelne Zell-Adressen, sondern auch Bereichs-Adressen übergeben z.B. "$D$4" oder "$A2$:$G$8" sowas in der Art, die z.B. auch die Adressen "$D$2:$D$8 beinhaltet. Um also Fehler zu vermeiden, wird Dir nix anderes übrigbleiben, als bei einer Änderung stets den gesamten Inhalt zu exportieren.
Gruß Dieter
Zu ersteinmal ist diese Funktion bei mehreren Blättern besser geeignet und der Code wird in "DieseArbeitsmappe" eingefügt:
Const Sheet1 = "Daten1"
Const Sheet2 = "Daten2"
Const Spalte = 4
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Sh Is Sheets(Sheet1) Or Sh Is Sheets(Sheet2) Then
'.................
End If
End Sub
Gruß Dieter
Hallo nochmal!
Du könntest auch diesen Code verwenden, der zumindest ermittelt, ob sich in der Spalte D etwas geändert hat:
Du könntest auch diesen Code verwenden, der zumindest ermittelt, ob sich in der Spalte D etwas geändert hat:
Const Sheet1 = "Daten1"
Const Sheet2 = "Daten2"
Const Spalte = 4
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim TestSpalteD As Range
If Sh Is Sheets(Sheet1) Or Sh Is Sheets(Sheet2) Then
Set TestSpalteD = Application.Intersect(Target, Range("D:D"))
If Not TestSpalteD Is Nothing Then
'....Daten exportieren.....
End If
End If
End Sub
Hallo Alexander!
Du könntest diesen Code mal testen. Allerdings funktioniert der nur, wenn die Daten-Sheets eine Überschrift-Zeile in Zeile 1 enthalten.
Konstanten entsprechend anpassen
Gruß Dieter
[edit] kleine Änderung (funktional aber wie vorher) [/edit]
Du könntest diesen Code mal testen. Allerdings funktioniert der nur, wenn die Daten-Sheets eine Überschrift-Zeile in Zeile 1 enthalten.
Konstanten entsprechend anpassen
Const Sheet1 = "Daten1"
Const Sheet2 = "Daten2"
Const Sheet3 = "Bestellen"
Const FilterRange = "D:D" 'Spalte D mit Leer/Inhalt
Const CopyZeileVon = 2 'Spalte D kopieren ab Zeile ?
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim Wks As Worksheet, TestSpalteD As Range, CopyZeileBis As Long, PasteZeileAb As Long
If Sh Is Sheets(Sheet1) Or Sh Is Sheets(Sheet2) Then
Set TestSpalteD = Application.Intersect(Target, Range(FilterRange))
If Not TestSpalteD Is Nothing Then
Set Wks = Sheets(Sheet3)
Application.ScreenUpdating = False
Wks.Cells.Clear
With Sheets(Sheet1)
.Rows(1).Copy Wks.Rows(1)
.Range(FilterRange).AutoFilter Field:=1, Criteria1:="<>", VisibleDropDown:=False
CopyZeileBis = .Cells(.Rows.Count, "D").End(xlUp).Row
PasteZeileAb = CopyZeileVon
.Rows(CopyZeileVon & ":" & CopyZeileBis).Copy Wks.Rows(PasteZeileAb)
.AutoFilterMode = False
End With
With Sheets(Sheet2)
.Range(FilterRange).AutoFilter Field:=1, Criteria1:="<>", VisibleDropDown:=False
CopyZeileBis = .Cells(.Rows.Count, "D").End(xlUp).Row
PasteZeileAb = Wks.Cells(Wks.Rows.Count, "D").End(xlUp).Row + 1
.Rows(CopyZeileVon & ":" & CopyZeileBis).Copy Wks.Rows(PasteZeileAb)
.AutoFilterMode = False
End With
Application.ScreenUpdating = True
End If
End If
End Sub
Gruß Dieter
[edit] kleine Änderung (funktional aber wie vorher) [/edit]
Hallo Alexander!
Zu Deiner zweiten Antwort habe ich im Moment keinen Plan und muss ich mir erst nochmal anschauen. Aber grundsätzlich besteht ja die Möglichkeit, die Aktualisierung während der Ausführung anderer Aktivitäten, wie beispielsweise der Suchfunktion, bis zu dessen Beendigung zu deaktivieren. Wäre jetzt mein erster Gedanke dazu
Gruß Dieter
Zitat von @midnightautomatic:
Das habe ich eigentlich auch schon fast hinbekommen, hatte aber Unregelmäßigkeiten, die ich mir nicht erklären
konnte. Deine Lösung gefällt mir sehr gut, weil auch die Performance vermutlich besser ist. Vielen Dank!
Die Performance sollte meines Erachtens turbomäßig sein.Das habe ich eigentlich auch schon fast hinbekommen, hatte aber Unregelmäßigkeiten, die ich mir nicht erklären
konnte. Deine Lösung gefällt mir sehr gut, weil auch die Performance vermutlich besser ist. Vielen Dank!
Zu Deiner zweiten Antwort habe ich im Moment keinen Plan und muss ich mir erst nochmal anschauen. Aber grundsätzlich besteht ja die Möglichkeit, die Aktualisierung während der Ausführung anderer Aktivitäten, wie beispielsweise der Suchfunktion, bis zu dessen Beendigung zu deaktivieren. Wäre jetzt mein erster Gedanke dazu
Gruß Dieter