迭代集合(VBA)

时间:2014-07-25 18:33:44

标签: excel vba variables excel-vba foreach

您好我是VBA的新手,我正在尝试迭代我制作的集合并为每个值执行操作。

这是我的代码:

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

我一直在收到错误:

For Each y As Object in rows

它一直亮黄色,但当我删除上面的行时会出现以下错误:

For Each control variable must be Variant or Object

有人可以解释为什么不让我迭代价值观吗? 声明变量的整个问题对我来说都是新的。 谢谢!

2 个答案:

答案 0 :(得分:7)

y声明为Variant,即:

Dim y As Variant

并改变你的循环:

For Each y In rows

然后循环将起作用,或者至少,它不会在那个点给你一个错误。

但是下一个问题/错误是在循环内部。这一行:

rows(y).Delete

会给你一个错误“需要对象”或类似的东西,因为rows(y)会返回一个整数,所以你不能在它上面调用Delete。这里有一些混淆,因为rows本身就意味着活动工作表的Rows范围。但您也将您的收藏命名为rows,因此存在命名冲突。

将您的rows重命名为myrows,然后它应该全部有效。但是,我不知道你要对Delete行做什么,所以我不能进一步建议。

答案 1 :(得分:2)

您的声明和使用中存在冲突。这一行明确声明yInteger

Dim y As Integer  

但是您尝试将其用作Object,或者使用

For Each y As Object in rows  

For Each y in rows

将声明更改为

Dim y As Object

(我对VBA并不熟悉。如果上述方法不起作用,请将声明更改为Dim y As Variant。)