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

2024-03-05

我有一个包含大约 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最后一个例程中的语句仅过滤掉您真正感兴趣的范围。

适用于所有床单

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当任何包含公式的单元格发生更改时触发宏 的相关文章

  • SQL Excel VBA 运行时错误 3709 无效连接

    这是我的第一个问题 欢迎提出建设性的批评 我正在尝试从 Excel VBA 查询 Access 数据库并将返回信息放入 Excel 范围中 我收到此错误 错误消息 运行时错误 3709 连接无法用于 执行此操作 在此情况下它已关闭或无效 语
  • 有没有更快的方法来使用Powershell解析Excel文档?

    我正在与一个接口MS Excel文件通过Powershell 每个 Excel 文档可能有大约 1000 行数据 目前这个脚本似乎读取了Excel文件并以每 0 6 秒 1 条记录的速率将值写入屏幕 乍一看 这似乎非常慢 这是我第一次阅读E
  • 使用 ADODB 连接从关闭的工作簿中检索数据。某些数据被跳过?

    我目前正在编写一些代码 可以通过 ADODB 连接访问单独的工作簿 由于速度的原因 我选择了这种方法而不是其他方法 下面是我的代码 Sub GetWorksheetData strSourceFile As String strSQL As
  • 在 Excel 中使用 VBA 设置图像透明度

    有没有办法使用 VBA 脚本对图像应用一些透明度 我录制了一个 宏 但似乎没有录制艺术效果 我已经找到了如何制作形状 但没有找到图像 这需要几个步骤 将自选图形 如矩形 放置在工作表上 使用以下方法将您的实际图片嵌入矩形中 ShapeRan
  • 使用PHP从doc、xls文件中读取数据

    我想知道是否可以从 doc 和 xls 文件中读取数据并将 将内容读取到图像文件中 创建文档的页面样本 例如 我有一些文件希望我的客户购买 所以我需要自动创建小图像 例如我的文档样本 我们将不胜感激您的帮助 对于读取 xls 文件 我真的推
  • 如何使用vba复制Excel工作表中的动态范围

    我试图使宏中的范围是动态的 而不指定最后一行x Sheets SheetName Range A2 K1000 Copy在 1000 行中 我想将其更改为动态 因为有时我的数量会更少或更多 尝试这个 Sub Test Dim lRow as
  • 如何将 .xlsx 文件上传到 jenkins 作业

    如何将 xlsx 文件作为构建参数上传到 jenkins 作业 我尝试使用文件参数 但我发现该文件正在丢失其扩展名或原始格式 有什么方法可以从 jenkins UI 将 excel 文件上传到 jenkins 作业吗 In the file
  • 在 Excel 中自动复制和粘贴特定范围的最佳方法是什么?

    我对 VBA 非常陌生 我想自动化一项任务 但不知道从哪里开始 我有一个如下所示的数据集 样本数据 https i stack imgur com jxqFI png 我想做的是循环遍历 A 列 如果其中有内容 始终是电子邮件 请选择所有行
  • Vlookup 引用不同工作表中的表数据

    我想用一个VLOOKUP函数引用了放置在与所在工作表不同的工作表中的数据表VLOOKUP书面的功能 示例 在工作表 1 的单元格 AA3 中 我想插入VLOOKUP功能 我希望该函数检查单元格 M3 中的数字 在工作表 2 范围地址 A2
  • 在工作表中合并行和求和值

    我有一个 Excel 工作表 其中包含以下数据 管道 来分隔列 A B C X 50 60 D E F X 40 30 A B C X 10 20 A B C Y 20 20 A B C X 20 70 D E F X 10 50 A B
  • 在Excel VBA中将图像(jpg)转换为base64?

    我需要在 Excel 中转换图像 或通过VBA 转为base64 最后我将进行XML输出 我怎样才能做到这一点 我需要引用 DOM 吗 我一直在读书这个问题 https stackoverflow com questions 169907
  • 如何在缩进层次结构中找到父级?

    我目前有一张 Excel 工作表 其中包含缩进的项目层次结构 如下所示 每个项目都缩进 每个缩进四个空格 以显示它如何适应整体层次结构 我已经能够创建一个 级别 列 将缩进级别转换为数字 Item Level Parent P1 1 N A
  • 在 Python 中从 Excel 复制 YEARFRAC() 函数

    因此 我使用 python 来自动执行一些必须在 Excel 中执行的重复任务 我需要做的计算之一需要使用yearfrac 这在Python中被复制了吗 I found this https lists oasis open org arc
  • Python在没有pandas的情况下解码excel表

    我正在尝试在 python 中读取 excel 文件而不使用pandas or xlrd 我一直在尝试将结果转换为bytes to utf 8没有任何成功 xls 文件中的数据 colA colB colC spc 1D0 20190705
  • Office 365 中 Excel 中 Power Pivot 的计算列中正确的 DAX GROUPBY 语法是什么

    将以下语法输入到下面在 Excel Office 365 版本 的 powerpivot 中提供的表 Visits 的计算列公式中 GROUPBY Visits Patient Name First Visit Date MINX CURR
  • 使用 Excel VBA 循环工作簿文件夹并将所有工作表导出为制表符分隔文本

    我拼凑了一个 Excel VBA 脚本 该脚本将打开的工作簿中的所有工作表写入单独的制表符分隔文件 这仍然是 宏 吗 我正在 Excel 真空中学习这一点 它一次只处理一本工作簿 效果很好 这里是 Sub exportSheetsToTex
  • 有没有办法使用 Python Pandas 读取所有行,直到遇到空行

    我在 Excel 中有很多行 并且这些行在空行之后填充有垃圾值 有没有办法使用 Python pandas 只读取 Excel 中第一个空行之前的记录 我不知道 read excel 是否可以做到这一点 如果您从 Excel 导入空行 这些
  • Python循环遍历Excel工作表,将工作表名称添加到列表中,然后连接所有

    我正在循环遍历 Excel 工作表并将它们附加到列表中 循环完成后 我使用 Pandas 连接到单个数据帧 我遇到的问题是将工作表名称添加到适当的列表中 infile is a filepath variable xls xlrd open
  • 从 VBA 访问串行端口的最佳方法是什么?

    从 VBA 访问串行端口的最佳方法是什么 我需要我们的一些销售代表能够通过 PowerPoint 中的操作按钮通过串行端口发送简单的字符串 我不常用 VBA 尤其是像这样的事情 通常我会把它变成某种应用程序 但实际上我认为这个想法并没有那么
  • 行编号选择自动填充直到最后[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有一个包含数千行的表 我想通过在第一行旁边添加 1 2 3 来对行进行编号 然后选择这些行并拖动到最后以使用递增的数字进行填充 如何自动

随机推荐

  • Google 日历 API 服务帐户错误

    我收到这个错误 error errors domain calendar reason forbiddenForServiceAccounts message Service accounts cannot invite attendees
  • 在 JPA/Hibernate NamedQuery 中指定数据库函数

    如何在 JPA Hibernate NamedQuery 中指定数据库函数 奇怪的是 hibernate JQL 无法识别 RIGHT 函数 在不使用子字符串的情况下 hibernate 中是否有一种方法可以在 NamedQuery 中指定
  • 仅接受 IComparable 的 SortedList

    我有一个界面IScriptItem实现IComparable
  • Log4j 配置 - 不同的日志记录到不同的文件

    对于某些人来说 这可能是一个非常简单的问题 但就我个人而言 我发现 Log4j 配置非常困难 并且学习进行脑部手术可能不那么具有挑战性 我正在尝试让多个记录器登录到不同的文件中 这是我的 log4j properties 文件中的内容 Ro
  • Github桌面认证失败

    使用 Windows 10 Github Desktop Git 2 19 1 windows 1 64位 VisualStudio VSTS 背景 设法添加我的计算机中的存储库 但我无法用它做任何事情 我可以访问远程存储库 我之前使用过
  • Magento getUrl 不适用于目录/类别对象?

    我已经能够实例化一个类别对象来检索其名称 但是当我使用getUrl方法它不会返回类别列表页面的 URL 或任何其他内容 上面的代码会产生 HTML 输出 li a href name of sub cat a li 有谁知道我如何从
  • 黑莓 Twitter 集成以发布照片

    我正在开发一个应用程序 用户可以在运行 OS 5 0 的 BlackBerry Storm 和 Torch 系列手机上将照片分享到 Facebook 和 Twitter 对于 Facebook 我使用了草莓项目 但对于 Twitter 我找
  • 如何使用多个 CBCharacteristicProperties 和权限初始化 CBMutableCharacteristic

    我正在创建一个新的 CBMutableCharacteristic 以在我正在制作的蓝牙应用程序中使用 我从教程中得到了一些代码 如下所示 customCharacteristic CBMutableCharacteristic alloc
  • 如何在React项目中添加Service Worker

    我想在我的 React 项目中添加 Service Worker 项目已准备就绪 默认服务似乎不起作用 即使当我尝试导入它时 它也会出现以下错误 尝试导入错误 registerServiceWorker 不包含默认导出 导入为 regist
  • GWT 模块的模块标记中的 rename-to 是什么意思?

    GWT 模块中模块标记的 rename to 属性是什么意思 是可选的吗 它 导致编译器表现得好像模块的名称与长的 完全限定的名称不同 http code google com webtoolkit doc latest DevGuideO
  • 在 MySql 中提取具有特定模式的子字符串

    我有一个文本字段 如下所示 option A sum A g3et B 我想获取里面的文字 没有重复项 获得意义 A B 不可能出现双重like的情况 我知道这是一种在数据库中保存数据的可怕方法 我无法更改数据的保存方式 我只需要从本专栏中
  • 红宝石。合并嵌套哈希而不覆盖

    我有一个嵌套哈希 X 1 2 3 gt X O 2 3 gt X O X 3 gt X O X O 我想合并给定的嵌套哈希 X 1 2 3 gt X O 2 3 gt X O 2 X gt X O O X 这样 X 1 2 3 gt X O
  • 如何更改Windows Phone应用程序中按钮的背景颜色?

    我正在使用 C 和 silverlight 4 开发 Windows Phone 7 应用程序 我是 silverlight 的新手 我的应用程序中有两个用于不同目的的按钮 我想在单击按钮时动态更改按钮的颜色 所以我使用下面的代码 Inco
  • 办公自动化、VSTO 和 Open XML SDK 之间有什么区别?

    办公自动化 VSTO 和 Open XML SDK 之间有什么区别 我们需要所有这些还是其中一些已经过时了 办公自动化是指使用 COM 互操作以编程方式操作 Office 程序 或更常见的是通过 Office 程序操作 Office 文档
  • 默默忽略remove()

    实体 A 引用 多对一 实体 B 具有从 B 到 A 的反向 映射 引用 此外 还存在 A 到 C 的引用以及 C 到 A 的反向引用 当我发出entityManager remove A 然后flush 时 不会生成 删除 但也没有例外
  • ld:找不到 AudioUnit 框架

    我正在添加另一个项目 即使我添加了所需的所有库 我也会收到此错误 这是错误详细信息 Ld Users alialzahrani Library Developer Xcode DerivedData IMS3 ezltqoccjhjpvua
  • 如何在 React.js 中预加载图像?

    如何在 React js 中预加载图像 我有下拉选择组件 其工作方式类似于菜单 但我必须预加载项目的图像图标 因为有时它们在第一次打开时不可见 我努力了 https github com sambernard react preload h
  • 使用 xslt 从 xml 转换而来的平面文件中的行数

    下面是我用来将 xml 转换为平面文件的 xsl 它还满足各种其他所需条件
  • iOS7 深色键盘和浅色键盘之间的切换

    In iOS7 we have both a dark and a light keyboard Is it possible for me to change between these in my app by code textfie
  • 当任何包含公式的单元格发生更改时触发宏

    我有一个包含大约 50 个单元格 包含公式 的工作表 这些单元格根据外部工作簿中的单元格而变化 当这些单元格中的任何一个更改其值时 我想触发某个宏 Worksheet change 事件不起作用 并且 Worksheet Calculate