为什么从标准模块(而不是用户窗体)调用 VBA 代码时运行速度更快?

2023-12-02

Alternate Title: Why does pressing Esc make my MS-Word macro run faster

在等待一些代码运行时,我偶然发现了一些有趣的事情。

Code runs slow... press Esc code runs fast. Example:

  • press Esc immediately after execution - 2 sec to complete
  • don't press Esc at all - up to 30 sec to complete

对我来说这毫无意义。事实证明其他人也注意到了类似的行为,例如:

  • 暂停 VBA 并重新运行它会导致执行速度更快

  • http://www.vbforums.com/showthread.php?490446-ESC-key-while-running-macros

  • https://www.excelforum.com/excel-programming-vba-macros/617300-vba-code-runs-slow-until-i-push-esc.html

And they have found various solutions or workarounds. However, these posts are for MS-Excel; which it seems has different behavior for the Esc key.

In MS-Excel pressing the Esc key can (depending on the setting of Application.EnableCancleKey) interrupt code or raise an error (Err 18), or do nothing. On the other hand in MS Word no such thing happens, instead Application.EnableCancleKey alters the behavior of Ctrl + Pause. Yet despite this, pressing the Esc speeds up the code execution dramatically.

除了这种差异之外,我的问题更多地与用户窗体中的代码放置有关。例如在我的用户表单中:

Private Sub Cmd_Click()

    Module1.Macro1
    Module1.Macro2
    Module1.Macro3

End Sub

在 64 位版本的 Word 2010 上测试,使用上面的结构明显比这个慢:

用户表单:

Private Sub Cmd_Click()

    Module1.RunMacro123

End Sub

标准模块:

Private Sub RunMacro123()

    Module1.Macro1
    Module1.Macro2
    Module1.Macro3

End Sub

我应该注意以下几点:

  1. 这在 64 位版本的 MS Word 中最为明显,32 位版本似乎使用原始代码运行得相当快(我还没有使用修改后的代码进行测试)
  2. 就像第一个链接中的作者一样,我没有使用选择对象等。
  3. I'm more interested any insights as to why the speed of code execution is so influenced by:
    • pressing Esc
    • 将调用从用户窗体转移到标准模块
  4. Macro1、Macro2 和 Macro3 创建和编辑文档样式(FWIW)涉及多次读取 INI 文件

On a side note, in a hair-brained attempt at being clever I tried using sendKeys to send the Esc key but it has no affect.

编辑 - 代码计时结果:

我最终使用计时器函数来计时代码,我已经实现了一个堆栈类,该类是从这里改编的:http://www.tek-tips.com/viewthread.cfm?qid=1468970

我添加了一个“绝对”计时器(debug.print timer - startTime)到调用堆栈,以便记录每次推送之间的时间并重置计时器(startTime = timer)在每次弹出。这样做可以使在 NotePad++ 中比较时间变得更容易

这使我能够确定将样式应用于文档的子程序花费了约 0.04 秒的时间来应用样式(计时器返回的 NB 值 = 午夜过后的秒数)。

The image below shows an example of the code timing results. Basically, as far as I can tell, the delay in code execution comes from many incremental delays all associated with the same basic task. Comparing code execution times in NotePad++

由于计时器与调用堆栈的工作方式,我必须测试代码getStyleElement以确保它不会对加时赛产生重大影响。我通过直接对代码计时来做到这一点,并能够确认它的运行速度始终很快。

检查其余代码确认问题出在applyStyleFormat(这称为getStyleElement).

样式应用于文档 - 代码结构包括 With 块和 For 循环;像这样的东西:

For i = 1 to Styles.Count
    With aDocument.Styles(i)
        .Font.??? = Something
        ' or .Paragraph.??? = Something
    End With
Next i

I'm no clearer as to why the code runs faster from outside of the userform, or after pressing Esc but it does and it seems to have something to do with modifying styles...


只是在@Florent Bs 评论上拉动线程,您是否尝试过在单击事件中运行宏之前查看可以禁用的内容?像

Application.EnableEvents = False
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

'code
Module1.Macro1
Module1.Macro2
Module1.Macro3

Application.EnableEvents = True
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic

只是为了看看事情是否更快?可能还有其他命令可以取消人们可以添加的其他内容。

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

为什么从标准模块(而不是用户窗体)调用 VBA 代码时运行速度更快? 的相关文章

  • ReDim 保留“下标超出范围”

    我正在尝试将数据从 2 个双精度数组移动到 2 个不同的双精度数组 我不确定大小是多少 因为我正在从第一个数组中随机抽取样本并将其放入第二个数组中 当我添加 ReDim Preserve 行时 出现下标超出范围错误 Function Cre
  • xlrd 读取 xls XLRDError:不支持的格式或损坏的文件:预期的 BOF 记录;找到“\r\n”

    这是代码 xls open workbook data xls 作为回报 File home woles P2 fin fin apps data container importer py line 16 in import data x
  • 合并数据框中的值以写入 Excel

    我有一个看起来像的数据框 column1 column2 column3 colum4 column5 1 r n 1 r s 1 r n 2 r s 3 r n 3 2 r n 1 r s 1 r n 4 r s 4 r n 5 3 r
  • 在一个单元格中显示两个日期

    我正在尝试在 Excel 的一个单元格中显示两个日期 我使用了以下公式 DATE YEAR NOW MONTH NOW I1 DATE YEAR NOW MONTH NOW I15 其中I1和I15的值分别为1和15 我选择这个公式的原因是
  • 如何使用 Microsoft.Office.Interop.Word 将光标移动到特定段落?

    我们正在开发C Net 4 0基于 Windows 窗体的应用程序使用Microsoft Office Interop Word参考 现在我想将光标的位置移动到特定段落 我怎么做呢 void MoveToParagraph Microsof
  • 在 Nodejs/javascript 中的 Excel 中创建动态数量的列或标题

    我用过exceljsNodejs中用于将json数据导出到excel的模块 它工作正常 但必须在添加行之前预定义标题 列的名称 即列是固定的 添加行后 我无法动态添加列 我尝试了许多通过 npm 提供的模块 但它们都具有相同的功能 那么 有
  • 调用 UDF 时公式中使用的值的数据类型错误

    我一直在努力找出这里出了什么问题 我有两个包含字符串值的列 我使用第三列调用工作表中的 UDF 但最终得到 Value 并出现错误 公式中使用的值的数据类型错误 Eg Col I Col J File1 Y File1 N File2 Y
  • 在 Access VBA 中获取 Combobox.Value

    我有这个代码 If Me Combobox Value My Text Then 然而 由于我想测试 我的文本 是否是唯一选择的值 因此跳过了条件 我也尝试过 Me Combobox Column 1 and Me Combobox Tex
  • 提高此 Excel 公式性能的最快方法是什么?

    这是从下面的帖子更进一步的内容 如何克服Excel中公式的最大长度限制 excel的一个bug https stackoverflow com questions 32604740 how to overcome the max lengt
  • 如果工作表不存在,Pandas 将工作表附加到工作簿,否则覆盖工作表

    我正在使用 pandas 更新现有的 Excel 工作簿 当使用ExcelWriter对象 我可以覆盖工作表 如果存在 否则创建一个新工作表吗 我的代码附加了新工作表 但是当我尝试覆盖现有工作表时 它会附加一个名称略有不同的新工作表 例如
  • MS Office SaveAs 类型 FileDialog 在 vb 中带有过滤器

    我想创建一个带有过滤器的 另存为 文件对话框 但这似乎无法使用 FileDialog 类 Microsoft Office 12 0 对象库 实现 文档实际上提到了这一点here http msdn microsoft com en us
  • 如何用线条在一个Excel散点图中绘制多个分组数据

    我在 Excel 中的一张图表 带线的散点图 中绘制分组数据 按索引 时遇到一些困难 我将非常感谢您的帮助 我的数据分为三列 第一列是数据或组的索引 即每组数据的唯一编号 第二列是时间 第三列是数据 Group Time Data 1 1
  • 如何自动将图表从 Excel(或 Calc)导出为 PNG

    问题 我正在开发一个 Web 应用程序 它将数据从数据库导出到 Excel 包括图表 这首先是导出的主要原因 现在我希望图表在网页上也可见 而不需要导出数据并打开下载的 Excel 文件 这当然可以使用 JS 库来完成 但是由于图表相当复杂
  • 将 Excel 文件导入 Access 时更改数据类型

    将 Excel 文件导入 Access 时 有什么方法可以更改默认数据类型吗 顺便说一下 我使用的是 Access 2003 我知道有时我可以自由地将任何数据类型分配给正在导入的每个列 但这只能在我导入非 Excel 文件时进行 EDIT
  • 当应用程序继续运行时,如何清理 .NET 中的 COM 引用?

    我正在开发一个 NET 程序 该程序启动 Excel 的新实例 执行一些工作 然后结束 但必须让 Excel 保持运行 稍后 当程序再次运行时 它将尝试挂钩到前一个实例 在这种情况下处理 COM 对象释放的最佳方法是什么 如果我第一次没有对
  • 使用 SpreadsheetLight 进行行计数

    我正在寻找一个类似于 DataTable Rows Count 的函数 它可以与 SLDocument 一起使用来找出有多少行中有数据 SpreadsheetLight 中有可用的东西吗 还有其他方法可以实现这一目标吗 Brendan SL
  • 如果单元格包含 1 个或多个关键字,则更改不同单元格的值

    我有一个列 其中包含一些字符串描述 例如 Bob davids mowing the lawn tipping cows 此外 我将在不同的工作表或列上列出关键字列表 例如工作关键字列表1 davids work 播放关键字列表 mowin
  • Excel的解析路径

    其实我想问以下问题 对于位于 目录中定义的 PATH 怎么能 我找出这些目录中的哪个 找到了 因为我需要使用 Process Run 从 C 运行 Excel 并且只需指示 Excel 即可正常工作 Windows 似乎知道在哪里可以找到它
  • Excel动态数组运行重复项计数

    我一直在重新设计一些旧的电子表格工具 以便使用 Excel 的较新工具来过滤和格式化动态数据输出动态数组公式 https support microsoft com en us office dynamic array formulas a
  • 在 Excel 中的文件夹内的所有文件上添加一列

    我在一个文件夹内有 250 个不同的 excel 文件 具有相同的布局 其中包含列A to F 我需要在列上添加新列G 传统的方法是打开每个文件并在以下位置添加新列G 有没有使用 Excel 宏或任何其他工具的简单过程来完成此任务 这个链接

随机推荐

  • 从 Android 应用程序向 Google Assistant 发送命令

    为了提高效率 我想通过脚本从 Android 应用程序向 Google Assistant 发送常用命令 例如 好吧 谷歌 这是我用于从服务调用 Assistant 的代码 startActivity new Intent Intent A
  • 确定 Active Directory 搜索结果中用户的域[重复]

    这个问题在这里已经有答案了 可能的重复 如何从 AD DirectoryEntry 获取 DOMAIN USER 这是我现在所拥有的 DirectoryEntry de new DirectoryEntry LDAP domain Sear
  • 我们应该在链接的绝对路径中使用正斜杠 / 或反斜杠 \ 吗?

    所有这些链接的绝对路径都运行良好 img src alt img src alt img src alt 但我应该使用哪一个呢 推荐的是哪一款呢 它们之间有什么区别 URL 使用正斜杠 在所有平台上 反斜杠 用于 Windows 上的本地文
  • 如何确保一个事件只订阅一次

    我想确保我只在特定类中订阅实例上的事件一次 例如 我希望能够执行以下操作 if not already subscribed member Event new MemeberClass Delegate handler 我将如何实施这样的警
  • angularjs - 测试控制器

    我刚刚开始使用 Angular 我想为我的控制器编写一些简单的单元测试 这就是我得到的 app js use strict Declare app level module which depends on filters and serv
  • 一步步在 macOS 上编写 hello world

    我在 mac os x86 64 架构 的汇编方面遇到了很大的困难 我想向您介绍 hello world 程序的解释 如果您能向我提供反馈意见以及建议和解释 我将不胜感激 话虽如此 让我们进入代码 你好世界程序 Never felt the
  • 使用条件格式按类别交替设置数据格式

    我有一个电子表格 其中有很多行 如下所示 Name ID Category Attributes name0 753 cat1 name1 724 cat1 name2 149 cat1 name3 265 cat1 name4 032 c
  • 在 C 风格方法中访问实例变量

    有人可以确认您无法从同一类的 C 风格函数中访问 Objective C implementation 块中定义的实例变量吗 编译器抛出错误 提示 XXX 未声明 其中 XXX 是实例变量名称 这是我要解释的示例 interface Fon
  • 通过 Actionscript 3.0 使用 HTTP POST 上传 zip 文件

    我有一个 zip 文件 该文件是通过在桌面 Flex 4 6 应用程序中的视图上拖放而创建的 这会触发自动上传 zip 文件的服务 我可以使用以下代码将有关 zip 文件的元数据发送到服务器 var urlRequest URLReques
  • 在 Symfony 2.8、3.0 及更高版本中将数据传递给 buildForm()

    我的应用程序当前使用构造函数将数据传递到我的表单类型 如中所建议的这个答案 但是 那Symfony 2 8 升级指南建议将类型实例传递给createForm函数已弃用 将类型实例传递给 Form add FormBuilder add 和
  • Google Maps API v3 - infoWindows 均具有相同的内容

    我在使用 infoWindows 和 Google Maps API v3 时遇到了问题 最初 我遇到了其他人在打开新窗口时关闭 infoWindows 的问题 我想通过预先定义 infowindow 来解决这个问题 现在 当我单击新标记时
  • file_get_contents 脚本适用于某些网站,但不适用于其他网站

    我正在寻找构建一个 PHP 脚本来解析 HTML 中的特定标签 我一直在使用这个代码块 改编自这个tutorial 该脚本适用于某些网站 例如上面的 google 但是当我尝试使用其他网站 例如 freshdirect 时 我收到此错误 警
  • pyplot散点图标记大小

    在散点图的 pyplot 文档中 matplotlib pyplot scatter x y s 20 c b marker o cmap None norm None vmin None vmax None alpha None line
  • 我想在 React 的画布上录制视频

    我查了很久 觉得有必要在这里问一下 我之前使用的 npm 包什么也没做 有人曾经做过或经历过这样的应用吗 我想做的就是在画布元素上绘图时将其录制为视频 提前致谢 是的 您可以使用媒体流 捕获流 and 媒体记录器为了那个原因 下面是一个示例
  • VBA执行字符串中的代码

    我正在尝试执行字符串内的 vba 代码 而不将代码写入临时文件中 例如 Dim code As String code n 0 e i e 0 For e i e 0 To 100 n 1 Next 我尝试过 Eval Evaluate R
  • 如何更改行尾约定?

    我有一个我认为很简单的任务 我需要创建一个在行尾使用 unix LF 约定的文本文件 然而 当我尝试使用 pandas to csv 来完成此操作时 我最终得到了 CR LF 如果我留在我的机器上并且我使用 python 来处理所有事情 这
  • 动态创建电子表格菜单项

    我正在尝试使用 Google Apps 脚本在 Google 表格中创建动态填充的菜单 我有一张 课程 表 其中列出了我教授的课程 在运行我的脚本时 我让脚本读取这些类并将其加载到数组中 为了仅在原始 类 表中硬编码值 我想为每个类创建一个
  • Google 地图自定义信息框

    我正在尝试按照此示例合并自定义信息框 但我的代码不起作用 有人可以看一下我哪里出错了吗 我已经评论了示例代码的开始 结束位置以及我试图调用它的位置 function initialize var mapOptions zoom 12 cen
  • IntelliJ IDEA 中代码生成的自定义

    我使用 IntelliJ IDEA 12 我可以自定义使用 重构 功能生成的代码吗 例如 我想更改设置生成 封装字段 的模板 public void setField String field this field field to pub
  • 为什么从标准模块(而不是用户窗体)调用 VBA 代码时运行速度更快?

    Alternate Title Why does pressing Esc make my MS Word macro run faster 在等待一些代码运行时 我偶然发现了一些有趣的事情 Code runs slow press Esc