EXCEL VBA,更改单元格组和Worksheet_Change事件

我怀疑这不是那么复杂,但我没有太多的运气find合适的术语给谷歌…所以我来找专家!

所以我试图实现一个Worksheet_Change事件。 这是非常简单的,我基本上只是想做到以下几点:

如果C列中的值发生变化,D中的值(在该行中)具有特定的格式(NumberFormat =“$ 0.00”),则E列(在该行中)是这两个值的乘积。 简单。 实际上,我只想要在E列中使用公式的VBA等价物。 这是我使用的代码:

 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 3 And Target.Value <> "" Then If Target.Offset(0, 1).NumberFormat = "$ 0.00" Then Target.Offset(0, 2).Value = Target.Value * Target.Offset(0, 1).Value End If End If end sub 

当我尝试将多个值粘贴到c列的多行时,popup问题。 即我复制一列数据(> 1行)到C,我得到一个types不匹配的错误。 我将做出巨大的飞跃,它不处理这个好,因为“目标”是为了一个单一的细胞,而不是一个小组。 我希望有一个简单的方法来处理这个问题,每次当单元格上的单元格发生变化时都不会出现一些疯狂的循环。

提前致谢!

这是你正在尝试?

 Private Sub Worksheet_Change(ByVal Target As Range) Dim aCell As Range On Error GoTo Whoa Application.EnableEvents = False If Not Intersect(Target, Columns(3)) Is Nothing Then For Each aCell In Target If aCell.Value <> "" And aCell.Offset(0, 1).NumberFormat = "$ 0.00" Then aCell.Offset(0, 2).Value = aCell.Value * aCell.Offset(0, 1).Value End If Next End If Letscontinue: Application.EnableEvents = True Exit Sub Whoa: MsgBox Err.Description Resume Letscontinue End Sub 

你可能也想读这个 ?

虽然您只想捕获Col C粘贴,但这里还有一个场景,用户粘贴多列(其中一个是Col C)

 Private Sub Worksheet_Change(ByVal Target As Range) Dim aCell As Range On Error GoTo Whoa Application.EnableEvents = False If Not Intersect(Target, Columns(3)) Is Nothing Then If Not Target.Columns.Count > 1 Then For Each aCell In Target If aCell.Value <> "" And aCell.Offset(0, 1).NumberFormat = "$ 0.00" Then aCell.Offset(0, 2).Value = aCell.Value * aCell.Offset(0, 1).Value End If Next Else MsgBox "Please paste in 1 Column" End If End If Letscontinue: Application.EnableEvents = True Exit Sub Whoa: MsgBox Err.Description Resume Letscontinue End Sub 

本着完整和协作的精神,我在这里贴出了Siddharth Rout的方法的一个变种; 不同之处在于,这并不依赖于所有在一列中的“细胞行事”。 这使得它更清洁一些,并更容易适应其他情况。

 Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) Dim aCell As Range Dim onlyThese As Range ' collection of ranges that, if changed, trigger some action Dim cellsToUse As Range ' cells that are both in "Target" and in "onlyThese" On Error GoTo Whoa Application.EnableEvents = False Set onlyThese = Range("C:C") ' in this instance, but could be anything - even a union of ranges Set cellsToUse = Intersect(onlyThese, Target) If cellsToUse Is Nothing Then GoTo Letscontinue ' loop over cells that were changed, and of interest: For Each aCell In cellsToUse If aCell.Value <> "" And aCell.Offset(0, 1).NumberFormat = "$ 0.00" Then aCell.Offset(0, 2).Value = aCell.Value * aCell.Offset(0, 1).Value End If Next Letscontinue: Application.EnableEvents = True Exit Sub Whoa: MsgBox Err.Description Resume Letscontinue End Sub