我的UserForm1有一个名为lbxAccounts的列表框。在某一时刻,选择哪个帐户(lbxaccounts.value)将被读取为字符串变量。

问题描述 投票:0回答:2
我运行userform1。它编译。帐户名被加载到lbxaccounts中。我选择其中一个帐户名称。

当我点击命令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
excel vba
2个回答
1
投票
lbxAccounts

是未知的。不幸的是,您没有使用

lbxAccounts

(您应该始终要做!!!),否则您已经从编译器那里收到了错误消息,告诉我有问题。 您可以在表单代码之外访问ComboBox,但是您需要告诉VBA编译器您想通过指定

object
.

Option Explicit

编译器知道您要访问名为
Debug.Print UserForm1.lbxAccounts.Value

1
投票

如果您熟悉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错误。
    

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.