gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 12:09:14 25 4
gpt4 key购买 nike

替代标题:为什么按 Esc 会使我的 MS-Word 宏运行得更快

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

代码运行速度慢...按 Esc 代码运行速度很快。例子:

  • 执行后立即按 Esc - 2 秒 完成
  • 根本不要按 Esc - 最多 30 秒 完成

  • 对我来说这毫无意义。事实证明,其他人也注意到了类似的行为,例如:
  • Pausing VBA and re-running it causes faster execution
  • 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

  • 他们找到了各种解决方案或解决方法。 但是 ,这些帖子适用于 MS-Excel; Esc 键似乎具有不同的行为。

    In MS-Excel pressing the Esc key 可以(取决于 Application.EnableCancleKey 的设置)中断代码或引发错误(Err 18),或者什么也不做。另一方面 in MS Word no such thing happens ,而不是 Application.EnableCancleKey 改变 Ctrl + Pause 的行为。然而尽管如此,按下 Esc 会显着加快代码执行速度。

    除了这种差异之外,我的问题更多地与用户表单中的代码位置有关。例如在我的用户表单中:
    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

    我应该注意以下几点:
  • 这在 64 位版本的 MS Word 中最为明显,32 位版本使用原始代码似乎运行得相当快(我还没有用修改后的代码进行测试)
  • 和第一个链接中的作者一样,我没有使用选择对象等。
  • 我更感兴趣的是为什么代码执行速度会受到以下因素的影响:
  • 按 Esc
  • 将调用从用户窗体移动到标准模块
  • Macro1、Macro2 和 Macro3 创建和编辑文档样式并且(FWIW)涉及多次读取 INI 文件

  • 在旁注 中,为了聪明,我尝试使用 sendKeys 发送 Esc 键,但它没有任何影响。

    编辑 - 计时代码的结果:

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

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

    这使我可以确定将样式应用于文档的子应用样式大约需要 0.04 秒(计时器返回的 NB 值 = 午夜过后的秒数)。

    下图显示了代码时序结果的示例。基本上,据我所知,代码执行的延迟来自许多与相同基本任务相关的增量延迟。
    Comparing code execution times in NotePad++

    由于计时器与调用堆栈一起工作的方式,我不得不测试代码 getStyleElement 以确保它不会显着增加额外的时间。我通过直接对代码计时来做到这一点,并且能够确认它运行速度始终如一。

    检查其余代码确认问题出在 applyStyleFormat (调用 getStyleElement )。

    样式应用于文档 - 代码结构包括 With block 和 For 循环;像这样的东西:
    For i = 1 to Styles.Count
    With aDocument.Styles(i)
    .Font.??? = Something
    ' or .Paragraph.??? = Something
    End With
    Next i

    我不清楚为什么代码在用户窗体之外运行得更快,或者在按下 Esc 之后运行得更快,但它确实和它似乎与修改样式有关......

    最佳答案

    只是在@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

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

    关于excel - 为什么从标准模块(而不是用户窗体)调用 VBA 代码时运行得更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45326012/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com