Могу ли я скомпилировать VBA в открытой книге?

Я пытаюсь найти способ скомпилировать код в VBA в открытой книге. Я могу сделать это вручную, открыв среду VBA, войдя в Debug и «Compile VBAProject», но мне было интересно, есть ли способ сделать это через код каждый раз, когда открывается книга.

Цель этого - загрузить код в память компьютера, чтобы предотвратить ошибку компиляции из-за использования некоторых объектов Active X. Как уже упоминалось, я могу сделать это вручную, и это решает проблему, однако, поскольку есть много пользователей, которые используют это, и книга защищена паролем, не все будут иметь доступ к опции отладки.


person Examorph    schedule 17.01.2015    source источник
comment
Если не это, то кто-нибудь знает, где хранятся скомпилированные файлы? Я думаю, что вместо компиляции новой книги, нельзя ли просто отправить всем пользователям эти скомпилированные файлы и предоставить инструкции о том, где эти файлы должны храниться во временном каталоге?   -  person Examorph    schedule 17.01.2015
comment
Спасибо, Маттео, это не очень срочно, просто у меня было много проблем во многих рабочих тетрадях, включая мой текущий проект. Я с нетерпением жду вашего решения.   -  person Examorph    schedule 17.01.2015
comment
Вот и все, это ответ. Я только что протестировал один из своих проектов, и, похоже, он работает нормально. Не стесняйтесь указывать на возможные недостатки, я впервые пробую что-то подобное.   -  person Matteo NNZ    schedule 17.01.2015
comment
Просто любопытно, но решит ли проблему создание надстройки для распространения кода?   -  person Rick Henderson    schedule 24.02.2016


Ответы (1)


Я думаю, вы можете попробовать сделать это, автоматизируя VBE (редактор Visual Basic).

ТРЕБОВАНИЕ:

вам нужно перейти к Excel / File / Options / Trust Center / Trust Center settings и проверить параметр Trust access to the VBA project object model (по соображениям безопасности он отключен по умолчанию, и если вы его не отметите, приведенный ниже код вызовет ошибку времени выполнения 1004 programmatic access to visual basic project is not trusted). Понятно, что вам нужно сделать это только один раз (конечно, на каждом компьютере, на котором вы хотите выполнить автоматическую компиляцию).

КОДИРОВКА:

Инструкция на панели команд (например, «Скомпилировать проект VBA») находится внутри объекта VBE приложения Excel, в частности, на панели команд:

Dim objVBECommandBar As Object
Set objVBECommandBar  = Application.VBE.CommandBars

Теперь объект будет содержать всю панель команд редактора Visual Basic. В частности, вы ищите кнопку идентификатора «578», которая на самом деле является «Скомпилировать проект VBA» (вы можете поставить наблюдателя на переменную и просмотреть все, что находится внутри, в локальном окне, вы можете захотеть найти другие команды ). Таким образом, подведем итоги:

Set compileMe = objVBECommandBar.FindControl(Type:=msoControlButton, ID:=578) 
compileMe.Execute

Это позволит составить проект. Как вы и просили, вы просто поместили это в открытое событие This Workbook:

Private Sub ThisWorkbook_Open()
    Set compileMe = objVBECommandBar.FindControl(Type:=msoControlButton, ID:=578) 
    compileMe.Execute 'the project should hence be compiled
End Sub
person Matteo NNZ    schedule 17.01.2015
comment
Большое вам спасибо за это, вы решили большую часть моей проблемы. Сейчас я пытаюсь понять, как это сделать с заблокированной книгой, поскольку в таких книгах параметр отладки ›компиляции отключен. Известен ли вам какой-либо способ оставить включенной опцию компиляции при блокировке кода? - person Examorph; 17.01.2015
comment
Это другой вопрос, я предлагаю вам открыть еще одну ветку (и потому, что хорошо разделять проблемы для других пользователей, и потому, что я не могу следить за вами, не буду дома в течение следующих 24 часов;) - person Matteo NNZ; 17.01.2015
comment
Я создал новый модуль и поместил туда этот код, но он все еще просит меня скомпилировать при открытии? Что-то конкретное мне не хватает? Private Sub ThisWorkbook_Open () Dim objVBECommandBar As Object Set objVBECommandBar = Application.VBE.CommandBars Set compileMe = objVBECommandBar.FindControl (Type: = msoControlButton, ID: = 578) compileMe.Execute - person Aspiring Developer; 17.04.2020
comment
@AspiringDeveloper, вы должны помещать код не в модуль, а в событие ThisWorkbook_Open. Посетите эту страницу - person Matteo NNZ; 17.04.2020