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
1 2 3 4 5 6 7 | Dim i As Long
Cells(1, 1).Value = 1
For i = 2 To 5
Cells(i, 1).Value = Cells(i - 1, 1).Value + 3
Next
|
ginge auch so:
1 2 3 4 5 6 7 8 9 10 | Dim i As Long
Dim j As Long
j = 1
For i = 1 To 13 Step 3
Cells(j, 1).Value = i
j = j + 1
Next
|
oder so:
1 2 3 4 5 6 | Dim i As Long
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.
1 2 3 4 5 6 7 8 9 10 | Dim i As Long
i = 1
Cells(i, 1).Value = 1
Do
i = i + 1
Cells(i, 1).Value = Cells(i - 1, 1).Value + 3
Loop While Cells(i, 1).Value < 13
|
oder auch so:
1 2 3 4 5 6 7 | Dim i As Long
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | Sub Aufrufen()
Call Makro_von_Jemanden
End Sub
Sub Makro_von_Jemanden()
Call MsgBox( "Hallo du Typ!" , vbInformation)
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):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | Option Explicit
Sub Aufrufen()
Call Makro_von_Jemanden( "*Grunz* Du verdammt smarter Typ du!" )
End Sub
Function Makro_von_Jemanden(Parameter As String ) As Long
Call MsgBox(Parameter, vbInformation)
Makro_von_Jemanden = 42
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:
1 | 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:
1 | Cells(SchleifenIndex, 1).Value = BlaBlubb_ich_fixe_was_ich_im_Scraper_verbockt_habe(Worksheets( "Tabelle1" ).Range( "A" & SchleifenIndex))
|
Grüße
|