您看我把您的代码这么简化一下会出现问题吗?

PrivateSubWorksheet_Change(ByValTargetAsRange)OnErrorResumeNextDimsAsString,rgAsRange... Private Sub Worksheet_Change(ByVal Target As Range)
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
展开
 我来答
远行数码科技

推荐于2016-09-05 · TA获得超过667个赞
知道小有建树答主
回答量:533
采纳率:75%
帮助的人:184万
展开全部

表面看起来你的代码精简了似乎应该效率更高了,但是事实上是效率更差了,而且如果碰到特殊的情况下还会产生错误。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 广告
在当今竞争激烈的商业环境中,企业需要不断提高自身的竞争力,以保持市场份额和增加利润。通过人效提升,企业可以更有效地利用有限的资源,提高生产力和效益,从而实现盈利目标。中智咨询提供全方位的组织人效评价与诊断、人效提升方案等数据和管理咨询服务。... 点击进入详情页
本回答由中智咨询提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式