当我点击命令button1时,我得到了
run时间错误'424':必需对象
以突出显示的一行。当我评论整个子并在commandbutton1_click()事件中发表代码线时,它起作用。是lbxAccounts对象对模块中存储的子存储1不可见? 即除了包含对象的用户形模块以外的任何模块?
i我尝试将
build_query_string
例如:如果您希望在常规模块中使用代码来访问用户形式的控件,那么最强大的方法是将用户形式实例传递给常规模块中的调用方法。
在UserForm1中
Dim lbxAccounts as Object
在常规模块中
Sub CommandButton1_Click()
TheCalledsub Me 'here `Me` is the running instance of UserForm1
End Sub
您的错误来自以下事实:
Sub TheCalledsub(frm as UserForm1)
Debug.Print frm.lbxAccounts.Value 'use `frm` to access `lbxAccounts`
End Sub
是用户形式上的对象(类型ListBox的对象)。当您在表单中编写代码(例如,在点击事件中)和访问lbxAccounts
lbxAccounts
是未知的。不幸的是,您没有使用
lbxAccounts
(您应该始终要做!!!),否则您已经从编译器那里收到了错误消息,告诉我有问题。 您可以在表单代码之外访问ComboBox,但是您需要告诉VBA编译器您想通过指定
object.。
Option Explicit
编译器知道您要访问名为
Debug.Print UserForm1.lbxAccounts.Value
如果您熟悉OOP,您将认识到您从未定义使用名称
UserForm1
的bobject。您仅定义具有该名称的表单,并且表单是类,而不是对象。使用
UserForm1
作为对象是VBA的专业:如果该名称没有对象变量,它将即时创建一个,称为
“默认对象”。这通常可以正常工作,但是它有气味,在更复杂的情况下,它会导致令人惊讶的效果和讨厌的虫子。端是通过您自己创建对象:
UserForm1
但是现在您还有另一个问题:在您的日常工作中,Sub ShowForm
Dim frm As UserForm1
Set frm = new UserForm1
frm.Show
End Sub
Sub build_query_string
Debug.Print frm.lbxAccounts.Value ' Will not work!
End Sub
是未知的,因为它被定义为局部变量。为了解决这个问题,您需要将变量build_query_string
声明为模块中的全局变量。也有气味...
如果我是您,我会在模块中避免使用该代码,完全访问用户形式。而是将搜索字符串从表单传递到例程中。实际上,
frm
shoud不在乎绳子的来源。
表格:
frm
sub的定义:
build_query_string
用与ListBox相同的名称的变量删除,因为它是一个完全不同的对象,仅具有相同名称。由于您没有分配任何内容,您将再次获得424错误。