我的代码获得了某些标题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
答案 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已经有一段时间了,所以这可能有点过时了。