#excel #vba
#excel #vba
Вопрос:
Предположим, например, что мне нужен метод, который добавляет поле со списком. Может быть, я попробую это
Public Sub AddComboBox()
Dim cb As MSForms.ComboBox
Set cb = <Callin& form module&&t;.Controls.Add("Forms.ComboBox.1")
End Sub
Как я могу получить <Callin& form module&&t;
?
Комментарии:
1. Похоже, что ответом является «Вы не можете».
Ответ №1:
Как говорили другие, передайте экземпляр формы методу класса. В отличие от других, я собираюсь добавить:
- Объявите аргумент КАК MSForms.Пользовательская форма
- Передайте параметр ByVal.
- При вызове из самой пользовательской формы используйте
Me
ключевое слово в вызове.
Он является кратким примером:
' <Module1.bas&&t;
Option Explicit
Sub Main()
UserForm1.Show vbModeless
UserForm2.Show vbModeless
End Sub
' </Module1.bas&&t;
' <UserForm1.frm&&t;
Option Explicit
Private Sub UserForm_Activate()
Dim c As Class1
Set c = New Class1
c.AddComboBox Me
End Sub
' </UserForm1.frm&&t;
' <UserForm2.frm&&t;
Option Explicit
Private Sub UserForm_Activate()
Dim c As Class1
Set c = New Class1
c.AddComboBox Me
End Sub
' </UserForm2.frm&&t;
' <Class1.cls&&t;
Option Explicit
Public Sub AddComboBox(ByVal MSForms_UserForm As MSForms.UserForm)
Dim cb As MSForms.ComboBox
Set cb = MSForms_UserForm.Controls.Add("Forms.ComboBox.1")
End Sub
' </Class1.cls&&t;
Ответ №2:
Я думаю, вы пишете это неправильно. Вместо того, чтобы пытаться определить, кто вызвал метод, просто передайте <Callin& Form Module&&t;
to AddComboBox()
в качестве аргумента. Вот так:
Public Sub CallToAddComboBox()
AddComboBox(<Callin& form module&&t;)
End Sub
Public Sub AddComboBox(Callin&FormModule as <Module Object Type&&t;)
Dim cb As MSForms.ComboBox
Set cb = Callin&FormModule.Controls.Add("Forms.ComboBox.1")
End Sub
Комментарии:
1. Я работаю в Access и не могу на 100% проверить код. Но LFSR, безусловно, на правильном пути — передайте вызывающий объект в качестве аргумента функции.