有没有办法以编程方式清除 EXCEL VBA 事件队列?

2024-04-12

有没有办法以编程方式清除 EXCEL VBA 事件队列? 在 EXCEL VBA 中,当更改工作表单元格然后用户按 ENTER 提交单元格编辑时,工作表级别会发生两个事件。他们是 : • 私有子工作表_更改(ByVal 目标作为范围) • 私有子工作表_SelectionChange(ByVal 目标作为范围)

不可避免地,这两个事件会被记录在一个队列中,并优先考虑Worksheet_Change,然后执行Worksheet_SelectionChange。由于单元格内容已更改,因此会触发 Change 事件。然后,由于用户按下 ENTER 键,将选择更改为已编辑单元格下的单元格,因此会触发 SelectionChange 事件。这两个步骤生成两个事件。

我编写了这段代码来捕获特定单元格中的更改,并且我需要完全避免以下事件 Worksheet_SelectionChange 在 Worksheet_Change 子终止后运行。这是因为在我的 SelectionChange sub 中还完成了其他重要工作,并且在修改单元格内容时它们不得进行干预。

当然,必须有一种方法来阻止 SelectionChange 的发生。我试图找到某种 VBA 函数来清空 Worksheet_Change 子项中的 EXCEL 事件队列列表。目前这似乎不存在。我还尝试使用 Application.EnableEvents = False,但这仅在两个事件都添加到队列后才会生效,这不会阻止等待的 SelectionChange 事件在 Change 事件之后执行。

问题:有没有办法以编程方式清除 EXCEL VBA 事件队列?

某种类似于 Application.ClearEventQueue 的函数,以防止执行任何后续未实现的事件。该函数可以在 Change 子函数中调用,并阻止执行任何进一步的等待事件。我们如何在VBA中实现这样的功能呢?

Dim NewLocation As Range

Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
    Set NewLocation = Target.Offset(0, 1) ' At this location a work is written in the cell
    NewLocation.Select ' Here the selection is changed and EXCEL trigger a third event, SelectionChange
    Debug.Print "still in change event", NewLocation.Row, Target.Value
Application.EnableEvents = True
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Debug.Print "selectionchange event", Target.Row, Target.Value
End Sub

此代码将显示当用户在单元格中输入新值时,将发生 3 个事件。

  • 首先是由以下行引起的 SelectionChange 事件:NewLocation.Select
  • 第二个 Change 事件是因为用户更改了单元格并按了 ENTER
  • 第三个由用户按 ENTER 键引起的 SelectionChange,因此焦点转到下面的单元格(只是暂时的,直到代码命令 NewLocation.Select。

我试图避免执行第三个 SelectionChange 。这是不可避免的,因为使用 Application.EnableEvents = False 只能在 EXCEL 捕获第一个 ENTER 步骤后生效。因此,当 EnagleEvents 设置为 OFF 时,只会发生两个事件。理想情况下,我会要求取消之前的 SelectionChange 事件。


Application.EnableEvents = False
NewLocation.Select 
Application.EnableEvents = True

将阻止Select触发另一个事件

编辑:似乎没有任何方法可以清除事件队列,因此您能做的最好的事情可能就是忽略Selection_Change紧接着发生的事件Change事件处理程序退出:

Option Explicit

Dim NewLocation As Range
Dim tChange As Double

Private Sub Worksheet_Change(ByVal Target As Range)
    Set NewLocation = Target.Offset(0, 1) ' At this location a work is written in the cell
    Application.EnableEvents = False
    NewLocation.Select
    Application.EnableEvents = True
    Debug.Print "still in change event", NewLocation.Row, Target.Value
    tChange = Timer  'note exit time
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Timer - tChange > 0.05 Then 'is this immediatley following exit from a Change event?
        Debug.Print "selectionchange event", Target.Row, Target.Value, Timer - tChange
    Else
        Debug.Print "Skipped handling selection change"
    End If
End Sub
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有办法以编程方式清除 EXCEL VBA 事件队列? 的相关文章

  • Weld 中的 JavaEE CDI:通用事件?

    我有一个基于泛型的特定事件处理的想法 但似乎 Weld 无法处理它们 我询问了 google 但找不到替代的 CDI 扩展 Question 是否有 CDI 扩展可以处理通用类型事件的事件传播 下面是我遇到的明确问题 我有三个常规事件 En
  • VBA中的字符串是可以迭代的数组吗?

    VBA中字符串是数组吗 例如 我可以像在 C C 中那样迭代它吗 做这样的事情 char myArray 10 for int i 0 i lt length i cout lt lt myArray i VBA 中的等价物是什么 它的行为
  • numpy NPV 和 Excel NPV 有区别吗?

    我的 Excel 中有一行包含 11 个值 TotalSavings 0 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 贴现率为 0 08 我在 Excel 中使用 计算 NPVNPV
  • 用于 C++ 数据复制的 Boost::Signals

    最近我有一堂课看起来像 class IGraphElement typedef void FuncCharPtr char int public void Add FuncCharPtr f FuncVec push back f void
  • VSTO 替代方案 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 VSTO 有哪些替代方案 ManagedXll 能做什么而 VSTO 不能 你什么时候使用其中一个而不
  • VBA在多个文件夹中搜索特定子文件夹并移动其中的所有文件

    你能帮助我吗 我想要一个宏vba来搜索SPECIFIC例如 所有存在并移动其文件的文件夹和子文件夹之间的子文件夹 Xfolder P Desktop Folder1 subfolder SUBFOLDER1 Xfolder 我正在使用 VB
  • Redim Preserve 给出“下标超出范围”

    我想要Redim Preserve一个数组我不断收到错误 下标超出范围 我知道只有最后一个维度的大小可以更改 这正是我正在做的事情 这里出了什么问题 数组的类型是Variant BmMatrix Sheets BENCH Range a60
  • Excel 2013 数据透视表不会更改当前页面,除非手动导航到

    我们有一小段 VBA 代码 多年来一直完美运行 本质上是 Me PivotTables APivot PivotFields AField CurrentPage Some text 这种方法一直有效 直到 Excel 2013 该行将失败
  • 如何通过电子邮件发送 Excel 文件?

    我有一个 excel 文件 Excel 2003 xls 格式 我想用 c 通过电子邮件发送它 我的代码成功发送它 但是当我尝试打开响应文件时 它似乎编码错误 例如 这里是响应文件名 utf 8 B RWxzesOhbW9sw6FzXzIw
  • 使用 VBA 将 Excel 电子表格中嵌入的 Word 文档保存到磁盘

    我们有一个 Excel 电子表格 当前使用存储在公司 LAN 上的 Word 模板生成报告 这对于内部用户来说效果很好 但对于没有连接到 LAN 的任何人来说就不行了 例如 笔记本电脑用户 管理层不希望将模板作为单独的文件分发给外部用户 而
  • VBA 架构技巧 - 宏封装

    我拼凑了 Excel 的概念证明 以从数据库获取数据 并需要将其打包 以便可以将其分发给我们的客户 我的第一次尝试只是将所有代码放入代码模块中 但随后在 Excel 中我可以看到宏列表中的所有模块 而我实际上只想要列表中的主要模块 我猜想我
  • Excel 2010 在 IF 函数中搜索文本 - 单独的单元格数据

    Program Excel 2010 Require 一种将名字 姓氏 电子邮件提取到各个单元格的方法 Data 我的数据有一个包含原始 脏数据 的表 它是原始的并且一团糟 我用一个简单的方法整理它 IF A7 Order 1 然后其余单元
  • 将 Excel 文件读入 R 并锁定单元格

    我有一个 Excel 电子表格要读入 R 它受密码保护并锁定了单元格 我可以使用 excel link 导入受密码保护的文件 但我不知道如何解锁 取消保护单元格 excel link 给了我这个错误 gt
  • 实例化 Microsoft.Office.Interop.Excel.Application 对象时出现错误:800700c1

    实例化 Microsoft Office Interop Excel Application 以从 winforms 应用程序生成 Excel 时 出现以下错误 这之前是有效的 但突然间它停止工作了 尽管代码和 Excel 版本没有变化 我
  • 如何从基类捕获点击项目(位于模板中)的事件?

    我有一个基础网格
  • Excel 的 VBA - 如何检查范围的交集不为空

    我有两个问题 1 如何检查交集或范围是否不为空 例如 如果我想检查它是否为空 我会写 if application intersect r1 r2 is nothing 但有什么东西是否定虚无的吗 例如 并非没有任何事情不起作用 2 如何比
  • 在 Excel 中打开文件而不重新计算 NOW()

    在 Excel 2010 2011 和 2013 尝试了所有三个 中 以只读方式打开文件仍然会重新计算 NOW 有没有办法让excel在打开文件时不重新计算 最简单的方法是将自动 默认 计算选项切换为手动 update 首先打开一个空白的新
  • 在用户窗体终止/关闭 VBA 时调用数组

    我有一个问题 我想在用户窗体关闭时将用户窗体的内容存储在数组中 我认为我的语法正确 但似乎不会在用户窗体初始化时重新填充 我尝试将数组放入其自己的模块中 但这也不起作用 有人愿意启发我吗 示例代码 Public Sub DPArrayStu
  • 插入行而不选择任何内容?

    我正在使用 VBA 希望在特定位置插入一行而不选择它 我遇到的问题是 选择该行后 当脚本运行完毕时 电子表格会向下滚动到该行 我希望能够在不将电子表格向下滚动到插入行的情况下执行此操作 Rows i i Select ActiveCell
  • 如何在apache POI中读取excel文件的准确单元格内容

    当我读取单元格的内容时 例如如果它是日期格式 它会转换为另一个值 例如 12 31 2099 gt 46052 和 50 00 gt 50 和 50 00 gt 0 5 但我想要的是获取每个单元格的确切字符串值 我的代码是这样的 cell

随机推荐

  • 有没有优化 R 性能的文档? [复制]

    这个问题在这里已经有答案了 我对 R 相当陌生 令我印象深刻的一件事是它运行得相当慢 有没有优化R的文档 比如优化Python描述的很好here http wiki python org moin PythonSpeed Performan
  • 防止/禁用 Xcode 滚动导航

    每当我在故事板模式下使用 Xcode 时 我都会用触控板滚动 如果我向左滚动太远 Xcode 会将我带到我正在处理的最后一个 m h 文件 这太令人沮丧了 我不希望能够向左或向右滑动两根手指来在 Xcode 中导航 但我真的很喜欢 Safa
  • 将 .git 文件夹在工作树层次结构中向上移动

    昨天 我在 git 存储库上执行了其中一项操作 请参阅下面的代码片段 以便有效地将我的项目向上移动文件夹层次结构中的几个文件夹 这基本上列出了所有文件并向它们添加前缀文件夹名称并相应地更新索引 旧布局 Root Sublevel 1 Sub
  • 为什么我的应用没有在 Google Play 上显示?刚刚发布

    我只是第一次尝试发布我的应用程序 我完成了开发者控制台上的步骤 它现在显示 已发布 并带有绿色复选标记 在我点击 激活 和 发布 后 没有错误 然而 我尝试在手机 平板电脑和 Chrome 浏览器上的 Google Play 商店 称为 U
  • 将 PHP 多维数组返回到 Javascript/AJAX

    我的理解是 为了将复杂的 PHP 变量返回给 Javascript 应该通过 AJAX 和 json encode 来完成 有人能给我一个实际的例子 PHP 和 Javascript 代码 吗 假设我们在 PHP 中有一个两维数组 twoD
  • Firebase 字段名称会自动更改吗?

    你好 firebase 开始自动更改我的字段名称 这造成了一个大问题 我怎么解决这个问题 My Class public class TUser private String UserKey private String LicenceKe
  • C# 4 中会有通用属性吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 备份文件关闭Excel VBA

    我希望 Excel 在文件关闭时自动备份工作簿 而不提示用户 我在网上找到了下面的优秀代码 忘记源代码 但备份文件类型正在更改为我无法打开的 BAK 文件 我该如何解决这个问题 两个文件将位于同一文件夹中 备份应具有相同的文件名和 bak
  • 函数模板特化编译错误

    A hh template
  • 检索 ODBC 表并插入 SQL Server CE 数据库

    我有一个到数据库的 ODBC 连接 我需要其中的一个数据表 该表大约有 20 行和几千行数据 我打算将此表插入到我的本地 SQL Server CE 数据库中 以便进一步使用它 两种连接都经过测试并且可以工作 我的尝试是只插入一列以使事情变
  • 创建与 .accdb 访问文件的连接

    我已经上这门课几天了 现在正在网上搜索试图找到解决方案 我在这里尝试做的是使用扩展名连接到 Access 2010 数据库 accdb我已经成功连接到旧数据库的扩展 mdb但不是 accdb 我尝试卸载 Office 并重新安装 x64 版
  • Zend 反向匹配路由返回当前 URL

    我正在使用 Zend Framework 并尝试设置一些自定义路由 这些在调度期间似乎工作正常 但反向匹配根本不起作用 这些是我设置的路线 router gt addRoute category new Zend Controller Ro
  • 用于获取 netstat -s 统计信息的 Windows API [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在搜索一个 Windows API 它返回与 netstat s 相同的统计信息 您可以使用Get
  • 如何将以 HTML 编写的 SVG 保存为 SVG 文件? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 以下 SVG 代码写入 HTML 文
  • 只读可见目录的文件名

    我试图读取文件夹的文件名并将它们保存在数组列表中 但我在数组中得到了我不想要的不可见文件名 实际上我只想保存 txt 文件名 有谁知道在创建列表之前如何在代码中更改它 String pathLevel Users MaxRuizTagle
  • 如何在 Oracle PLSQL 中将数字的小数位数扩展到最少?

    我不知道如何选择以下内容 123 gt 123 00000 123 12 gt 123 12000 123 123456 gt 123 123456 我想将小数位数扩展到例如 5 位小数 最少 如果根本没有小数位 则应该有 5 个零 小数点
  • 此更新、选择组合查询线程安全吗?

    我有一张名为席位的桌子 其架构如下 id taken 对于每个用户 我随机选取一个未采取的 id 并分配给该用户 这里为简单起见 我将采取 1 我正在使用的查询 update seats u inner join SELECT id fro
  • Prolog 变量查询中的“\+”问题

    我正在读 七周七种语言 atm 我对一些 Prolog 查询感到困惑 我不明白对 否 的回答 The friends pl文件看起来像这样 likes wallace cheese likes grommit cheese likes we
  • http header 和 html meta 中的字符集有什么区别?

    您可以在 http 响应标头中发送字符集 也可以在发送的 html 文件中定义字符集 如果这两个字符集不同会发生什么 浏览器如何使用在 http 标头中收到的字符集以及它在 html 文件本身中提供的字符集有何关系 HTML 4 01 规范
  • 有没有办法以编程方式清除 EXCEL VBA 事件队列?

    有没有办法以编程方式清除 EXCEL VBA 事件队列 在 EXCEL VBA 中 当更改工作表单元格然后用户按 ENTER 提交单元格编辑时 工作表级别会发生两个事件 他们是 私有子工作表 更改 ByVal 目标作为范围 私有子工作表 S