【问题标题】:VBA Excel Error 424 with collection object reference带有集合对象引用的 VBA Excel 错误 424
【发布时间】:2014-09-22 19:44:38
【问题描述】:

所以我正在创建一个收集数据并使用该数据生成报告的用户表单。有很多问题要问用户。具体来说,此表格上的测试题块是相同的。许多存在以便用户可以在表单上输入有关许多测试的信息。我对 VBA excel 比较陌生,我不知道如何为所有重复的问题块制作一个类模块。因此,我做了 8. 每个块中的问题都用一个数字命名,例如:TestType1_ComboBox、TestType2_ComboBox 等等。

是的,我意识到这是非常低效的,但是我在设置类模块时遇到了太多麻烦。

例如,我希望能够引用所有 X_ComboBoxes,这样我就可以通过循环轻松地向所有 X_ComboBoxes 添加项目。我做了一个集合,这样我就可以参考所有的 TestType_ComboBoxes 以提高效率。我计划对 8 个问题块中的所有控件进行此类参考。

问题:当我尝试引用集合中的对象时出现 424 对象引用错误。

''' create collections:
Public ttComboBox As Collection
Public ttAmountBlocked As Collection
Public ttgcFileName As Collection
Public ttsoiDate As Collection
Public ttsoiTime As Collection
Public ttReportUse As Collection


Sub ReportGenerationTool()
' set variables:
'...other code
' make organList an array list
Set organList = CreateObject("System.Collections.ArrayList")
'...more code

' set collections and add respective controls
Set ttComboBox = New Collection
With ttComboBox
    .Add (Report_Form.TestType1_ComboBox)
    .Add (Report_Form.TestType2_ComboBox)
    .Add (Report_Form.TestType3_ComboBox)
    .Add (Report_Form.TestType4_ComboBox)
    .Add (Report_Form.TestType5_ComboBox)
    .Add (Report_Form.TestType6_ComboBox)
    .Add (Report_Form.TestType7_ComboBox)
    .Add (Report_Form.TestType8_ComboBox)
End With
ttComboBox.Item(1).AddItem "Test"
'**^THIS IS WHERE I GET THE 424 ERROR**'

Set ttAmountBlocked = New Collection
'...similar set up as above 
Set ttgcFileName = New Collection
'...similar set up as above 
Set ttsoiDate = New Collection
'...similar set up as above
Set ttsoiTime = New Collection
'...similar set up as above
Set ttReportUse = New Collection
'...similar set up as above 



' initialize report form
Call ReportForm_Initialize

' show report form
Report_Form.Show


End Sub

通常,我在 ReportForm_Initialize() 子程序中有这行代码:ttComboBox.Item(1).AddItem "Test"(以及其他类似的代码)。 本质上我想要这个: Report_Form.TestType1_ComboBox.AddItem "Test" 用这个: ttComboBox(1).AddItem "Test" 如果没有集合,我如何获得此功能?

【问题讨论】:

  • 请帮忙,这让我很沮丧一段时间。谢谢:)

标签: excel vba user-interface collections controls


【解决方案1】:

该错误意味着需要一个对象但未提供任何对象,因此您的集合实际上并不包含对象(如表单控件 ComboBox),而是其他内容。

我用一个测试场景确认了这一点,截图如下

如果您查看 Locals 窗口中的集合,您会发现它包含字符串值,而不是表单控件/组合框对象!由于字符串值属性没有 .Add 方法,因此会引发 424 错误。

为什么集合包含字符串而不是 ComboBoxes?

在 VBA 中,括号通常会强制对表达式求值

有时这并不重要。例如,("hello") 的计算结果与 "hello" 相同,但对于像表单控件这样的对象,括号将计算为该对象的默认属性(可能是 .Value 属性)。

如何解决?

简单,只需从.Add 语句中删除括号。

With ttComboBox
    .Add Report_Form.TestType1_ComboBox
    .Add Report_Form.TestType2_ComboBox
    .Add ...etc.

或者你可以更花哨一点,改变整个街区:

With ttComboBox
    .Add (Report_Form.TestType1_ComboBox)
    .Add (Report_Form.TestType2_ComboBox)
    .Add (Report_Form.TestType3_ComboBox)
    .Add (Report_Form.TestType4_ComboBox)
    .Add (Report_Form.TestType5_ComboBox)
    .Add (Report_Form.TestType6_ComboBox)
    .Add (Report_Form.TestType7_ComboBox)
    .Add (Report_Form.TestType8_ComboBox)
End With

改为(假设这些是您表单上唯一的组合框):

Dim cbox as Object

For each cbox in Report_Form.Controls
    If TypeName(cbox) = "ComboBox" Then
        ttComboBox.Add cBox
    End If
Next

【讨论】:

  • 很好的解释大卫。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-30
相关资源
最近更新 更多