Moin, sorry ganz vergessen.
Tasten wir uns einfach mal langsam heran.
Code:
Dim Kundenname As String
Dim Kundennr As String
Dim Rechnungsnr As String
Dim Rechnungsdatum As String
Dim Leistung As String
Dim Gesamtbetrag As String
Definition der Variablen: Ok! Allerdings brauchen wir die nicht wirklich.
Code:
Worksheets("test").Select
Wählen des Worksheets: Ok! Du führst die Methode
Select auf das Objekt
Worksheet aus. Damit "klickt" man die Zelle sozusagen an.
Aber, du kannst auch einfach aus jedem Sheet direkt auf Werte eines anderen Sheets zugreifen. Allerdings nicht mit Select, denn eine Zelle in einem nicht aktiven Sheet kann man auch nicht anklicken.
Das sieht dann so aus: Geschmacksache ist, ob man per Objekt.Range(...) oder Objekt.Cells(Zeilennummer, Spaltennummer) auf die Zellen zugreift. Wenn man zählen oder durchlaufen will, ist Zweites besser.
Beispiel:
Code:
Kundenname = Worksheets("test").Cells(14,2)
Kundennr = Worksheets("test").Cells(14,3)
Rechnungsnr = Worksheets("test").Cells(14,4)
Rechnungsdatum = Worksheets("test").Cells(14,5)
Leistung = Worksheets("test").Cells(14,6)
Gesamtbetrag = Worksheets("test").Cells(14,7)
Code:
Worksheets("Auswertung").Select
Worksheets("Auswertung").Range("A6").Select
If Worksheets("Auswertung").Range("A6").Offset(1, 0) <> "" Then
Worksheets("Auswertung").Range("A6").End(xlDown).Select
End If
So, hier wählst du im Sheets Auswertung die Zelle A6 aus und prüfst dann ob die Zelle darunter ungleich einem Leerstring ist. (Vorsicht, wenn eine Formel in der Zelle unter A6 steht, deren Ergebnis leer ist, bspw. "Wenn heute die Sonne scheint, dann Zelle leer" wird diese Auswertung immer richtig ausgeben, da die Formel in der Zelle steht, sie ist also <> "".)
Ist das Ergebnis der Prüfung wahr, dann markierst du von der Zelle A6 nach unten, nach der Methode End(xlDown). Diese arbeitet wie STRG + Pfeil unten.
Jetzt wirds ein wenig komplexer:
Code:
ActiveCell.Offset(1, 0).Select
Ausgehend von der aktiven Zelle (das ist die Zelle die ausgehend von A6 durch STRG + Pfeil unten markiert wurde), füllst du die darunter liegende Zeile mit Werten.
Code:
ActiveCell.Value = Rechnungsnr
Und so weiter. Danach endet dein Skript.
Erstmal nicht schlecht, doch wo liegt jetzt der eigentliche Fehler? Das lässt sich am einfachsten nachvollziehen, wenn man das Skript debugged. Also mit F8 im VBA Editor das Skript Zeile für Zeile durchlaufen und schauen was es tut. Lange Rede kurzer Sinn:
Code:
Worksheets("Auswertung").Range("A6").Select
If Worksheets("Auswertung").Range("A6").Offset(1, 0) <> "" Then
Worksheets("Auswertung").Range("A6").End(xlDown).Select
End If
Hier. Zelle A7 ist nicht leer. Ausgehend von A6 drücken wir STRG + Pfeil unten und landen in A7. Jedes mal. Und diese Zeile befüllst du. Du überschreibst also jedes Mal die Zeile 7. Verstanden?
Hier alles oben genannte mal neu geschrieben. Und ein wenig umgestellt:
Code:
Sub asdf()
Const StartZeileZiel = 7 'Die Zeilennummer der ersten Zeile mit Inhalt im Sheet "Auswertung", einfach als Konstante
Const StartZeileQuelle = 14 'Die Zeilennummer der ersten Zeile mit Inhalt im Sheet "Test"
Dim NeueZeile As Integer 'Variable für die neu zu schreibende Zeile
If Worksheets("Auswertung").Cells(StartZeileZiel, 1) <> "" Then 'Prüfen ob allererste Zeile
If Worksheets("Auswertung").Cells(StartZeileZiel + 1, 1) <> "" Then 'Prüfen ob zweite Zeile
NeueZeile = Worksheets("Auswertung").Cells(StartZeileZiel, 1).End(xlDown).Row + 1 'Ausgehend von der in der Konstanten genannten Zeile per End nach unten findet die letzte befüllte Zeile. .row gibt die Zeilennummer zurück.
Else
NeueZeile = StartZeileZiel + 1
End If
Else
NeueZeile = StartZeileZiel 'Die allererste Zeile soll bitte in Zeile 7 stehen, wie in der Konstanten genannt
End If
Worksheets("Auswertung").Cells(NeueZeile, 1).Value = Worksheets("Test").Cells(StartZeileQuelle, 2).Value 'Direkt füllen von Ziel aus Quelle
Worksheets("Auswertung").Cells(NeueZeile, 2).Value = Worksheets("Test").Cells(StartZeileQuelle, 3).Value
Worksheets("Auswertung").Cells(NeueZeile, 3).Value = Worksheets("Test").Cells(StartZeileQuelle, 4).Value
Worksheets("Auswertung").Cells(NeueZeile, 4).Value = Worksheets("Test").Cells(StartZeileQuelle, 5).Value
Worksheets("Auswertung").Cells(NeueZeile, 5).Value = Worksheets("Test").Cells(StartZeileQuelle, 6).Value
End Sub
Warum jetzt zwei if-Abfragen?
Das liegt an der zu schlauen Umsetzung von STRG + Pfeil unten. Ist nämlich die letzte gefüllte Zelle markiert und wir drücken STRG + Pfeil unten, dann springt Excel zur letzten Zeile im Sheet. Ist allerdings die vorletzte gefüllte Zelle markiert, springt man damit in die letzte gefüllte Zeile. Denn STRG + Pfeil unten wählt eben nicht brav die letzte gefüllte Zelle aus sondern reagiert auf den Kontext der aktuellen Zelle.
Fragen? Immer raus damit.