
您看我把您的代码这么简化一下会出现问题吗?
On Error Resume Next
Dim s As String, rg As Range
For Each rg In Target
If rg.Value <> "" Then
s = Application.WorksheetFunction.VLookup(rg.Value, Sheet1.Range("a:b"), 2, 0)
If s <> "" Then
Range(rg.Address).Value = s & " " & rg.Value
End If
End If
Next
End Sub 展开
表面看起来你的代码精简了似乎应该效率更高了,但是事实上是效率更差了,而且如果碰到特殊的情况下还会产生错误。Application.EnableEvents ,从字面上看也很容易理解,是控制事件的触发,显然当= True时是允许,False则是不允许。在开头和结尾各加上一句False,True。目的是让事件只触发一次。如果不加这两句,你的事件代码就会至少触发两次。运行一次和两次哪个效率高不言而喻了,特别是当你复制粘贴很多数据时,每个单元格都要多运行一次,效率上的差异就会很明显了。而且如果你sheet1的表中的数据有如下的情况时(如图):
当你再在sheet2输入小明时,用你精简的代码,就不会出现你想要的:今年5岁了 小明,这样的结果,而是出现:今年7岁了 今年5岁了 小明,这样的结果。
所以最终的代码应该是这样的:
Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
Dim s As String, rg As Range
Application.EnableEvents = False
For Each rg In Target
Debug.Print 1
If rg.Value <> "" Then
s = Application.WorksheetFunction.VLookup(rg.Value, Sheet1.Range("a:b"), 2, 0)
If s <> "" Then
rg.Value = s & " " & rg.Value
End If
End If
Next
Application.EnableEvents = True
End Sub
其中的Range(rg.Address).Value,可以直接改成:rg.Value,但是Application.EnableEvents = False
Application.EnableEvents = True
两句不可少。

2024-08-28 广告