在Word中加速VBA循环

时间:2015-08-20 12:26:41

标签: performance vba loops ms-word word-vba

我的代码获得了某些标题1的开头,但它的速度非常慢! 有什么办法可以加快速度吗? 这也是为什么?根据Java的经验,我知道" for循环"比较快。
我唯一的想法是它必须遍历OOXML而不是文本,因此还有更多要经历的内容......或者单词是否具有较少的处理能力?
在VBA中是否应该为这种类型的案例使用不同的循环?甚至还有其他什么东西在一起?

For Each OO In ActiveDocument.Paragraphs
    If InStr(OO.Style, "Unnumbered") = 0 Then
        If InStr(OO.Style, "Heading 1") > 0 And InStr(Left(OO.Range.Text, Len(OO.Range.Text) - 1), "PRODUCT") > 0 And InStr(Left(OO.Range.Text, Len(OO.Range.Text) - 1), "OVERVIEW") > 0 Then
            Header1(1) = OO.Range.start
            MsgBox (Header1(1))
        ElseIf InStr(OO.Style, "Heading 1") > 0 And InStr(Left(OO.Range.Text, Len(OO.Range.Text) - 1), "SAFETY") > 0 Then
            Header1(2) = OO.Range.start
            MsgBox (Header1(2))
        ElseIf InStr(OO.Style, "Heading 1") > 0 And InStr(Left(OO.Range.Text, Len(OO.Range.Text) - 1), "PHARMACOVIGILANCE PLAN") > 0 Then
            Header1(3) = OO.Range.start
            MsgBox (Header1(3))
        ElseIf InStr(OO.Style, "Heading 1") > 0 _
                And InStr(Left(OO.Range.Text, Len(OO.Range.Text) - 1), "EFFICACY") > 0 Then
            Header1(4) = OO.Range.start
            MsgBox (Header1(4))
        ElseIf InStr(OO.Style, "Heading 1") > 0 And InStr(Left(OO.Range.Text, Len(OO.Range.Text) - 1), "MINIMISATION") > 0 Then
            Header1(5) = OO.Range.start
            MsgBox (Header1(5))
        ElseIf InStr(OO.Style, "Heading 1") > 0 And InStr(Left(OO.Range.Text, Len(OO.Range.Text) - 1), "MANAGEMENT") > 0 Then
            Header1(6) = OO.Range.start
            MsgBox (Header1(6))
        ElseIf InStr(OO.Style, "Heading 1") > 0 And InStr(Left(OO.Range.Text, Len(OO.Range.Text) - 1), "REFERENCES") > 0 Then
            Header1(7) = OO.Range.start
            Header1(8) = OO.Range.End
            MsgBox (Header1(7))
            MsgBox (Header1(8))
            End If
    End If
Next OO

1 个答案:

答案 0 :(得分:1)

这段代码让我觉得它只是在循环的一次迭代中一遍又一遍地评估同样的事情。

这是InStr(00.Style,“Heading 1”)>每个ElseIf评估0。如左(00.Range.Text,Len(00.Range.Text) - 1)。如果第一个If没有计算为True,那么下一行会做同样的事情。接下来。等等。

因此,我对加快这个问题的建议是:

1 - 在包含Left(00.Range.Text,Len(00.Range.Text) - 1)的If语句之前在循环中放置一个变量,并在If /中更改所有对比较的引用ElseIf指向该变量的子句。

2 - InStr(00.Style,“Heading 1”)>每行都有0。将其移动到一个单独的包含If,与If中的其他InStr比较。

3 - 很久以前我读到“<> 0”比VB的“> 0”快。不确定这是否仍然适用于VBA。

4 - 安排你的If / ElseIfs,以便最不可能的匹配出现在不太可能的匹配之前。

您的代码看起来像这样:

Dim head1, x as Integer

For Each OO In ActiveDocument.Paragraphs

If InStr(OO.Style, "Unnumbered") = 0 Then
    head1 = Instr(OO.Style, "Heading 1")

    if head1 <> 0 then
      x = Left(OO.Range.Text, Len(OO.Range.Text) - 1)

      If InStr(x, "PRODUCT") < > 0 And InStr(Left(OO.Range.Text, Len(OO.Range.Text) - 1), "OVERVIEW") <> 0 Then
        Header1(1) = OO.Range.start
        MsgBox (Header1(1))
      ElseIf InStr(x, "SAFETY") < > 0 Then
        Header1(2) = OO.Range.start
        MsgBox (Header1(2))
      ElseIf InStr(x, "PHARMACOVIGILANCE PLAN") < > 0 Then
        Header1(3) = OO.Range.start
        MsgBox (Header1(3))
      ElseIf InStr(x, "EFFICACY") < > 0 Then
        Header1(4) = OO.Range.start
        MsgBox (Header1(4))
      ElseIf InStr(x, "MINIMISATION") < > 0 Then
        Header1(5) = OO.Range.start
        MsgBox (Header1(5))
      ElseIf InStr(x, "MANAGEMENT") < > 0 Then
        Header1(6) = OO.Range.start
        MsgBox (Header1(6))
      ElseIf InStr(x, "REFERENCES") < > 0 Then
        Header1(7) = OO.Range.start
        Header1(8) = OO.Range.End
        MsgBox (Header1(7))
        MsgBox (Header1(8))
      End If
    End If
End If

Next OO 

自从我使用VBA已经有一段时间了,所以这可能有点过时了。