2015-04-01 184 views
0

我遇到一致的“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

+1

你用调试器走过这段代码吗?它扼杀哪条线?如果你还没有,我会强烈建议在函数的第一行打一个断点,然后逐行逐行读取代码来理解打破它的原因。它也会告诉你,即使这个代码违反了它 - 如果你的断点从不跳闸(但是excel仍然崩溃),它可能完全是另一回事。 – tobriand 2015-04-01 23:11:52

+1

首先想到的是:什么是'AdvFilter_Output'?你是否将一个命名范围分配给这样的行源?我本来期望RowSource采取一个范围... – tobriand 2015-04-01 23:12:51

+0

@tobriand感谢您的回应。 AdvFilter_Output是一个动态命名范围,用于保存高级过滤器的输出数据。它在用户填充第一个组合框时自动填充一个列表框,作为一种视觉辅助,向用户显示他们所选类别的记录中已经存在哪些选项。根据用户在第一个组合框中选择的内容,AdvFilter_Output也会成为第二个组合框的行源。你能澄清你关于命名范围和行源的第二个问题吗? – keyboardmouse 2015-04-02 16:25:32

回答

0

想通了,这要归功于能够与Tobriand反弹了一些想法和运行通过一些可能出现的问题。 由于Option2中不适当的else子句,导致两个事件之间的冲突源行发生冲突。

Private Sub Option2_Change()将第二个组合框的Rowsource设置为change上的空白,从而阻止输入任何内容。 match entry属性设置为False,但我认为删除组合框2的rowsource会导致match entry complete属性在用户键入某个内容时找不到,并且找不到匹配项。 我从Option2事件中删除了else部分,它似乎现在可以工作。

+0

很高兴听到你把它分类!在Excel中,自动完成总是让我感觉轻微一点;听起来像是另一个有用的,直到它不是特征。执行的顺序必须改变 - >你的事件 - >他们的事件,然后,我想。我可以明白为什么这样做合乎逻辑,但真正突出了VBA在处理本机错误方面的缺点,不是吗? – tobriand 2015-04-02 21:35:44