我正在制作带有一些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,然后尝试通过单击checkbox1来扩展表,该表将扩展,但是我收到一条错误消息:


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


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

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

Me.ComboBox9.Enabled = True


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

我不知道为什么该复选框会与其他组合框进行交互。我不知所措,任何帮助将不胜感激。

最佳答案

要重现此内容:

有这样的一张纸:


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


如果我们创建一个名为“列表”的名称,该名称与整个列相关,如下所示:

并将此“列表”用作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并创建与以下内容相关的命名范围“列表”

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


然后,以下代码将Sheet1.ComboBox1.ListFillRange设置为“ list”,如果它位于Sheet2类模块中,则可以使用:

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


如果从Sheet1类模块中尝试设置ListFillRange,将产生错误。

10-07 21:41