快速读取外部文件中的宏

时间:2010-10-18 09:35:03

标签: performance vba optimization ms-office

这是我的代码:

    For Each pj In wdApp.Application.VBE.VBProjects
       x = pj.FileName
       y = pj.Protection
        If x <> "" Then
          If y <> "1" Then
             For Each vbcomp In pj.VBComponents
                For i = 1 To vbcomp.CodeModule.CountOfLines
                   newMacro = vbcomp.CodeModule.ProcOfLine(Line:=i, prockind:=vbext_pk_Proc)                    
                   If curMacro <> newMacro Then
                      curMacro = newMacro
                      cboMacros.AddItem (curMacro)
                      Debug.Print curMacro
                   Else: newMacro = Null 
                   End If
                Next
             Next
         End If
         Selection.InsertAfter vbCr
       End If
       x = ""
    Next
    Selection.Collapse wdCollapseEnd
    End Sub

问题是我可以返回关联文件中所有宏的名称,但效率非常低。 85个宏名称需要2分钟。这是因为程序读取每个模块的每一行(CountOfLines)。我只是希望可能有一些魔法可以在我的其他声明中执行。如果当前宏与newmacro相同,那么只要它们不同就跳过。我不确定这是否可行。如果没有,是否有比CountOfLines更好的方法?

2 个答案:

答案 0 :(得分:0)

代码here在我正在处理的文件中拉出所有宏名称(39)。你不能改编它吗?

答案 1 :(得分:0)

你遇到的一个问题是ProcKind是输出而不是输入,所以你首先需要创建一个这样的变量:

Dim ProcKind As VBIDE.vbext_ProcKind

然后你的陈述将是

newMacro = vbcomp.CodeModule.ProcOfLine(Line:=i, prockind)

真正的答案是你不需要经历每一行,你可以跳过proc到proc:

             For Each vbcomp In pj.VBComponents
                With vbcomp.CodeModule
                myStartLine = .CountOfDeclarationLines + 1
                While myStartLine < .CountOfLines
                  newMacro = .ProcOfLine(i,prockind)
                  numLines = .ProcCountLines(newMacro,vbext_pk_Proc)   
                  If curMacro <> newMacro Then
                      curMacro = newMacro
                      cboMacros.AddItem (curMacro)
                      Debug.Print curMacro
                  Else: newMacro = Null
                  End If
                  myStartLine = myStartLine + numLines
                Wend
                End With
             Next