2015-09-02

Автозагрузка модулей VBA Excel для протезирования ArchiCAD

Выполнение рабочей документации АС, КЖ и КМ в Архикаде требует использования нестандартных приёмов. Отсутствие открытого API и формул в интерактивных каталогах приводит к необходимости перенести часть расчётов спецификаций в стороннее приложение. Удобно использовать для этого Excel.

Информация об элементах выводится в текстовый файл через сметные задания или подключение к ODBC, обрабатываются с помощью VBA и выводятся в готовом виде в текстовом файле или формате pdf для вставки видовым экраном непосредственно на макет.
Один из недостатков такого подхода - большое количество файлов с макросами разных версий, сложность поддержки старых проектов. 
Для устранения этих недостатков можно использовать автозагрузку модулей с обработчиками при открытии файла и их сохранения при её закрытии. Это также сделает спецификации возможными для отправки в сторонние организации без риска утечки кода.

Public sPathMod As String
Private Sub Workbook_Open()
    sPathMod = "C:\ArchiCAD_bib\_ArchiBibl\_macro\" 'путь к папке с модулями
    r = LoadMod("calc") 'загрузка модуля
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    r = DelMod("calc") 'выгрузка модуля
End Sub
Function DelMod(ByVal namemod As String) As Boolean
    If Len(Dir$(sPath & namemod & ".bas")) > 0 Then 'если модуль существует
        ThisWorkbook.VBProject.VBComponents.Item(namemod).Export sPath & namemod & ".bas" 'сохраняем модуль
        ActiveWorkbook.VBProject.VBComponents.Remove ActiveWorkbook.VBProject.VBComponents(namemod) 'удаляем модуль 
    End If
End Function
Function LoadMod(ByVal namemod As String) As Boolean
    If Len(Dir$(sPathMod & namemod & ".bas")) > 0 Then 'если модуль существует
 ThisWorkbook.VBProject.VBComponents.Import sPathMod & namemod & ".bas" 'импортируем модуль
End Function

При открытии файла может возникнуть ошибка 1004
В этом случае необходимо через Параметры-Центр обеспечения безопасностью дать доступ VBA к объектной модели