我正在制作带有一些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':无法设置属性:enabled class: OLEOBJECT
(不确定确切的错误文本,因为我没有使用英文MSOffice)
按下调试按钮时,Sub ComboBox11_Change()
中的以下行亮起:
Me.ComboBox9.Enabled = True
奇怪的是,当combobox11保持空白(未选择值)时,不会出现此错误。
我不知道为什么复选框会与其他组合框互动。我很困惑,任何帮助都会非常感激。
答案 0 :(得分:2)
重现这一点:
有一张这样的表格:
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"这与整个列有关,如下所示: 并使用此"列表"作为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:
一旦我更改了ListFillRange,所描述的错误就会停止显示。起初我尝试了一个简单的替代方案:"=list!AU1:AU40"
虽然我不明白这个问题但现在已经解决了!
之后我使用以下代码为combobox11创建动态列表。
Dim zadnji As Integer
zadnji = Sheets("Form").Range("T9").Value + 1
Me.OLEObjects("combobox11").ListFillRange = "=lists!AU1:AU" & zadnji