使运行缓慢的宏运行更快更有效

时间:2015-05-06 17:13:40

标签: vba ms-word word-vba

我创建了一个宏,它插入一个标准的公司分类,表明文档中的信息是非分类的,但是“仅供官方使用”。这表示为(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的新手,我无法理解为什么这行代码有问题。代码似乎产生了远远超过必要的调用。

1 个答案:

答案 0 :(得分:0)

以下代码应该更快,因为:

  1. Do While已更改为For,这样您就可以计算一次段落的数量,并且您永远不会返回到计算中。如果您有Do While Not para Is Nothing,则必须在每次迭代中确定Not para Is Nothing
  2. 减去Set;在迭代的主要部分中没有Set。这些陈述增加了一些时间负担。
  3. 在每次迭代中都没有MyText = "(U//FOUO) "。相反,你通过使它成为一个常量(常量通常比通常的字符串更快)在开头一次并永远地说明它。
  4. 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