2010-10-18 60 views
1

這裏是我的代碼:讀取宏迅速

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)。我只是希望可以在我的else語句中執行一些魔法。如果當前宏與newmacro相同,那麼只要跳到不同的位置即可。我不確定這是否可能。如果沒有,是否有比CountOfLines更好的方法?

回答

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 
0

代碼here在我正在處理的文件中幾乎立即取得所有宏名稱(39)。你能改變它嗎?你有