系统:Excel 2013; Windows 7 Pro x64
我在访问vba代码中的工作表的公共成员时遇到了一个奇怪的问题。
以下是要复制的最小代码。
Sheet1(常规)vba代码
Public memberVar As Integer
MyModule vba代码
Sub MySub()
MySub2 Sheet1
End Sub
Sub MySub2(sht As Worksheet)
Dim foo As Integer
foo = 1
sht.memberVar = foo
End Sub
当我从立即窗口运行MySub
时,出现以下错误:
MySub2中第三行的“编译错误:找不到方法或数据成员”,引用sht.memberVar
对我来说,奇怪的一点是,如果我注释掉sht.memberVar = foo
行并在foo = 1
设置断点并检查本地窗口中的sht
,memberVar
确实是列为对象的成员。
那是什么给出的?我错了吗?看来,如果我将声明更改为MySub2(sht As Object)
,那么我不会得到错误,但这似乎是一个黑客,因为我已经确切地知道对象应该是什么类型。
答案 0 :(得分:1)
sht
被输入为“通用的,非特定的”工作表。但是,Sheet1
是一个“特殊”工作表,其中包含一个名为memberVar
的属性。 sht
将与Sheet1
一起运行的事实将仅在运行时期间被动,即动态地知道。你可以最好地想象这一点,假设周围有另一个子,其定义如下:
Sub UglySub()
MySub2 Sheet2
End Sub
启动代码时,您正在编译VBA脚本 - 并且您声称在“通用的,非特定的”工作表中存在属性memberVar
- 这不成立。因此编译/启动代码时出现错误消息。
当您对分配进行注释并将类型修改为Object
时(这不是必需的,因为Worksheet同样好),您将从静态设计时间转移到运行时。编译器通过,然后您将观察运行时情况。
IIRC,工作表不仅仅是变量的全局标识符,还可以用于类型位置。所以
Sub MySub2(sht As Sheet1)
Dim foo As Integer
foo = 1
sht.memberVar = foo
End Sub
可能已经足以让编译器闭嘴了。