VBA脚本每次崩溃

问题描述:

我是Excel的新手,从一些研究中,发现一个代码可以根据在另一个单元格中输入的值在单元格中生成值,反之亦然。代码如下。但是每次我在工作表上稍作改动时,它就停止工作,即使在关闭并重新打开后也不会重置。VBA脚本每次崩溃

善意帮助建议。谢谢!

Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim EF As Range, t As Range, v As Variant 
    Dim r As Long 
    Set t = Target 
    Set EF = Range("E:F") 
    If Intersect(t, EF) Is Nothing Then Exit Sub 
    Application.EnableEvents = False 
     r = t.Row 
     v = t.Value 
     If v = "" Then 
      Range("E" & r & ":F" & r).Value = "" 
     End If 
     If IsNumeric(v) Then 
      If Intersect(t, Range("F:F")) Is Nothing Then 
       t.Offset(0, 1).Value = v * 25.4 
      Else 
       t.Offset(0, -1).Value = v/25.4 
      End If 
     End If 
    Application.EnableEvents = True 
End Sub 
+4

建议,在代码的第一行放置一个断点,然后修改一个单元格。使用调试器逐步调试代码,直到找到问题。可能由于递归事件触发:有技术来防止这种情况,例如:http://www.tek-tips.com/viewthread.cfm?qid = 1210787 – Joe

为什么它不起作用?您的代码中有application.EnableEvents=False。当您发生错误并且事件被禁用时,它们将保持禁用状态。尝试以下操作,让代码以某种方式工作。在一个模块中

运行以下命令:

Option Explicit 

Sub TurnMeOn() 

    Application.EnableEvents = True 

End Sub 

要与您的代码进一步工作,请确保您使用的是良好的错误捕手,即重置enableEvents方法后面,当它们存在时。

Option Explicit 

    Private Sub Worksheet_Change(ByVal Target As Range) 

     Dim EF   As Range 
     Dim t   As Range 
     Dim v   As Variant 
     Dim r   As Long 

     On Error GoTo Worksheet_Change_Error 

     Set t = Target 
     Set EF = Range("E:F") 

     If Intersect(t, EF) Is Nothing Then Exit Sub 
     Application.EnableEvents = False 
     r = t.Row 
     v = t.Value 
     Debug.Print Target.Address 

     If v = "" Then 
      Range("E" & r & ":F" & r).Value = "" 
     End If 

     If IsNumeric(v) Then 
      If Intersect(t, Range("F:F")) Is Nothing Then 
       t.Offset(0, 1).Value = v * 25.4 
      Else 
       t.Offset(0, -1).Value = v/25.4 
      End If 
     End If 
     Application.EnableEvents = True 

     On Error GoTo 0 
     Exit Sub 

Worksheet_Change_Error: 

     Application.EnableEvents = True 
     MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure Worksheet_Change of VBA Document Tabelle1" 

    End Sub 

一个快速和肮脏的修复,使代码工作是改变Set t = TargetSet t = Target(1,1)。因此,当多个单元格被粘贴时,它将始终只与第一个单元格一起工作。

如何恢复Application.EnableEvents = True已在@Vityata答案中给出。

然而,你的代码是由这么多不必要的变数:

t As Range - 等于Target

v As Variant - 等于Target.Value

r As Long - 等于Target.Row

你可以只使用“清洁“以下版本:

Private Sub Worksheet_Change(ByVal Target As Range) 

    If Not Intersect(Target, Range("E:F")) Is Nothing Then 
     Application.EnableEvents = False 

     If Target.Value = "" Then 
      Range("E" & Target.Row & ":F" & Target.Row).Value = "" 
     End If 
     If IsNumeric(Target.Value) Then 
      If Intersect(Target, Range("F:F")) Is Nothing Then 
       Target.Offset(0, 1).Value = Target.Value * 25.4 
      Else 
       Target.Offset(0, -1).Value = Target.Value/25.4 
      End If 
     End If 
     Application.EnableEvents = True 
    End If 

End Sub