Naja, das beantwortet meine Frage nicht ganz, aber man kann ein Prinzip erkennen. ;)
Nochmal die Zahlenreihenfolge 1 , 4 , 7 , 10 , 13 , 16 , 19 , 22 , 25 , 28
Diese Zahlenreihe zeichnet aus, dass das Folgeergebnis das vorherige Ergebnis plus 3 ist.
Ausgangszustand : 1
Schleifendurchgang 1: 1 + 3 = 4
Schleifendurchgang 2: 4 + 3 = 7
Schleifendurchgang 3: 7 + 3 = 10
Schleifendurchgang 4: 10 + 3 = 13
usw.
Wir haben also ein Muster erkannt: "Neues Ergebnis" = "Altes Ergebnis" + 3
Das als Schleife umzusetzen, nunja, da gibt es verschiedene Wege:
(1) Wenn man weiß wieviel Wiederholungen (in unserem Beispiel sind es 5 Zahlen), dann die Zählschleife
Dim i As Long
'Ausgabe: 1, 4, 7, 10, 13
Cells(1, 1).Value = 1 'Ausgangszustand
For i = 2 To 5 ' 1 + 5-2 = 4 ; Schleife wird 4 mal durchlaufen
Cells(i, 1).Value = Cells(i - 1, 1).Value + 3
Next
ginge auch so:
Dim i As Long
Dim j As Long
j = 1
'Ausgabe: 1, 4, 7, 10, 13
For i = 1 To 13 Step 3
Cells(j, 1).Value = i
j = j + 1
Next
oder so:
Dim i As Long
'Ausgabe: 1, 4, 7, 10, 13
For i = 1 To 5
Cells(i, 1).Value = 1 + (3 * (i - 1))
Next
(2) Mit der Do-Loop Schleife ginge das auch, die wird allerdings meist nur dann genommen, wenn man nicht weiß wie oft man den Teil in der Schleife wiederholen muss. Man kann mit ihr aber auch eine For-Schleife "nachbauen". Macht nur wenig Sinn / ließt sich auch nicht so schön, wenn man sie dafür missbraucht.
Dim i As Long
i = 1
'Ausgabe: 1, 4, 7, 10, 13
Cells(i, 1).Value = 1 'Ausgangszustand
Do
i = i + 1
Cells(i, 1).Value = Cells(i - 1, 1).Value + 3
Loop While Cells(i, 1).Value < 13 'solange wie das Ergebnis kleiner 13 ist
oder auch so:
Dim i As Long
'Ausgabe: 1, 4, 7, 10, 13
Do
i = i + 1
Cells(i, 1).Value = 1 + (3 * (i - 1))
Loop While Cells(i, 1).Value < 13
Es gibt sicher noch andere Wege diese Zahlenfolge zu erzeugen. Ich will dir hier nur klar machen dass es mehrere Möglichkeiten gibt.
Worauf es nur ankommt ist sich Gedanken darüber zu machen:
-
Kennt man die Anzahl der Schleifendurchgänge => For-Schleife
-
Kennt man die Anzahl der Schleifendurchgänge NICHT => Do-Loop
Zum zweiten Problem:
Ich habe dir ja eine Prozedur gegeben, die nur für ein Datensatz funktioniert. (was übrigens beabsichtigt war; wird dir immer mal wieder vorkommen)
Wenn es für einen funktioniert, funktioniert es in der Regel auch für mehrere, wenn man es an den richtigen Stellen anpasst.
Einfachstes Beispiel, welches mir in den Sinn kommt:
Sub Aufrufen()
Call Makro_von_Jemanden
End Sub
Sub Makro_von_Jemanden()
'<hier steht cool anzusehender Code von GastXY>
Call MsgBox("Hallo du Typ!", vbInformation)
'<oh wow, hier steht noch mehr cooler Code von GastXY>
End Sub
Jetzt willst du aber nicht - aus welchen Gründen auch immer - diese Meldung angezeigt bekekommen, sondern du willst sie beim Aufrufen der Prozedur anpassen.
Wir führen also eine neue Variable ein. Steht sie im Funktions-Kopf, nennt man das übrigends dann einen Parameter (Namen sind wie immer frei wählbar):
Option Explicit
Sub Aufrufen()
'Rückgabe der Funktion wird hier nicht verwertet
Call Makro_von_Jemanden("*Grunz* Du verdammt smarter Typ du!")
End Sub
'Aus der Sub (=Prozedur) wurde hier eine Funktion gemacht.
'Eine Funktion hat, gegenüber einer Sub, einen Rückgabewert.
'Den Datentyp der Funktions-Rückgabe kann man festlegen - hier z.B. Long
Function Makro_von_Jemanden(Parameter As String) As Long
'<hier steht cool anzusehender Code von GastXY - unverändert von mir>
Call MsgBox(Parameter, vbInformation)
'<oh wow, hier steht noch mehr cooler Code von GastXY - unverändert von mir>
'Funktionsrückgabe
Makro_von_Jemanden = 42 'hier einfach als Beispiel eine Zahl
End Function
Worum es also nun letztendlich geht ist:
-
Schleife bauen, die eine Zahlenreihe erzeugt, welche den Zeilenindex einer Zelle repräsentiert (oben geklärt)
-
innerhalb der Schleife das Makro von weiter oben im Thema aufrufen, welches den Scrapper-Fauxpas korrigiert; dafür muss ein Parameter definert werden und in dem genannten Makro an die Stelle gesetzt werden, wo er benötigt wird (siehe Beispiel oben)
In der Schleife schaut es also z.B. so aus:
Call BlaBlubb_ich_fixe_was_ich_im_Scraper_verbockt_habe(Worksheets("Tabelle1").Range("A" & SchleifenIndex))
Wenn du aus der Prozedur eine Funktion machst und du die Funktion den korrigierten Ausdruck zurückgeben läßt (der derzeit in Zelle A5 geht), dann kannst du z.B. schreiben:
Cells(SchleifenIndex, 1).Value = BlaBlubb_ich_fixe_was_ich_im_Scraper_verbockt_habe(Worksheets("Tabelle1").Range("A" & SchleifenIndex))
Grüße
|