VBA脚本每次崩溃

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

善意帮助build议。 谢谢!

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 

为什么它不起作用?

你的代码中有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 = Target Set t = Target(1,1) 。 因此,当多个单元格被粘贴时,它将始终只与第一个单元格一起工作。

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

但是,你的代码由很多不必要的variables组成:

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