У меня открыта надстройка и рабочая книга. Надстройка представляет собой файл .xlam, и в книге я добавил на нее ссылку. Надстройка защищена паролем.
Можно запускать общедоступные методы надстройки из моей книги. Однако один метод в надстройке использует VBA.UserForms.Add
для открытия пользовательской формы, созданной во время выполнения подобно этому.
Скажем, рабочая книга, содержащая ссылку на myAddin
, имеет следующее:
Private Sub callAddin()
myAddin.ShowForm ThisWorkbook
End Sub
Обычно код в моей надстройке выглядит так:
Public Sub ShowForm(CallerWorkbook As Workbook)
Const vbext_ct_MSForm As Long = 3
'This is to stop screen flashing while creating form
Application.VBE.MainWindow.Visible = False
'Add to ThisWorkbook, not supplied workbook or VBE will crash - ignore CallerWorkbook
Dim myForm As Object
Set myForm = ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_MSForm)
'Create the User Form
With myForm
.Properties("Caption") = "Select"
.Properties("Width") = 300
.Properties("Height") = 270
End With
'Show the form
Dim finalForm As Object
Set finalForm = VBA.UserForms.Add(myForm.Name)
finalForm.Show
'Remove form
ThisWorkbook.VBProject.VBComponents.Remove myForm
End Sub
Который отлично работает. Однако, когда моя надстройка защищена паролем, попытка добавить к ней временную пользовательскую форму не разрешена. Нет проблем, я просто добавляю временную пользовательскую форму в рабочую книгу, которая вместо этого вызывала код, так как она не будет защищена паролем.
Sub ShowForm(CallerWorkbook As Workbook)
Const vbext_ct_MSForm As Long = 3
'This is to stop screen flashing while creating form
Application.VBE.MainWindow.Visible = False
'Add to CallerWorkbook instead
Dim myForm As Object
Set myForm = CallerWorkbook.VBProject.VBComponents.Add(vbext_ct_MSForm)
'Create the User Form
With myForm
.Properties("Caption") = "Select"
.Properties("Width") = 300
.Properties("Height") = 270
End With
'Show the form
Dim finalForm As Object
'Now myForm cannot be found and added
Set finalForm = VBA.UserForms.Add(myForm.Name)
finalForm.Show
'Remove form
CallerWorkbook.VBProject.VBComponents.Remove myForm
End Sub
Однако VBA не может видеть, куда сейчас указывает myForm.Name
, поэтому метод Add не работает с "Run time error 424: Object required"
Есть ли способ отобразить форму, созданную во время выполнения, в другой книге?
UserForm
нет методаShow
. Многие интерфейсы MSForms на самом деле подключаются во время выполнения с помощью VBA. Я не знаю, возможно ли это (пытался и потерпел неудачу только что), но независимо от этого... зачем вам мучиться с созданием 100% динамической пользовательской формы? - person Mathieu Guindon   schedule 26.07.2018Set finalForm = myForm.Designer
, гдеfinalForm
объявленоAs UserForm
. - person Mathieu Guindon   schedule 26.07.2018