Я хочу отредактировать свой объект UserForm в VBE с помощью кода.
Когда я использую следующее, я получаю сообщение об ошибке, как в заголовке сообщения:
Sub myTest()
ThisWorkbook.VBProject.VBComponents("UserForm1").Properties("Caption") = "myCaption"
End Sub
Я попытался изменить «Заголовок» на «Заголовок», та же ошибка. Также эта ошибка возникает, когда я пытаюсь установить свойства Width или Height, не всегда в первый раз, но когда я снова запускаю код для изменения размера.
Изменить 1: «Доверять доступ к объектной модели проекта VBA» в настройках макроса включен.
Изменить 2: Ошибка не возникает при создании новой книги и пользовательской формы. Это происходит, когда UserForm воссоздается в книге, в которой уже произошла ошибка.
Изменить 3:
Добавление Unload UserForm1 или Set UserForm1 = Nothing раньше не помогает.
Изменить 4: Для новой книги, если я создаю UserForm и запускаю этот код из модуля, но после щелчка правой кнопкой мыши по UserForm -> View Object, я получаю сообщение об ошибке: «Невозможно переместить фокус на элемент управления, потому что он невидим, не включен, или того типа, который не принимает фокус ". Когда я подтверждаю, при последовательном запуске макроса я получаю сообщение об ошибке, как в заголовке сообщения.
Изменить 5: То же самое происходит в Excel 2010 и 2016.
Элементы в коллекции VBComponents не поддерживают .Caption.
Я имею в виду, что если все, что вы хотите сделать, это изменить заголовок, то почему бы не сделать это, как в моем первом комментарии? зачем вообще проходить через объект VBproject?
@Banana Потому что он изменит заголовок только в UserForm, отображаемом для пользователя через UserForm_Activate() или UserForm_Initialize(). Я хочу изменить заголовок объекта в VBE.
Я вижу, я проверил ваш код, и он отлично работает. единственное, о чем я могу думать, - это разрешения на доступ к VBProject. вам необходимо предоставить разрешение VBA для программного редактирования VBProject в настройках Excel в разделе «Центр управления безопасностью» -> «Настройки центра управления безопасностью» -> «Параметры макроса» -> «Доверять доступ к объектной модели проекта VBA».
Я это проверил. Я работаю в Excel 2010.
В этом случае, возможно, у вас загружены конфликтующие библиотеки, вы пытались закрыть все файлы Excel и попробовать код в новом чистом документе только с одной пользовательской формой?
Это то, что я только что проверил, когда вы упомянули, что это работает с вашей стороны. Мне удалось успешно запустить этот код несколько раз в новой книге со свежей формой UserForm. Я также протестирую изменение Height и Width и опубликую обновление.
Вы получите эту ошибку, если форма в настоящее время загружена.
Я обновил свой исходный пост
измените ThisWorkbook на ActiveWorkbook в дополнение к выгрузке пользовательской формы.
@Banana Использование ActiveWorkbook по-прежнему не работает. На самом деле я только что заметил, что Unload UserForm1 вызывает ошибку даже при первом запуске новой книги с новой UserForm, поэтому он делает вещи «хуже».
Я могу подтвердить, что использование unload действительно исправляет ошибки во всех моих запусках. попробуйте повторно открыть книгу и запустить вспомогательную программу с 3 строками кода UserForm1.Show, Unload UserForm1, ActiveWorkbook.VBProject.VBComponents("UserForm1").Properties("Caption") = "myCaption"
К сожалению, никакие изменения с моей стороны, так как отображение UserForm1 не помогло (также мне пришлось нажать кнопку X, чтобы закрыть его). Какую версию Excel вы используете? Позже смогу протестировать это в 2016 году.
на данный момент я могу протестировать его только в 2013 году, через несколько часов я доберусь до 2016 года.
Позвольте нам продолжить обсуждение в чате.


Может просто попробовать это
Sub myTest()
ThisWorkbook.VBProject.VBComponents("UserForm1").Activate
ThisWorkbook.VBProject.VBComponents("UserForm1").Properties("Caption") = "myCaption"
End Sub
Он работает в Excel 2007 и будет работать в любой версии. Пожалуйста, отнесите мой ответ к сообщению После импорта пользовательской формы в VBComponents свойства не могут быть прочитаны
Спасибо, Ахмед! Работал у меня в 2010 году. Похоже, что это один из тех редких случаев, когда .Activate нужно использовать, но поскольку он предназначен только для разработки и запускается время от времени, эта неуклюжесть вообще не проблема. Самое главное - он работает и надежен.
UserForm1.Caption = "myCaption"