Hallo,
zuerst solltest Du Dich ein wenig mit VBA auseinandersetzen und die Grundlagen lernen.
Eine Function unterscheidet sich von einer Sub dadurch, dass eine Function Werte zurückgeben kann und auch (sofern nicht private) im Tabellenblatt als Funktion aufgerufen werden kann. Das was Du machst ist eigentlich eine Sub.
Dein Konstrukt aus sprung: und goto ist ziemlich seltsam. Eine Schleife mit For ... next oder do ... while wäre hier sicher sinnvoller, zumindest leichter verständlich.
Select (z. B. Cells(i, 1).Select oder Sheets("Übersicht").Select) macht Excel/VBA langsam, ist idR unnötig und fehleranfällig. Es sollte daher vermieden werden! Man kann die Blätter/Zellen auch direkt ansprechen. Wenn Du Dir Tipparbeit sparten willst, kannst Du z. B. With verwenden und/oder eine Variable verwenden. z. B.:
Cells(i, 1).Select
Sheets("Roadmap").Cells(j, 3).Value = ActiveCell.Value
Kann auch so geschrieben werden:
Sheets("Roadmap").Cells(j, 3) = Sheets("Übersicht").Cells(i, 1)
Ein EndIf scheint mir zuviel (das zweite in Deinem Code) - eigentlich müsstest Du eine Fehlermeldung bekommen.
Nun zu Deinem Problem: Du hast in der Do ... While-Schleife als Bedingung IsEmpty = false and Rows(i).Hidden = False stehen. Das heißt, die Schleife läuft nur solange Werte in Spalte 1 stehen und die jeweilige Zeile nicht ausgeblendet ist. Dann ist Ende. Ich würde hier die Anzahl der Zeilen ermitteln und eine For ... Next-Schleife verwenden um über alle Zeilen zu gehen. In der Schleife kannst Du dann Deine Bedingungen abfragen.
Hier kannst Du sehen, wie man die letzte Zeile ermittelt (Version 1c wird als Standard vorhgeschlagen, würde ich auch so sehen):
http://www.excel-inside.de/vba-loesungen/zellen-a-bereiche/337-letzte-zeile-letzte-spalte-und-letzte-zelle-per-vba-ermitteln
Gruß
Steuerfuzzi
|