【问题标题】:Making a slow running macro run more quickly and efficiently使运行缓慢的宏运行得更快更有效
【发布时间】:2015-05-06 17:13:40
【问题描述】:

我创建了一个插入标准公司分类的宏,该分类指示文档中的信息未分类但“仅供官方使用”。这表示为 (U//FOUO),出现在每个正文段落之前。我还创建了一个宏,它在使用本书的每一级编号标题之前插入相同的文本表达式。我的书是一个大的(约 665 页)Microsoft Word 文件。它也非常“密集”,有许多段落、表格和插图。尽管我的宏运行成功,但它们非常慢,大约需要 6 到 10 分钟才能完成。宏完成后,会显示运行时错误“28”(堆栈空间不足)。我不知道时间的长短是我编码效率低下的结果还是书的密度/复杂性/长度的反映。

您能否建议更改以下代码以使其更高效地运行?或者也许只是表明“延迟”是否可能只是文档长度的自然和预期结果?我的代码如下:

Public Sub InsertFOUObody()

    'Inserts U//FOUO before all body paragraphs
    Dim doc As Document
    Dim para As Paragraph
    Dim paraNext As Paragraph
    Dim MyText As String
    Set doc = ActiveDocument
    Set para = doc.Paragraphs.First

    Do While Not para Is Nothing
        Set paraNext = para.Next
        MyText = "(U//FOUO) "
        If para.Style = doc.Styles(wdStyleBodyText) Then
            para.Range.InsertBefore (MyText)
        End If
        Set para = paraNext
    Loop

End Sub

当我尝试调试代码时,我觉得有问题的行是Set paraNext = para.next。但是,作为 VBA 的新手,我无法理解为什么这行代码有问题。该代码似乎产生了比必要更多的调用。

【问题讨论】:

  • 从外观上看,您可能需要在此子例程运行时禁用屏幕更新。

标签: vba ms-word


【解决方案1】:

下面的代码应该更快,因为:

  1. Do While 已更改为 For,这样您只需计算一次段落数,就不会返回计算。当你有Do While Not para Is Nothing 时,在每次迭代中你必须确保Not para Is Nothing
  2. 少了Set;在迭代的主要部分中没有Set。这些陈述增加了一些时间负担。
  3. 您不会在每次迭代中MyText = "(U//FOUO) "。相反,您可以在开始时将其设为常量(常量通常比通常的字符串更快)来声明它。

Public Sub InsertFOUObody2()

    'Inserts U//FOUO before all body paragraphs
    Const MyText As String = "(U//FOUO) "
    Dim i As Long
    Dim doc As Document
    Set doc = ActiveDocument

    For i = 1 To doc.Paragraphs.Count
        With doc.Paragraphs(i)
            If .Style = doc.Styles(wdStyleBodyText) Then
                .Range.InsertBefore (MyText)
            End If
        End With
    Next

End Sub

【讨论】:

  • 非常感谢 ZygD。我非常感谢您在回复中花费的时间。我的工作日快结束了,但我明天早上会试试你的宏。我也感谢您在上面 1、2、3 中的“教育”分析。我正在努力达到我可以识别更好的方法的地步,并且您的 cmets 在长期努力中帮助我。我会让你知道更改后的宏是如何执行的。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-29
  • 1970-01-01
  • 1970-01-01
  • 2011-05-10
  • 2014-11-28
相关资源
最近更新 更多