Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 通过变量访问子控件_Vba - Fatal编程技术网

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还不熟悉。