Быстро читать макросы из внешнего файла - PullRequest
1 голос
/ 18 октября 2010

Вот мой код:

    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?

Ответы [ 2 ]

0 голосов
/ 18 октября 2010

Одна из проблем, с которой вы столкнулись, заключается в том, что 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 голосов
/ 18 октября 2010

Код здесь извлекает все имена макросов (39) в файле, над которым я работаю, практически мгновенно. Разве вы не можете адаптировать его вместо этого?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...