Извлечь / отобразить макрос (VBA) из файлов .xls с помощью VB6 (без открытия Excel)

Я понимаю, что это можно сделать с помощью макроса Excel, см. Программно извлекать код макроса (VBA) из документов Word 2007, но я хочу здесь использовать VB6 для создания приложения, которое делает то же самое.

У меня возникла проблема с тем, как указать на книгу Excel (в приведенном выше примере используется thisworkbook.VBproject).

Можно ли выбрать любой файл .xls с жесткого диска, скажем c:\try.xls, и извлечь / показать его макросы? Пожалуйста, порекомендуйте!


person Community    schedule 21.01.2009    source источник
comment
Макросы Excel токенизированы, что затрудняет извлечение макроса без использования Excel.   -  person Brad Gilbert    schedule 19.03.2009


Ответы (3)


Установите ссылку на библиотеку объектов Microsoft Excel 12.0 (или любую другую требуемую версию) и используйте коллекцию VBProject.VBComponents книги, например.

Sub ExportCode()
  Dim app As Excel.Application
  Set app = New Excel.Application

  Dim wb As Excel.Workbook
  Set wb = Excel.Application.Workbooks.Open("C:\Book2.xls")

  Dim strExt As String

  Dim VBComp As Object
  For Each VBComp In wb.VBProject.VBComponents
    Select Case VBComp.Type
      Case 2  ' Class module
        strExt = ".cls"
      Case 3  ' Form
        strExt = ".frm"
      Case 1  ' Standard module
        strExt = ".bas"
      Case 100  ' Document?
        strExt = ".cls"
      Case Else
        Stop  ' What else is there?
        strExt = ".cls"
    End Select

    VBComp.Export "C:\" & VBComp.Name & strExt
  Next
  wb.Close False
  app.Quit

End Sub
person onedaywhen    schedule 21.01.2009

VbaDiff может читать макросы Excel прямо из файла Excel точно так, как вы описываете. Если вам нужен программный доступ, есть версия Enterprise с API. Вы можете делать с этим довольно забавные вещи, например, в этих примерах.

Полное раскрытие - я построил этот продукт. Я постоянно сталкивался с проблемами, похожими на те, что были у Дина, и решил, что пришло время решить их раз и навсегда!

person Chris Spicer    schedule 05.05.2011
comment
Я тоже их ненавижу, Андре, но полнофункциональная демонстрационная модель не работает так хорошо для такого рода функций восстановления. Тем не менее, все остальные замечательные функции там. Спасибо, что взглянули на VbaDiff. - person Chris Spicer; 17.08.2012
comment
Я снял ограничение в 30 строк для основной функции diff. - person Chris Spicer; 26.08.2012
comment
Здорово! Инструмент абсолютно полезен. Я рекомендую это! - person André Chalella; 27.08.2012

Следующая строка:

Set wb = Excel.Application.Workbooks.Open("C:\Book2.xls")

должно быть

Set wb = app.Workbooks.Open("C:\Book2.xls")
person Community    schedule 03.02.2009
comment
Должно быть? Это достойный рефакторинг, но улучшение незначительно. - person onedaywhen; 04.03.2013