Hallo,
Mühsam ernährt sich das Eichhörnchen. Aber Du machst Fortschritte, der Code schaut schon viel besser aus. Und Rom wurde ja schließlich auch nicht an einem Tag erbaut.
Ich würde tatsächlich eine SUB verwenden. Diese kann man auch im Coder aufrufen:
Call daten_löschen
Call daten_übertragen
Eine Function würde ich nur verwenden, wenn ein Wert auch wirklich zurückgegeben wird.
In der folgenden if-Abfrage erhöst Du i sowohl in der if als auch in der else, daher kannst Du das i = i + 1 auch nur einmal außerhalb schreiben, da es sowieso bei jedem Durchlauf erhöht wird:
If Rows(i).Hidden = True Then 'wenn Zellen ausgeblendet, dann überspringen aber mitzählen
i = i + 1
ElseIf Rows(i).Hidden = False Then 'wenn Zellen nicht ausgeblendet, dann
Sheets("Roadmap").Cells(j, 3).Value = Sheets("Übersicht").Cells(i, 1)
If Cells(i, 2) = "abc" Then 'Wenn Zelle = "abc", übertrage den Wert "1" in Zielzelle in "Roadmap"
Sheets("Roadmap").Cells(j, 2).Value = "1"
ElseIf Cells(i, 2) = "def" Then
Sheets("Roadmap").Cells(j, 2).Value = "3"
End If
i = i + 1 'Zellen in "Übersicht" und "Roadmap" um jeweils 1 erhöhen
j = j + 1
End If
Zudem prüfst Du ja nur zwei Zustände (True oder False) und nachdem du bei true nur i erhöst, reicht stattessen folgender Code:
If Rows(i).Hidden = False Then 'wenn Zellen nicht ausgeblendet, dann
Sheets("Roadmap").Cells(j, 3).Value = Sheets("Übersicht").Cells(i, 1)
If Cells(i, 2) = "abc" Then 'Wenn Zelle = "abc", übertrage den Wert "1" in Zielzelle in "Roadmap"
Sheets("Roadmap").Cells(j, 2).Value = "1"
ElseIf Cells(i, 2) = "def" Then
Sheets("Roadmap").Cells(j, 2).Value = "3"
End If
j = j + 1
End If
i = i + 1 'Zellen in "Übersicht" und "Roadmap" um jeweils 1 erhöhen
Wenn Du mehrere Inhalte außer abc und def abfragen möchtest, würde ich Dir statt if ... then eher Select ... Case empfehlen, siehe z. B. hier: http://www.office-loesung.de/ftopic177172_0_0_asc.php
Die Zeile
Sheets("Übersicht").Select
kannst Du Dir sparen, wenn Du bei allen Zugriffen auf das Activesheet (bzw. wenn nichts davor steht) das Sheets("Übersicht"). voranstellst. Also z. B. statt
Do While IsEmpty(Cells(i, 1)) = False
...
If Rows(i).Hidden = True Then
...
If Cells(i, 2) = "abc" Then
...
schreibst Du:
Do While IsEmpty(Sheets("Übersicht").Cells(i, 1)) = False
...
If Sheets("Übersicht").Rows(i).Hidden = True Then
...
If Sheets("Übersicht").Cells(i, 2) = "abc" Then
...
Das ist wesentlich leichter zu lesen, da Du nicht immer im Code suchen musst, welches Sheet gerade aktiv ist. Schließlich ist das Sheet ja direkt bestimmbar und nicht variabel.
Theoretisch kannst Du das ganze auch mit Variablen lösen:
Dim Roadmap as Worksheet
Dim Übersicht as Worksheet
Set Roadmap = Sheets("Roadmap")
Set Übersicht = Sheets("Übersicht")
dann kannst Du mit den Variablen auf die Blätter zugreifen, z.B.:
Roadmap.Cells(i, 1)
Übersicht.Cells(j, 3)
Grüße
Steuerfuzzi
|