Excel:组合框和复选框干扰?

时间:2014-11-25 12:35:37

标签: excel vba checkbox combobox

我正在制作带有一些activeX控件的Excel表单,并且在使用以下函数时出现问题:

enter image description here

我希望用户在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,结果是:

enter image description here

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

  

运行时错误' 1004':无法设置属性:enabled class:   OLEOBJECT

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

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

Me.ComboBox9.Enabled = True

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

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

2 个答案:

答案 0 :(得分:2)

重现这一点:

有一张这样的表格: enter image description here

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"这与整个列有关,如下所示: enter image description here 并使用此"列表"作为ComboBox的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并创建一个命名范围" list"与

有关
=Sheet2!$A$1:INDEX(Sheet2!$A$1:$A$40;COUNTIF(Sheet2!$A$1:$A$40;"<>"))

然后使用以下代码将Sheet1.ComboBox1.ListFillRange设置为&#34; list&#34;如果它在Sheet2类模块中,它将起作用:

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

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

答案 1 :(得分:1)

由于评论太短,无法解释我为解决问题所做的工作,我发布了这个答案。

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

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

enter image description here

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

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

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