视觉基本程序太大错误,并且检测到不明确的名称worksheet_change

时间:2018-07-03 20:58:24

标签: vba

我有一个很大的VBA宏,其中包含一个大的Private Sub Worksheet_Change(ByVal目标为范围)。

它首先给我带来了太大的错误,因为它确实很大。

当我尝试将其分为3个私有子Worksheet_Change(ByVal目标为范围)时。

出现此错误:

  

检测到模糊名称worksheet_change

我可以解决这两个错误的任何线索吗?

预先感谢

这是我的代码,实际代码中有很多条件和针对每个目标地址的文字检查

Private Sub Worksheet_Change(ByVal Target As Range) 
If Target.Address = [rng_opt1].Address Then 
If [rng_opt1] = "x" Then 
If [rng1_1] = "z" then 
[rng1_1] = " " 
End if 
End If 
End if
End sub

感谢@urdearboy,我解决了,我的最终代码是这样的(简化了很多)。这很棘手,我花了一段时间,因为我的目标定义了名称

Private Sub Worksheet_Change(ByVal Target As Range)
 On Error GoTo Whoa

    Application.EnableEvents = False

    If Target.Address = [rng_opt1].Address Then
      Call Opt1(Target)
    ElseIf Target.Address = [rng1_1].Address Then
      Call Opt11(Target)
    End if

LetsContinue:
    Application.EnableEvents = True
    Exit Sub
Whoa:
    MsgBox Err.Description
    Resume LetsContinue

End Sub

Sub Opt1(Target As Range)

    If Target.Address = [rng_opt1].Address Then
           If [rng_opt1] = "x" Or [rng_opt1] = "y" Then
              If [rng1_1] = "z" 
                   [rng1_1] = " "
              End If
           End if
    End if
End Sub

Sub Opt11(Target As Range)

    If Target.Address = [rng1_1].Address Then
      If [rng1_1] = " " Then
        If [rng1_2] = " " And [rng1_3] = " " And [rng1_4] = " " Then
           [rng1_1] = "y"
           [rng1_2] = "x"
        End If
      End If
    End if 
 End sub

1 个答案:

答案 0 :(得分:0)

在工作表上只能有一个WorkSheet_Change事件,这就是为什么出现检测到歧义名称错误的原因。

如果您的代码太长,请尝试在Sub中创建操作,然后根据特定条件调用这些子。这样,您可以将您的WorkSheet_Change代码限制为严格评估Target

在您的WorkSheet_Change代码中,您可以看到以下内容:

If Target.Value = “x” Then
  Call SubX
ElseIF Target.Value = “y” Then
  Call SubY
ElseIF Target.Value = “z” Then
  Call SubZ
End IF

SubX ()
   ‘Do Something
End Sub

SubY ()
   ‘Do Something
End Sub

SubZ ()
   ‘Do Something
End Sub

注意:

在对工作表进行任何物理更改之前,您将需要禁用事件,否则您将陷入无限循环并导致excel实例崩溃。使用以下方法来避免此问题:

Application.EnableEvents = False
   ‘Physical changes to worksheet
Application.EnableEvents = True