2009-11-16 2 views
3

У меня головоломка. Там, где я работаю, существует огромное количество шаблонов Word, в которых все содержит дескриптор события autonew, который содержит некоторые ошибки. И эта ошибка лежит во всех шаблонах. И мне было интересно, может ли быть способ сканирования каталога для шаблонов, который содержит этот макрос, и немного изменить макрокод?vba - просмотреть документы для макроса и заменить текст макроса?

Возможно ли это?

ответ

8

Да, вы можете это сделать. Вы можете получить доступ к проекту VBA любого документа с помощью:

Application.VBE.ActiveVBProject.VBComponents 

Ваш проект должен иметь ссылку на «Microsoft Visual Basic для приложений расширяемости».

Для запуска кода, вы должны включить "Доверять доступ к Visual Basic Project" вариант в Word, используя

Инструменты-> Макро-> Безопасность (Trusted вкладка Publishers)

Коллекция VBComponents содержит все стандартные модули, модули классов, формы и «документы», которые содержит проект. Если вы Google, вы найдете много информации о том, как получить доступ к ним или изменить их.

EDIT: OK, подробная информация. Этот метод будет искать все VbComponents документа, ищущего метод с указанным именем, и выполнить поиск/замену в пределах первого найденного.

Public Sub ReplaceInProject(ByVal oDocument As Document, ByVal strMethodName As String, ByVal strFindText As String, ByVal strReplaceWithText As String) 

    ' For each module (of any type - could use oVbComponent.Type to restrict 
    ' this to certain types of module) 

    Dim oVbComponent As VBComponent 
    For Each oVbComponent In oDocument.VBProject.VBComponents 

     Dim oCodeModule As CodeModule 
     Set oCodeModule = oVbComponent.CodeModule 

     ' See if we can find the method in this module 

     Dim ixStartLine As Long 
     ixStartLine = FindMethodStartLine(oCodeModule, strMethodName) 

     If ixStartLine > 0 Then 

      ' Get all the text of the method 

      Dim numLines As Long 
      numLines = oCodeModule.ProcCountLines(strMethodName, vbext_pk_Proc) 

      Dim strLines As String 
      strLines = oCodeModule.Lines(ixStartLine, numLines) 

      ' Do the find/replace 

      strLines = Replace(strLines, strFindText, strReplaceWithText) 

      ' Replace the method text. 

      oCodeModule.DeleteLines ixStartLine, numLines 

      oCodeModule.InsertLines ixStartLine, strLines 

     End If 

    Next oVbComponent 

End Sub 

Private Function FindMethodStartLine(ByVal oCodeModule As CodeModule, ByVal strMethodName As String) As Long 

    FindMethodStartLine = 0 

    ' ProcStartLine will raise an error if the method is not found; 
    ' we'll just ignore the error and return -1 

    On Error Resume Next 
    FindMethodStartLine = oCodeModule.ProcStartLine(strMethodName, vbext_pk_Proc) 

End Function 

Обратите внимание, что это будет работать только с Sub и Function методами, а не собственность Get/Set/Let, потому что я использую vbext_pk_Proc. Это PITA, что вам нужно быть откровенным об этом. Честно говоря, весь API для компонента CodeModule кажется почти спроектированным, чтобы расстроить. Например, в то время как объект VbComponent имеет метод Find (который, по вашему мнению, был бы удобным способом поиска текста, который вы ищете), он фактически возвращает True или False (!). Полезно, я не думаю!

У дизайнеров этого API должно было быть действительно плохое похмелье, когда они это делали.

+0

Спасибо :) Итак, я добавил это в свой проект и импортировал Microsoft.Vbe.Interop, но знаете ли вы, как я могу загрузить макрос из документа Word в текстовое поле в моем проекте Visual Studio? А затем отредактируйте текст, а затем сохраните его снова? Или было бы лучше сгенерировать файл Word с помощью макроса, а затем просто скопировать макрос из этого документа на следующий? –

+0

Thanx для обновления! Прекрасно работает! :) –

Смежные вопросы