AW: Daten aus Worksheets ziehen
24.03.2023 10:20:26
Mathias
Hallo Maya,
tut mir leid, dass ich erst heute antworte. Ich habe gestern übersehen, dass du geantwortet hattest.
Also ich habe es jetzt so verstanden, dass du in den Blättern jeweils eine Art Beleg hast. Die Belege haben einen Art Kopf in dem die meisten Informationen stehen, die du möchtest. Dieser Kopf ist immer gleich aufgebaut (Jeder Wert in einer bestimmten Zelle). Lediglich die Summe kann (aufgrund unterschiedlicher Anzahl von Positionen im Beleg) in verschiedenen Zeilen stehen. Jedoch immer in der gleichen Spalte.
Dementsprechend habe ich ein kleines Makro für dich geschrieben:
Option Explicit
Sub Erstelle_Liste()
Application.ScreenUpdating = False 'Schaltet ScreenUpdate AUS, wärend das Makro läuft (dadurch wird das Makro schneller)
Dim myList As Worksheet
Set myList = ThisWorkbook.Worksheets("Liste") 'Setzt das Tabellenblatt mit der Ziel-Liste in eine Variable
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets 'Durchläuft alle Tabellenblätter in dieser Arbeitsmappe
If Not ws Is myList Then 'Führt den folgenden Code nur aus, wenn das Blatt nicht das Ziel-Blatt ist
Dim neueZeile As Long
neueZeile = myList.Cells(Rows.Count, 1).End(xlUp).Row + 1 'Setzt die Nummer der nächsten leeren Zeile in der Ziel-Liste
myList.Cells(neueZeile, 1).Value = ws.Name 'Schreibt den Namen des Tabellenblatts in die erste Spalte
myList.Cells(neueZeile, 2).Value = ws.Cells(2, 3).Value 'Füllt die Spalten mit den entsprechenden Werten
myList.Cells(neueZeile, 3).Value = ws.Cells(5, 3).Value
myList.Cells(neueZeile, 4).Value = ws.Cells(6, 4).Value
myList.Cells(neueZeile, 5).Value = ws.Cells(10, 4).Value
myList.Cells(neueZeile, 6).Value = ws.Cells(5, 5).Value
Dim i As Long
For i = 13 To 100 'Durchläuft die Zeilen im Bereich der angegebenen Nummern
If ws.Cells(i, 4).Text = "Summe" Then 'Schaut, ob in der aktuellen Zeile in der entsprechenden Spalte der entsprechende Text steht
myList.Cells(neueZeile, 7).Value = ws.Cells(i, 5).Value 'Schreibt den Wert aus der entsprechenden Zeile in die Ziel-Liste
Exit For 'Beendet die "For"-Schleife, da der entsprechende Eintrag bereits gefunden ist
End If
Next
End If
Next
Application.ScreenUpdating = True 'Schaltet ScreenUpdate wieder EIN
End Sub
Dieses Makro durchläuft alle Blätter und fügt bestimmte Werte in eine neue Zeile in deiner Liste.
Die Werte für "B" bis "F" werden aus einer bestimmten Zelle entnommen.
Es wird in Spalte "D" von Zeile 13 bis 100 geschaut, ob dort "Summe" steht. Falls das Makro in diesem Bereich fündig wird, so wird der Wert aus der gleichen Zeile aus Spalte "E" genommen um diesen in deine Liste Spalte "G" zu schreiben.
Ich suche jetzt erst ab Zeile 13 war ich davon ausgehe, dass dies die erste mögliche Zeile ist, wenn der Beleg nur eine Position hat.
Du kannst diese Nummer aber auch ändern. (1 wäre auch möglich)
100 habe ich jetzt angenommen, weil du dies in den Raum gestellt hast. diese Zahl kannst du auch ändern.
Da die Schleife unterbrochen wird, wenn das Makro fündig wurde, kann dort auch eine größe Zahl verwendet werden, ohne dass das Makro langsamer wird.
Maximal darf dort das Maximum stehen, was ein Tabellenblatt an Zeilen haben kann (Rows.Count (entspricht: 1048576)).
Du müsstest nur den Namen des Tabellenblatts oben angeben, in dem deine Liste ist.
Sollten andere Werte auch in der Zeile variable sein, so kann man dort auch eine "Such-Schleife" drum bauen.
Es ist auch möglich die korrekte Spalte zu suchen.
Ich hoffe, dass dies nun weiter hilft.
Kannst aber gern nochmal nachfragen, wenn noch was unklar ist oder etwas nicht richtig funktioniert.
Liebe Grüße
Mathias