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
答
为什么它不起作用?您的代码中有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答案中给出。
然而,你的代码是由这么多不必要的变数:
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
建议,在代码的第一行放置一个断点,然后修改一个单元格。使用调试器逐步调试代码,直到找到问题。可能由于递归事件触发:有技术来防止这种情况,例如:http://www.tek-tips.com/viewthread.cfm?qid = 1210787 – Joe