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