Изменение кода VBA в сотнях файлов Excel без открытия каждого из них - PullRequest
0 голосов
/ 27 июня 2019

У меня есть база данных из сотен отправленных форм, каждая отправленная форма содержит различные модули с кодом VBA для обработки данных.

Каждое имя файла формы начинается с того же уникального префикса.

Все формы сохраняются в нашем главном глобальном каталоге документов.

Данные из каждой формы записываются в файл журнала.

Код VBA в каждой форме позволяет мне изменять информацию в форме и отправлять обновленную информацию в журнал.

Теперь, из-за введения Office 2019, скрипты vb в каждой форме, созданной в версии 2016 года, не работают, и мне приходится принудительно менять код в каждой отдельной форме, чтобы сделать его совместимым с 2019.

Это массовое изменение требуется не только из-за изменения версии офиса, но и потому, что мне нужно обновить файл журнала, добавив дополнительную информацию, содержащуюся в ячейках форм, которые старый код VBA не обрабатывает.

В каждом файле формы есть 4 модуля VBA, и скрипты в каждом модуле должны быть заменены новым кодом.

На самом деле не знаю, с чего начать, любые идеи очень ценятся.

Понятия не имею, что попробовать.

Ожидаемый результат состоит в том, что я обновил / новый код для 4 макромодулей в настоящее время существует в сотнях файлов, которые необходимо заменить поверх старых кодов ... файлов Excel, начинающихся с общего уникального префикса.

1 Ответ

0 голосов
/ 27 июня 2019

Вы можете использовать VBA для изменения проектов VBA.Для этого необходимо установить флажок «Доверительный доступ к объектной модели проекта VBA» в Центре управления безопасностью / настройках макроса.

После этого откройте редактор VBA.Установите ссылку на «Microsoft Visual Basic для расширяемости приложений 5.3» (возможно, для вас версия отличается, я не знаю).

Теперь пара дополнительных классов становится доступной в разделебиблиотеку VBIDE и ее можно использовать для программного управления проектами VBA.(Я использую эту функцию для экспорта модулей VBA для контроля исходного кода.)

Нет простого способа изменить текст модуля, но вы можете попробовать экспортировать, удалить и повторно импортировать их, чтобы увидеть,этого уже достаточно:

Sub Test()
  Dim vbcs As VBIDE.VBComponents
  Dim vbc As VBIDE.VBComponent
  Dim filename As String

  Set vbcs = ActiveWorkbook.VBProject.VBComponents

  For Each vbc In vbcs
    Debug.Print vbc.name
    If vbc.name = "The ones you want" Then
      filename = GetFilenameFromModule(vbc)
      vbc.Export filename
      ' you could modify the file contents now if needed
      vbcs.Remove vbc
      vbcs.Import filename
    End If
  Next vbc
End Sub

Private Function GetFilenameFromModule(vbc As VBIDE.VBComponent) As String
  Select Case vbc.Type
    Case vbext_ct_ClassModule, vbext_ct_Document:
      GetFilenameFromModule = vbc.name & ".cls"
    Case vbext_ct_MSForm:
      GetFilenameFromModule = vbc.name & ".frm"
    Case vbext_ct_StdModule:
      GetFilenameFromModule = vbc.name & ".bas"
  End Select
End Function

Обязательно проверьте свойства различных объектов в отладчике или обозревателе объектов (F2), просто чтобы посмотреть, что доступно.Я не уверен, насколько хорошо это задокументировано, но он универсален и стабилен.

Чтобы легко работать с файлами в VBA, вы можете установить ссылку на «Microsoft Scripting Runtime» библиотеки и использовать FileSystemObject.

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