我编写了一个非常简单的VBA代码,如果填充了第2列,第1列和第4列为空,则使用当前日期填充第1列,使用当前时间填充第4列。
以下是我的代码:
Private Sub Worksheet_Change(ByVal Target As Range)
If (Target.Column = 2) And Target.Offset(0, -1).Value = "" Then
Target.Offset(0, 2) = Format(Now(), "HH:MM:SS")
Target.Offset(0, -1) = Date
End If
End Sub
并且它有效,但是当我填写第2列时,我会收到运行时错误,想法?
谢谢,
答案 0 :(得分:3)
这是因为当在第一列中填充数据时,事件再次触发。这会导致错误,因为从第一列开始,.Offset(0,-1)
要停止此分割,请将If拆分为嵌套if:
Private Sub Worksheet_Change(ByVal Target As Range)
If (Target.Column = 2) Then
If Target.Offset(0, -1).Value = "" Then
Target.Offset(0, 2) = Format(Now(), "HH:MM:SS")
Target.Offset(0, -1) = Date
End If
End If
End Sub
现在,如果它是任何其他列,则内部if将不会触发。
另一个建议是使用Application.EnableEvents
暂时停止事件,这样我们就不会以递归方式触发:
Private Sub Worksheet_Change(ByVal Target As Range)
If (Target.Column = 2) Then
If Target.Offset(0, -1).Value = "" Then
Application.EnableEvents = False
Target.Offset(0, 2) = Format(Now(), "HH:MM:SS")
Target.Offset(0, -1) = Date
Application.EnableEvents = True
End If
End If
End Sub
答案 1 :(得分:2)
......投掷我的2c
Target
可以是> 1个单元格,可能跨多个列,因此您需要考虑到这一点。还计划在运行时错误的情况下禁止事件处理被禁用(即使在这种情况下严格来说,您不需要关闭处理)。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng, c
'only handle if change is in col2
Set rng = Application.Intersect(Target, Me.Columns(2))
If Not rng Is Nothing Then
On Error GoTo haveError '<< ensure events are not left turned off
Application.EnableEvents = False
For Each c In rng.Cells
If c.Offset(0, -1).Value = "" Then
c.Offset(0, 2) = Format(Now(), "HH:MM:SS")
c.Offset(0, -1) = Date
End If
Next c
End If
haveError:
Application.EnableEvents = True '<< switch event handling back on
End Sub
答案 2 :(得分:0)
Private Sub Worksheet_Change(ByVal Target As Range)
If (Target.Column = 2) And Target.Offset(0, 2).Value = "" Then
Target.Offset(0, 2) = Format(Now(), "HH:MM:SS")
Target.Offset(0, -1) = Date
End If
End Sub
这将起作用并且不会抛出去除虫子。