【问题标题】:Excel: combobox and checkbox interference?Excel:组合框和复选框干扰?
【发布时间】:2015-01-23 11:15:56
【问题描述】:

我正在制作一个带有一些 activeX 控件的 Excel 表单,但在整合以下功能时遇到了问题:

我希望用户在 ComboBox11 中选择一个数字。如果数字为 0,则表单会发生变化,组合框 9 和 10 将被禁用(使用 VBA 代码),下表“淡出”(使用条件格式),通知用户不要填写。

另一方面,如果用户选择大于 0 的数字,则表单保持原样。表格下方是一个复选框(checkbox1),用于在需要放入表格的数据大于表格大小时展开表格(取消隐藏之前隐藏的行)。

组合框 11 后面的 VBA 代码是:

    Private Sub ComboBox11_change()
Dim ws As Worksheet
Set ws = Sheets("Form")
If Not Me.ComboBox11.Text = "" Then ws.Range("J24") = CInt(Me.ComboBox11.Text) 'to write integer instead of text into linked cell
    If Me.ComboBox11.Value = 0 Then
        Me.ComboBox9.Enabled = False
        Me.ComboBox10.Enabled = False
        If Me.CheckBox1.Value = True Then Me.CheckBox1.Value = False 'if combobox11 is 0 than the table doesn't need to be expanded
        Me.CheckBox1.Enabled = False
    Else
        Me.ComboBox9.Enabled = True
        Me.ComboBox10.Enabled = True
        Me.CheckBox1.Enabled = True
    End If
End Sub

CheckBox1 后面的代码是:

    Private Sub CheckBox1_Change()
Dim ws As Worksheet
Set ws = Sheets("Form")
    If CheckBox1.Value = False Then ws.Rows("46:71").Hidden = True
    If CheckBox1.Value = True Then ws.Rows("46:71").Hidden = False
End Sub

所以,如果我在 combobox11 中选择 0,结果是:

到目前为止一切顺利。但是如果我选择大于 0 的值,比如在 combobox11 中选择 1,然后尝试通过单击复选框 1 来展开表格,表格就会展开,但我收到一条错误消息:

运行时错误“1004”:无法设置属性:启用类: OLE 对象

(不确定确切的错误文本,因为我没有使用英文 MSOffice)

按下调试按钮时,Sub ComboBox11_Change() 中的以下行会亮起:

Me.ComboBox9.Enabled = True

奇怪的是,当 combobox11 留空(未选择值)时,不会出现此错误。

我不知道为什么复选框会与其他组合框交互。我很困惑,任何帮助将不胜感激。

【问题讨论】:

  • 您是否尝试过在“CheckBox1_Change”的开头使用 Application.EnableEvents = False 并在其中使用 Application.EnableEvents = True ?
  • ComboBox11的ListFillRange是什么或者ComboBox11的List是怎么定义的?隐藏 CheckBox1_Change 中的行是否可能对 ComboBox11 的列表产生影响?如果是,为什么?
  • @dee:谢谢你的建议。刚试了一下,出现同样的错误
  • @AxelRichter:combobox11 的列表字段是一个自动生成的整数列表,从 0 到用户从另一个组合框中选择的值(不大于 40 btw)。选择最上面的数字后,在同一张表(有填写表格的表)的列中生成列表。然后,此列用于在 Excel 名称管理器中创建一个列表,该列表提供组合框。复选框代码不会隐藏生成该列表的单元格。即使他们愿意,这怎么可能是个问题?
  • 嗯,似乎您已经非常确定这永远不会成为问题。我的回答表明它可能是。您是否尝试过重现我的答案?因此,如果您需要进一步的帮助,您应该更详细地展示如何为您的 ComboBox11 生成列表。

标签: excel vba checkbox combobox


【解决方案1】:

重现这个:

有一张这样的表:

A1:A6 是 ComboBox 的 ListFillRange。

然后在 CheckBox1_Change() 中使用 VBA 代码隐藏 1:6 之间的任何行都会抛出错误。

Private Sub CheckBox1_Change()
    If CheckBox1.Value = False Then Me.Rows("7:13").Hidden = True
    If CheckBox1.Value = True Then Me.Rows("7:13").Hidden = False
    'If CheckBox1.Value = False Then Me.Rows("6:13").Hidden = True 'ERROR
    'If CheckBox1.Value = True Then Me.Rows("6:13").Hidden = False 'ERROR
End Sub

Private Sub ComboBox1_Change()
    If Me.ComboBox1.Value = 0 Then
        If Me.CheckBox1.Value = True Then Me.CheckBox1.Value = False
        Me.CheckBox1.Enabled = False
    Else
        Me.CheckBox1.Enabled = True
    End If
End Sub

如果我们创建一个名为“list”的名称,它与整个列相关,如下所示: 并将此“列表”用作组合框的 ListFillRange,然后如果此工作表中的行对代码隐藏,则会发生错误。这与隐藏行是否在真正的活动“列表”行 1-6 内无关。

如果我们没有在名称中引用一整列,而是仅引用第 1-10 行,例如:

=INDEX(Sheet1!$A$1:$A$10;1):INDEX(Sheet1!$A$1:$A$10;6)

那么只有当代码隐藏从 1 到 10 的行时才会发生错误,但如果它隐藏了从 11 向上的行则不会发生错误。

编辑:

继续我的例子: 将数字从 Sheet1!A:A 移动到 Sheet2!A:A 并创建了一个与

相关的命名范围“列表”
=Sheet2!$A$1:INDEX(Sheet2!$A$1:$A$40;COUNTIF(Sheet2!$A$1:$A$40;"<>"))

如果在 Sheet2 类模块中,以下将 Sheet1.ComboBox1.ListFillRange 设置为“list”的代码将起作用:

Private Sub Worksheet_Change(ByVal Target As Range)
 ThisWorkbook.Worksheets(1).ComboBox1.ListFillRange = "list"
End Sub

如果在 Sheet1 类模块中尝试设置 ListFillRange 会产生错误。

【讨论】:

  • 谢谢亚历克斯。不知道那件事。每天显然都是上学日。但它仍然不能解决我的问题,因为复选框隐藏/取消隐藏第 46:71 行,并且组合框列表是从单元格提供直到第 40 行(使用这样的参考:=lists!$AS$1:INDEX(lists!$ AS$1:$AS$40;COUNTIF(lists!$AS$1:$AS$40;"?*")) 仅用非空单元格填充)。我什至将所有组合框列表都移到了新工作表中,但问题仍然出现。
  • 如果在组合框列表来自另一个工作表时问题仍然存在,那么其他东西会使用此工作表事件上的代码重新初始化此工作表上的 ActiveX 组件。根据我的经验,这样做会导致完全失去对 ActiveX 控件的访问权限。重新初始化我的意思是改变通常是初始化过程的一部分的东西。例如,更改 ComboBox 的 ListFillRage,但不调整大小或重新定位。
  • 再次:如何根据命名范围放置 ListFillRange 或 ComboBox11 的 List?用代码?那么何时使用哪个代码?
【解决方案2】:

因为 cmets 太短,无法解释我为解决问题所做的工作,所以我发布了这个答案。

首先感谢 Axel Richter,他花时间详细说明了我的问题。

Combobox11 在名称管理器中填充了生成的 ListFillRange:

只要我更改了 ListFillRange,所描述的错误就会停止出现。起初我尝试了一个简单的替代方案:"=list!AU1:AU40" 虽然我不明白问题现在已经解决了!

之后我使用以下代码为combobox11创建了一个动态列表。

        Dim zadnji As Integer
        zadnji = Sheets("Form").Range("T9").Value + 1
        Me.OLEObjects("combobox11").ListFillRange = "=lists!AU1:AU" & zadnji

【讨论】:

  • 是的,即使它将 ComboBox 的 ListFillRange 设置在运行代码的同一工作表中,它仍然有效。所以我怀疑设置 ListFillRange 会重新初始化 ComboBox 是不正确的。似乎只有当 ListFillRange 是动态地依赖于 Excel 的计算时才会出现这种情况。在此示例中,它修复了应用程序计算,但由 VBA 动态修复。
猜你喜欢
  • 1970-01-01
  • 2020-08-12
  • 1970-01-01
  • 1970-01-01
  • 2019-02-27
  • 1970-01-01
  • 1970-01-01
  • 2017-05-28
  • 1970-01-01
相关资源
最近更新 更多