我有一个名为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
答案 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)
它说:
如果
counter
的范围不是程序的本地范围,则是编译时 警告发生。
所以在这里讨论不多,它只是MS想要它的方式。虽然我认为如果范围大于程序,它不应该引起任何问题,但显然它确实存在。