类变量作为VBA中For循环的计数器

时间:2018-06-01 06:01:49

标签: vba

我有一个名为MyClass的类模块,其中包含一个公共整数:

Public i as Integer

当我尝试在For循环中使用此变量时,如下所示:

Dim MyInstance as MyClass: Set MyInstance = New MyClass
For MyInstance.i = 1 To 10
    Debug.Print "Hello"
Next

我收到错误:需要变量。无法指定此表达式

我咨询了help page,但看不出它如何适用于我的情况。相关片段是:"您试图在For...Next构造中使用非变量作为循环计数器。使用变量作为计数器。"但i毕竟是一个变量,而不是Let Property函数或任何其他表达式。

代码有什么问题?

编辑:我应该指出,我希望我的迭代器成为该类的一部分的原因是我有多个类的实例,在我的项目中提供不同的用途,并且有多个每个类实例的嵌套For循环。因此,值得让迭代器属于它们各自的对象,比如说:

For Client.i = 1 To Client.Count
    For Order.i = 1 To Order.Count
        For Item.i = 1 To Item.Count

我已经解决了以下解决方法,但仍然不完全满意:

For ciii = 1 To Client.Count
    Client.i = ciii ' Client.i is later used in the code
    For oiii = 1 To Order.Count
        Order.i = oiii
        For iiii = 1 To Item.Count
            Item.i = iiii

4 个答案:

答案 0 :(得分:4)

如果您想要一个可公开访问的循环变量,请将其粘贴在标准模块的顶部,即将Public i声明为标准模块的顶部。

请注意,这意味着您需要重新编写标准模块代码,因为根据第2点,您将i视为该类的属性/方法。

因此,标准模块代码为:

Public i As Long

Sub ........

   For i = 1 To 10
       Debug.Print "Hello"
   Next i

End Sub ......

如果您希望它以某种方式成为属性/方法,那么您需要在类中定义Getters和Setters(可能)。然后相应地重新编写模块代码。特别是如果你打算使用i进行循环,你需要在类中使用incrementor方法。

是的,我把我改为Long,因为在这种情况下,我认为将其声明为Integer是没有优势的。为避免潜在的溢出,Long是一个更安全的赌注。

答案 1 :(得分:4)

您不能将MyInstance.i用作增量计数器,但可以将其用作终结符;例如对于i = 1到MyInstance.i。

MyClass类

Option Explicit

Public pi As Long

Public Property Get i() As Long
    i = pi
End Property

Public Property Let i(Value As Long)
    pi = Value
End Property

在Module1中测试子程序

Sub test()
    Dim MyInstance As MyClass, i As Long
    Set MyInstance = New MyClass
    MyInstance.i = 10
    For i = 1 To MyInstance.i
        Debug.Print "Hello"
    Next
End Sub

答案 2 :(得分:3)

如果您需要一个解决方法以便迭代实例的属性,您可以创建一个方法来递增它,将循环更改为Do While ... Loop并在循环调用之前调用该方法。

'Class Module
Option Explicit

Public i As Integer

Public Sub increment_i()
i = i + 1
End Sub

Private Sub Class_Initialize()
i = 0
End Sub
'Module
Sub loop_myclass()

Dim instance As MyClass: Set instance = New MyClass

Do While instance.i <= 10
'Instance property dependent code here
    Debug.Print instance.i
    instance.increment_i
Loop

End Sub

答案 3 :(得分:1)

好的,我找到了答案。关于VB有a Microsoft help page on For…Next loop,但我认为它也适用于VBA。

它说:

  

如果counter的范围不是程序的本地范围,则是编译时   警告发生。

所以在这里讨论不多,它只是MS想要它的方式。虽然我认为如果范围大于程序,它不应该引起任何问题,但显然它确实存在。