我正在制作带有一些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,将产生错误。