Excel VBA - 工作表公共成员不可用

时间:2016-05-20 21:31:58

标签: excel-vba vba excel

系统: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设置断点并检查本地窗口中的shtmemberVar确实是列为对象的成员。

那是什么给出的?我错了吗?看来,如果我将声明更改为MySub2(sht As Object),那么我不会得到错误,但这似乎是一个黑客,因为我已经确切地知道对象应该是什么类型。

1 个答案:

答案 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

可能已经足以让编译器闭嘴了。