Vba 通过变量访问子控件
下面的代码是我正在尝试执行的操作的简化版本,包含在一个模块中,我在Vba 通过变量访问子控件,vba,Vba,下面的代码是我正在尝试执行的操作的简化版本,包含在一个模块中,我在此工作簿的公共子工作簿的中设置了InputSheet=Sheets(“输入”): Option Explicit Public InputSheet As Worksheet Public Sub Populate() InputSheet.ListBox2.AddItem "Test" 'doesnt work Sheets("Input").ListBox2.AddItem "Test2" 'works
此工作簿的公共子工作簿的中设置了InputSheet=Sheets(“输入”)
:
Option Explicit
Public InputSheet As Worksheet
Public Sub Populate()
InputSheet.ListBox2.AddItem "Test" 'doesnt work
Sheets("Input").ListBox2.AddItem "Test2" 'works
End Sub
如注释所示,Populate()
中的第一行不工作,第二行工作正常。我在第一行遇到的错误是未找到方法或数据成员
。有人能给我指出正确的方向吗?这似乎与我正在使用全局变量这一事实无关,因为如果我这样做:
Dim InputSheet2 As Worksheet
Set InputSheet2 = Sheets("Input")
InputSheet2.ListBox2.AddItem "Test"
它也有同样的问题。在第一个示例中,InputSheet尚未初始化,设置为Nothing。在输入表之前…添加“测试”项,包括:
Set InputSheet = Sheets("Input")
这还假设您有一个名为“Input”的工作表,“Input”工作表有一个名为“ListBox2”的列表框
编辑:
不确定Excel VBA为何以这种方式工作,但看起来您无法以这种方式引用子对象。我可以通过使用InputSheet.OLEObjects使它工作。。。为了使其更清晰,我将其指定给ListBox对象:
Public InputSheet As Worksheet
Private Sub Workbook_Open()
Set InputSheet = Sheets("Sheet1")
End Sub
Public Sub Test()
Dim MyBox As ListBox
Set ListBox = InputSheet.OLEObjects("ListBox2").Object
ListBox.AddItem Now()
End Sub
不过,我确实体验到了全局变量的一些片状。似乎当我遇到错误时,InputSheet对象将恢复为空,我必须关闭/重新打开工作簿才能重新分配该值。我可以确认它是按照您所说的方式发生的。我也不知道为什么会这样,但我可以猜。当您使用工作表(“输入”)
时,库从一个通用工作表类开始,然后在更具体的工作表类中结束。但是对于InputSheet
,您已经在工作表类中(您在设置变量时查看了工作表,但不是现在)
因此,我猜想有一个bug/特性,其中ListBox自动实例化属性只是Sheet类的一部分,而不是Workbench类的一部分。ActiveX控件位于工作表上方的一个层上,因此有管道将工作表连接到ActiveX控件,但它们的绑定不像UI中显示的那样紧密
你有几个选择,没有一个是你想要的。第一,当然,是使用你的第二行。否则你可以用
Public InputSheet As Object
这将迫使VBA计算对象类型并遍历图纸类。或者你可以这样做
InputSheet.OLEObjects("ListBox2").Object.AddItem "Test3"
在我看来,最好的方法是更改工作表的代码名并使用它——自动实例化属性将使用它。但我意识到你简化了这一点,这可能对你不起作用。请再次阅读我的整个问题,我说我正在公共子工作簿中初始化InputSheet_Open()
,在我的第二个代码块中,我正按照你的建议(声明、设置和使用另一个变量)进行测试,这也不行,我道歉。我错过了那句话。非常感谢,我更改了工作表的Name属性,这样我就可以用它来代替工作表(“SheetName”)。我知道这一定很简单,但我对VBA还不熟悉。