2014-07-25 23 views
5

Hallo Ich bin neu in VBA und ich versuche, über eine Sammlung iterieren und eine Aktion für jeden Wert ausführen.Iterieren über eine Sammlung (VBA)

Hier ist mein Code:

Sub makeRowsMatch() 

Dim rows As VBA.Collection 
Set rows = New VBA.Collection 

Dim i As Integer 
Dim j As Integer 
Dim y As Integer 


For i = 2 To 22203 
For j = 2 To 121 

If Cells(i, 2).Value <> Cells(j, 38) Then 
    rows.Add (i) 

End If 

Next j 
Next i 


For Each y As Object in rows 
rows(y).Delete 

Next y 

End Sub 

Ich halte auf einen Fehler in der Leitung bekommen:

For Each y As Object in rows 

Es auf hält gelb hervorgehoben zu werden, aber wenn ich die obige Zeile entfernen, ist das erhalten folgender Fehler:

For Each control variable must be Variant or Object 

Könnte jemand erklären, warum es mich nicht über die Werte iterieren lässt? Die ganze Frage des Erklärens von Variablen ist neu für mich. Danke!

+0

Ich glaube nicht, dass Sie in VBA wie folgt Schleife können. Anstatt "Für jedes y als Objekt in Reihen", oben, "Dim y als Variante" und Ihre Schleife kann sein "Für jedes y in Reihen" – sous2817

Antwort

7

Declare y als Variant, das heißt:

Dim y As Variant 

und Ihre Schleife dies wie ändern:

For Each y In rows 

arbeiten Dann wird die Schleife oder zumindest wird es nicht einen Fehler, bei dass Punkt.

Aber das nächste Problem/Fehler ist innerhalb der Schleife. Diese Zeile:

rows(y).Delete 

wird Ihnen eine Fehlermeldung „Objekt erforderlich“, oder so ähnlich, weil rows(y) Rückkehr eine ganze Zahl, so können Sie Delete auf nicht nennen. Es gibt einige Verwirrung hier, weil rows allein den Rows Bereich des aktiven Blattes bedeutet. Aber Sie haben Ihre Sammlung auch als rows bezeichnet, daher gibt es einen Namenskonflikt.

Benennen Sie Ihre rows um zum Beispiel myrows und es sollte dann alles funktionieren. Allerdings weiß ich nicht, was Sie mit der Delete Linie zu tun versuchen, so kann ich nicht weiter beraten.

2

Sie haben einen Konflikt in Ihren Erklärungen und verwenden. Diese Linie erklärt y als Integer, klar:

Dim y As Integer 

Aber man dann versuchen, es als Object zu verwenden, entweder mit

For Each y As Object in rows 

oder

For Each y in rows 

Ändern Sie die Erklärung zu

Dim y As Object 

(Ich bin nicht so vertraut mit VBA. Wenn das obige nicht funktioniert, ändern Sie stattdessen die Deklaration in Dim y As Variant.)