我有一个用户窗体 (Userform1),它有 4 个列表框 (ListBox1 到 4),其中都有条目。表单用户选择列表中的条目,然后点击命令按钮 (CommandButton_1)。然后,VBA 宏将每个列表框中的值写入 excel 日志表上的单元格中。用项目填充列表框并将结果写入电子表格的代码正在运行。
但是,我希望能够检查以确保所有列表框都有选择。在写入数据之前,必须始终填写所有选项,否则我们会在以后的分析中失去数据完整性。
我已经弄清楚了如何检查单个列表框是否没有选择,但我想将其概括为能够考虑任意数量的列表框。到目前为止,我尝试过:
'Attempt 1
For Each Control In Me.Controls
If Controls.Name Like "Listbox*" Then
If Controls.Value <> "" Then
Else: MsgBox ("You must select a value for every list.")
GoTo ERROR_ENDSUB
End If
End If
Next
A1 给我错误 438:Obect 不支持此属性或方法(如果 Controls.Name 行)。
'Attempt 2
Dim sh as Worksheet
Set sh = ThisWorkbook.Sheets("Downtime")
For i = 1 To 4
If "sh.listbox" & i & ".value" <> "" Then
Else: MsgBox ("You must select a value for every list.")
GoTo ERROR_ENDSUB
End If
Next
A2 根本不起作用,我可以将列表留空,但它仍然会在没有 Msgbox 的情况下写入数据。
'Attempt 3
Dim LB as ListBox
For i = 1 To 4
Set LB = ListBoxes("Listbox" & i)
If LB.Value <> "" Then
Else: MsgBox ("You must select a value for every list.")
GoTo ERROR_ENDSUB
End If
Next
A3 出现编译错误:未定义子函数或函数(突出显示的 Listboxes())。
如果我对 VBA 函数/方法的对象模型不是 100% 熟悉,请原谅我。我是一名化学工程师,以擅长 Excel(公式方面)而闻名,我的公司给我分配了越来越多的电子表格自动化任务。最终,这些任务变得太大了,过去一周左右,我一直在尝试学习 VBA,尽管我之前没有任何编码经验。
例如:
您可以尝试这个简单的代码
尝试 1 很接近。正如 Black Cat 在评论中提到的,您的迭代变量是,
Control
因此您需要写入If Control.Value <> "" Then
。尝试 2 有两个主要问题。首先,您没有循环遍历用户窗体的控件,而是尝试从工作表中访问某些内容。但是,您甚至没有这样做:您真正做的是将字符串“ sh.listbox1”与空字符串进行比较。
ListBoxes
尝试 3 引发了编译器错误,因为用户表单中不存在该集合(但工作表中存在该集合)。If
我强烈建议您更改and语句的语法和逻辑Else
。首先,不要让 If 分支为空,而只将代码放入 Else 分支。相反,请还原 If 条件:如果需要 Else 分支,请不要使用这种奇怪的语法,即使用引号在 之后直接添加第一个语句
Else
。这很丑陋,并且会使代码更难读。此外,请正确缩进代码:话虽如此:当您真的想检查控件的名称时,尝试 1(使用提到的更正)是可行的方法。但是,如果您使用编码进行处理,您将了解到最好重命名控件,并给它们起有意义的名字,例如、
lbCountry
或其他。在这种情况下,检查名称很容易失败。您应该考虑循环遍历控件并检查控件的类型。Tim Williams 的答案展示了如何做到这一点(检查控件的)。lbState
selectManager
TypeName