我使用以下代码,效果很好。但是,对应该触发此事件的单元格的更改是使用公式而不是单元格中的条目进行的。如果我输入条目,一切都会正常。但如果我使用公式从另一个工作表中获取数据,则不会。例如,AD 中的单元格有如下公式=HR!P27
。
我错过了什么?
代码:
Private Sub Worksheet_Change(ByVal Target As Range)
'Update 20140722
Dim WorkRng As Range
Dim Rng As Range
Dim xOffsetColumn As Integer
Set WorkRng = Intersect(Application.ActiveSheet.Range("AD:AD"), Target)
xOffsetColumn = -1
If Not WorkRng Is Nothing Then
Application.EnableEvents = False
For Each Rng In WorkRng
If Not VBA.IsEmpty(Rng.Value) Then
Rng.Offset(0, xOffsetColumn).Value = Now
Rng.Offset(0, xOffsetColumn).NumberFormat = "dd-mm-yyyy, hh:mm:ss"
Else
Rng.Offset(0, xOffsetColumn).ClearContents
End If
Next
Application.EnableEvents = True
End If
End Sub
答案1
返回不同结果的公式不属于对单元格的更改。根据Worksheet_Change
事件,它:
当工作表上的单元格被用户或外部链接更改时发生。
当你观察到单元格的内容实际上没有改变时,这种行为是有道理的。例如,=HR!P27
之前包含的单元格和公式返回不同的结果后。只有公式的结果发生了变化。正如本例所证实的,Excel 区分了影响单元格内容的变化与其输出的变化。
如果您需要在每次公式更新时运行代码,请考虑使用工作表_计算事件。每次重新计算工作表时都会触发该事件。
答案2
考虑一下 VBA 代码中的 Range("AD:AD"),我想向您建议背后的原因以及解决方案,您如何解决该问题
如果范围是手动刷新(事实上你已经做了什么),然后可以使用变更事件。
如果范围包含任何公式,然后可以使用计算事件。
如果范围包含通过外部数据或公式刷新的值,然后在 Range("AD"AD") 中输入 =("AD:AD") 并且然后也可以使用计算事件。
这些是可能的原因。因此,如果范围刷新,则会自动计算 AD:AD 并触发事件。
我猜你还没有输入代码本工作簿。需要输入以下代码床单,那么它就可以工作了。
所以结论是使用计算事件。
下面是两种示例编码方法,可以帮助您摆脱这种情况。
方法 1:
Private Sub Worksheet_Calculate()
Dim target As Range
Set target = Range("AD:AD")
If Not Intersect(target, Range("AD:AD")) Is Nothing Then
PASTE YOUR VB CODE HERE.
End If
End Sub
方法 2:
只需创建这个。
Private Sub Worksheet_Calculate()
Worksheet_Change Range("AD:AD")
End Sub
注意: 此代码将处理您现有的“工作表更改事件”练习。
我确实希望这对你有帮助。