2010-10-18 5 views
1

Voici mon code:macros Lire fichier externe rapidement

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 

Le problème est que je peux retourner le nom de toutes les macros dans un fichier associé, mais il est terriblement inefficace. Cela prend @ 2 minutes pour 85 noms de macros. C'est parce que le programme lit chaque ligne de chaque module (CountOfLines). J'espérais juste qu'il pourrait y avoir de la magie qui pourrait être exécutée dans mon autre déclaration. Si la macro actuelle est la même que newmacro, passez juste à quand ils sont différents. Je ne suis pas sûr que ce soit possible. Sinon, existe-t-il une meilleure méthode à utiliser que CountOfLines?

Répondre

0

Un problème que vous avez est que ProcKind est une sortie, pas une entrée, vous devez d'abord créer une variable comme ceci:

Dim ProcKind As VBIDE.vbext_ProcKind 

Ensuite, votre déclaration sera

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

Le vraie réponse est que vous n'avez pas besoin de passer par chaque ligne, vous pouvez passer de 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

Le code here tire tous les noms de macro (39) dans le fichier sur lequel je travaille presque instantanément. Ne peux-tu pas l'adapter à la place?