我遇到一致的“Excel已停止工作”错误。我有一个用户表单,该表单根据用户在第一个组合框中选择的内容来填充具有从属下拉选项的组合框。当使用VBA宏和更改事件时,“Excel已停止工作”
的错误是为一贯创建我的更改事件潜艇的任何当用户键入到第二个组合框,与现有的价值,应该在第二个框对应的信。如果用户从下拉列表中选择一个选项,则不会发生 - 只有当用户键入匹配值的第一个字母时才会发生。例如:如果第一个组合框是“水果”,第二个组合选项可能是“苹果”,“橙色”等。如果用户在第二个框中输入“A”或“O”(因为它匹配相应的值),它崩溃了Excel。为什么它不像第一个组合框那样简单地“填充”匹配值?
错误处理已到位,但它从不在代码中引发此错误,只有“excel已停止工作”,然后崩溃。
是否需要在宏中使用启用/禁用工作表事件?如果是这样,请提供如何实施和解释其工作原理的建议。我已经通过简单地将它们转换为单击按钮来解决以前的On Change问题,但我更愿意学习如何更好地实现On Change事件而不会出错。
谢谢!下面是一些示例代码,我想与Excel的崩溃相关联:
Private Sub Option1_Change()
On Error GoTo Option1_Change_Error
'Set cell H4 as value entered in Opt1 (adv. filter criteria)
Sheet6.Range("H4").Value = Me.Option1.Value
'Run macro AdvFilter which sets criteria for dependent drop-down box
AdvFilter
Me.Option2.Value = ""
'Set row source as output of adv filter
Me.Option2.RowSource = "AdvFilter_Output"
'Set list box content
'If no adv.filter output, then blank listbox
If Sheet2.Range("BZ3").Value = "" Then
Me.lstOptions.RowSource = ""
Else
Me.lstOptions.RowSource = "AdvFilter_Output"
End If
Exit Sub
Option1_Change_Error:
MsgBox "An error has occurred. " _
& vbCrLf & "" _
& vbCrLf & "" _
& "Error " & Err.Number & " (" & Err.Description & ") in procedure Option1_Change_Error of Form frmOptions"
End Sub
Private Sub Option2_Change()
On Error GoTo Option2_Change_Error
If Me.Option1 = "" And Me.Option2 <> "" Then
MsgBox "Select a the category first to see the corresponding options that exist."
Exit Sub
Else
Me.Option2.RowSource = ""
End If
Exit Sub
Option2_Change_Error:
MsgBox "An error has occurred. " _
& vbCrLf & "" _
& vbCrLf & "" _
& "Error " & Err.Number & " (" & Err.Description & ") in procedure Option2_Change_Error of Form frmOptions"
End Sub
你用调试器走过这段代码吗?它扼杀哪条线?如果你还没有,我会强烈建议在函数的第一行打一个断点,然后逐行逐行读取代码来理解打破它的原因。它也会告诉你,即使这个代码违反了它 - 如果你的断点从不跳闸(但是excel仍然崩溃),它可能完全是另一回事。 – tobriand 2015-04-01 23:11:52
首先想到的是:什么是'AdvFilter_Output'?你是否将一个命名范围分配给这样的行源?我本来期望RowSource采取一个范围... – tobriand 2015-04-01 23:12:51
@tobriand感谢您的回应。 AdvFilter_Output是一个动态命名范围,用于保存高级过滤器的输出数据。它在用户填充第一个组合框时自动填充一个列表框,作为一种视觉辅助,向用户显示他们所选类别的记录中已经存在哪些选项。根据用户在第一个组合框中选择的内容,AdvFilter_Output也会成为第二个组合框的行源。你能澄清你关于命名范围和行源的第二个问题吗? – keyboardmouse 2015-04-02 16:25:32