【问题标题】:VBA (Visual Basic): ComboBox (Form Control) - Object doesn't support this property or methodVBA (Visual Basic): ComboBox (Form Control) - 对象不支持此属性或方法
【发布时间】:2018-03-02 22:42:23
【问题描述】:

刚刚注册! (尽管我已经使用该网站几年了,哈哈!)。

我在 VBA 上遇到了一个问题,这让我抓狂。希望有人能解决我的问题。

我正在尝试引用我在 Sheet6 中手动添加的 ComboBox(Form Control)。它包含几个项目列表。然后我将遍历组合框中的每个项目并用它做一些事情..

但是对于我的一生,我无法理解我做错了什么?!

我不断收到运行时错误“438”:

Object doesn't support this property or method

This is the line the Run-time error occurs on:

Public Sub ReferralSummaries()

'Stop screen updates.
Application.ScreenUpdating = False

'Method Variables
Dim Lstrw As Long
Dim CurrentWb As Workbook
Dim ReferralSheet As Worksheet
Dim ResultsSheet As Worksheet
Dim ReferralSheetCBox As Object

'Initialize Variables
Set CurrentWb = ThisWorkbook
Set ReferralSheet = CurrentWb.Sheets("Referral Breakdowns")
Set ResultsSheet = CurrentWb.Sheets("Results")
Set ReferralSheetCBox = Worksheets(6)

'Check Date column and update accordingly
Call Update_Date_Column(ReferralSheet, ResultsSheet)

For i = 0 To ReferralSheetCBox.ComboBox1.Items.Count - 1 **(ERROR TRIGGERED HERE).**

感谢您的帮助!

亲切的问候, 忍者

【问题讨论】:

    标签: vba excel combobox runtime-error


    【解决方案1】:

    我认为你应该使用

    Set ReferralSheetCBox = Worksheets(6).Shapes("ComboBox1")
    

    然后你可以通过它的ControlFormat属性访问它的属性,例如:

    Dim nItems As Long
    nItems = ReferralSheetCBox.ControlFormat.ListCount
    

    因此您显示的代码最后一行将是

    For i = 0 To ReferralSheetCBox.ControlFormat.ListCount - 1
    

    【讨论】:

    • 嗨,我已经声明了一个 ControlFormat 属性并开始使用它。这使我能够做我想做的事情!我很困惑为什么我不能只做 Sheet6.ComboBox1?我手动创建了 ComboBox(它是表单控件,而不是 ActiveX)。我不明白为什么我必须使用 ControlFormat 属性而不是简单地使用 Sheet6.ComboBox1?如果您能帮助我理解,那就太好了.. 我见过其他人只是简单地做 Sheet1.ComboBox1.. 但我不能这样做吗?非常感谢您的解决方案..
    • 我必须承认我从未深入研究过这一点,只是接受了它......顺便说一句,您可以考虑将答案标记为已接受。谢谢
    • 我快速搜索了一下,我可以说这一定与 Excel 表单控件是一个包含控件的 Shape 对象有关。后者是通过 ControlFormat 属性访问的。另一方面,ActiveX 控件本身就是一个控件,因此您可以直接访问控件的属性和方法
    • 感谢您提供的信息和所有帮助,如果您有 Skype/Discord,请告诉我,我可以为未来的任务进行头脑风暴!是的,它适用于 ActiveX!尽管如此,为什么人们使用 OleObject 属性,而不是直接为 ActiveX 组合框执行 Sheet1.ComboBox1 仍然很奇怪。也许稍后再看看它。此外,我认为我需要重新考虑我的代码,并采用数据透视表方法 - 但我通过组合框 + 表方法遇到了一些障碍。我可能很快会问另一个问题,请注意!
    【解决方案2】:

    您可以通过将ReferralSheetCBox 强输入为DropDown(这是包含 ComboBox 的隐藏类型)来使用早期绑定:

    Dim ReferralSheetCBox As Excel.DropDown
    

    然后设置对形状的DrawingObject的引用:

    Set ReferralSheetCBox = Sheet6.Shapes("ComboBox1").DrawingObject
    

    然后,您可以调整您的代码:

    For i = 0 To ReferralSheetCBox.ListCount - 1
    

    【讨论】:

    • 这似乎不起作用:(。我见过其他人只是通过在组合框名称上使用点运算符来获取组合框对象。Sheet1.ComboBox1 ..我不明白为什么我必须通过所有这些 Shape、DropDown 属性?任何帮助表示赞赏.. 虽然 ControlFormat 属性解决方法对我的组合框有用.. 阅读赞成的评论!
    • 您对它是一个组合框(表单控件)非常具体。如果要使用点语法并避免使用 Shapes,则需要改用 ComboBox(ActiveX 控件)。只有 ActiveX 控件作为工作表的属性公开。
    • 是的,我刚刚意识到,ActiveX 控件允许直接使用 sheet6.combobox1 上的组合框。有人告诉我反之亦然.. 谢谢你的帮助!真的很感谢帮助..现在想虽然我遇到了一些障碍,但我怀疑它是如何构建excel的..所以我可能需要使用数据透视表来代替我想要实现的目标..我可能会提出另一个问题,如果你能留意并回答,那就太好了!
    • 如果您不介意,请在 Skype/discord 上添加我,可以与一些 VBA 朋友、联系人联系。谢谢大家的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 1970-01-01
    • 2013-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多