当任何包含公式的单元格更改时触发宏

用户3286479

我有一个包含大约 50 个单元格(包含公式)的工作表,这些单元格根据外部工作簿中的单元格而变化。

当这些单元格中的任何一个更改其值时,我想触发某个宏。

Worksheet_change 事件不起作用并且 Worksheet_Calculate 不引用更改的目标单元格。

我找到了这段代码,但它无济于事,因为它会测试是否只更改了一个单元格值(“A1”)。

Private Sub Worksheet_Calculate()
   Static OldVal As Variant

   If Range("A1").Value <> OldVal Then
      OldVal = Range("A1").Value
      Call Macro
   End If
End Sub

因此,我非常感谢您帮助寻找此问题的解决方案。

注意:所有包含公式的单元格都是命名单元格。

特里科特

您可以将工作表的值保留在内存中,并在每次重新计算时检查已更改的值,同时更新该数组。

这是一些代码,放置在ThisWorkbook模块中,将为第一张纸设置这样的检测(更改Sheet1为您要监视的任何一张纸):

Dim cache As Variant

Private Sub Workbook_Open()
    cache = getSheetValues(Sheet1)
End Sub

Private Function getSheetValues(sheet As Worksheet) As Variant
    Dim arr As Variant
    Dim cell As Range

    ' Get last cell in the used range
    Set cell = sheet.Cells.SpecialCells(xlCellTypeLastCell)
    ' Get all values in the range between A1 and that cell
    arr = sheet.Cells.Resize(cell.Row, cell.Column)
    If IsEmpty(arr) Then ReDim arr(0, 0) ' Default if no data at all
    getSheetValues = arr
End Function

Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
    Dim current As Variant
    Dim previous As Variant
    Dim i As Long
    Dim j As Long
    Dim prevVal As Variant
    Dim currVal As Variant

    If Sh.CodeName <> Sheet1.CodeName Then Exit Sub
    ' Get the values of the sheet and from the cache
    previous = cache
    current = getSheetValues(Sh)
    For i = 1 To WorksheetFunction.Max(UBound(previous), UBound(current))
        For j = 1 To WorksheetFunction.Max(UBound(previous, 2), UBound(current, 2))
            prevVal = ""
            currVal = ""
            On Error Resume Next ' Ignore errors when out of array bounds
                prevVal = previous(i, j)
                currVal = current(i, j)
            On Error GoTo 0
            If prevVal <> currVal Then
                ' Change detected: call the function that will treat this
                CellChanged Sheet1.Cells(i, j), prevVal
            End If
        Next
    Next
    ' Update cache
    cache = current
ext:
End Sub

Private Sub CellChanged(cell As Range, oldValue As Variant)
    ' This is the place where you would put your logic
    Debug.Print cell.Address & " changed from '" & oldValue & "' to '" & cell.Value & "'"
End Sub

您可以If在最后一个例程中使用一些语句来仅过滤掉您真正感兴趣的那些范围。

对于所有工作表

如果您需要监视多个工作表中的更改,您可以将缓存构建为一组 2D 数组,每个工作表一个集合条目,以其名称为键。

Dim cache As Collection

Private Sub Workbook_Open()
    Dim sheet As Worksheet

    Set cache = New Collection
    ' Initialise the cache when the workbook opens
    For Each sheet In ActiveWorkbook.Sheets
        cache.Add getSheetValues(sheet), sheet.CodeName
    Next
End Sub

Private Function getSheetValues(sheet As Worksheet) As Variant
    Dim arr As Variant
    Dim cell As Range

    ' Get last cell in the used range
    Set cell = sheet.Cells.SpecialCells(xlCellTypeLastCell)
    ' Get all values in the range between A1 and that cell
    arr = sheet.Cells.Resize(cell.Row, cell.Column)
    If IsEmpty(arr) Then ReDim arr(0, 0) ' Default if no data at all
    getSheetValues = arr
End Function

Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
    Dim current As Variant
    Dim previous As Variant
    Dim i As Long
    Dim j As Long
    Dim prevVal As Variant
    Dim currVal As Variant

    ' Get the values of the sheet and from the cache
    previous = cache(Sh.CodeName)
    current = getSheetValues(Sh)
    For i = 1 To WorksheetFunction.Max(UBound(previous), UBound(current))
        For j = 1 To WorksheetFunction.Max(UBound(previous, 2), UBound(current, 2))
            prevVal = ""
            currVal = ""
            On Error Resume Next ' Ignore errors when out of array bounds
                prevVal = previous(i, j)
                currVal = current(i, j)
            On Error GoTo 0
            If prevVal <> currVal Then
                ' Change detected: call the function that will treat this
                CellChanged Sheet1.Cells(i, j), prevVal
            End If
        Next
    Next
    ' Update cache
    cache.Remove Sh.CodeName
    cache.Add current, Sh.CodeName
ext:
End Sub

Private Sub CellChanged(cell As Range, oldValue As Variant)
    ' This is the place where you would put your logic
    Debug.Print cell.Address & " changed from '" & oldValue & "' to '" & cell.Value & "'"
End Sub

这适用于从一开始就存在的工作表,而不是添加的工作表。当然,这也可以实现,但你会明白的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在单元格值更改时自动触发宏 |Excel|VBA|

来自分类Dev

当工作表中的任何单元格更改时,Excel VBA重新运行公式(更新)

来自分类Dev

当单元格值更改时,然后运行宏

来自分类Dev

根据单元格的值触发公式

来自分类Dev

VBA 和 Excel 我需要在单元格更改时运行宏

来自分类Dev

强制Excel公式在不相关的单元格值更改时更新

来自分类Dev

当单元格公式结果更改时,如何修复 msgbox 显示两次?

来自分类Dev

插入行时也会触发宏“触发单元格更改”

来自分类Dev

Excel宏将所有填充的单元格更改为值,而不是公式

来自分类Dev

根据单元格值更改调用宏,但公式保持不变

来自分类Dev

RadGridView中单元格的值更改时如何触发事件?

来自分类Dev

尝试在 Grid 单元格中的 CellEditor 更改时触发事件

来自分类Dev

防止单元格公式更改

来自分类Dev

如何动态更改单元格的公式

来自分类Dev

Excel更改单元格公式

来自分类Dev

范围中任何单元格中的值更改时自动运行Excel VBA

来自分类Dev

Excel公式以确定范围内的任何单元格是否包含值

来自分类Dev

Google表格中基于公式的单元格更改未触发onEdit脚本

来自分类Dev

查看单元格输出而不是公式的宏

来自分类Dev

使用宏重置单元格中的公式

来自分类Dev

在多个单元格中使用变量编写公式的宏

来自分类Dev

查看单元格输出而不是公式的宏

来自分类Dev

当我在单元格 A1 中进行任何更改时,如何将单元格 A2 的值更改为“Today()”?

来自分类Dev

包含公式但不包含值的单元格的条件格式

来自分类Dev

默认文本更改时,Excel更改单元格颜色

来自分类Dev

单击一个单元格以触发宏

来自分类Dev

单击单元格触发宏后,Excel 崩溃

来自分类Dev

Excel VBA 单击单元格以触发宏 - 不适用于合并的单元格

来自分类Dev

列值更改时删除线关联的单元格

Related 相关文章

  1. 1

    在单元格值更改时自动触发宏 |Excel|VBA|

  2. 2

    当工作表中的任何单元格更改时,Excel VBA重新运行公式(更新)

  3. 3

    当单元格值更改时,然后运行宏

  4. 4

    根据单元格的值触发公式

  5. 5

    VBA 和 Excel 我需要在单元格更改时运行宏

  6. 6

    强制Excel公式在不相关的单元格值更改时更新

  7. 7

    当单元格公式结果更改时,如何修复 msgbox 显示两次?

  8. 8

    插入行时也会触发宏“触发单元格更改”

  9. 9

    Excel宏将所有填充的单元格更改为值,而不是公式

  10. 10

    根据单元格值更改调用宏,但公式保持不变

  11. 11

    RadGridView中单元格的值更改时如何触发事件?

  12. 12

    尝试在 Grid 单元格中的 CellEditor 更改时触发事件

  13. 13

    防止单元格公式更改

  14. 14

    如何动态更改单元格的公式

  15. 15

    Excel更改单元格公式

  16. 16

    范围中任何单元格中的值更改时自动运行Excel VBA

  17. 17

    Excel公式以确定范围内的任何单元格是否包含值

  18. 18

    Google表格中基于公式的单元格更改未触发onEdit脚本

  19. 19

    查看单元格输出而不是公式的宏

  20. 20

    使用宏重置单元格中的公式

  21. 21

    在多个单元格中使用变量编写公式的宏

  22. 22

    查看单元格输出而不是公式的宏

  23. 23

    当我在单元格 A1 中进行任何更改时,如何将单元格 A2 的值更改为“Today()”?

  24. 24

    包含公式但不包含值的单元格的条件格式

  25. 25

    默认文本更改时,Excel更改单元格颜色

  26. 26

    单击一个单元格以触发宏

  27. 27

    单击单元格触发宏后,Excel 崩溃

  28. 28

    Excel VBA 单击单元格以触发宏 - 不适用于合并的单元格

  29. 29

    列值更改时删除线关联的单元格

热门标签

归档