반응형
VBA에서 이벤트 수신기를 프로그래밍 방식으로 생성
프로그래밍 방식으로 생성할 수 있습니까?event method에서comboBox?
워크시트에 다음이 있습니다.ComboBox코드로 이름을 알 수 있습니다.
Dim ole As OLEObject
For Each ole In ActiveSheet.OLEObjects
If TypeName(ole.Object) = "ComboBox" Then
' ole.Name '<<<<<<<< here
End If
Next ole
이제 어떻게 생성하고 할당할 수 있습니까?event method위해서ole.Name:
Private Sub myComboBox_Change()
...
End Sub
Java에서는 다음을 사용할 수 있습니다.myComboBox.setOnChangeListener(...some code of listener interface...);)
WithEvents로 선언된 콤보 상자 변수로 클래스 모듈을 만들어야 합니다.그런 다음 콤보 상자를 만들 때 클래스 변수에 할당합니다.이렇게 하면 설계 시 이벤트 프로시저를 작성할 수 있지만 콤보 상자가 작성된 후에만 이벤트 프로시저를 수신하도록 할 수 있습니다.
CControlEvents라는 클래스 모듈을 만듭니다.
Private WithEvents mclsCbx As MSForms.ComboBox
Public Property Set Cbx(ByVal clsCbx As MSForms.ComboBox): Set mclsCbx = clsCbx: End Property
Public Property Get Cbx() As MSForms.ComboBox: Set Cbx = mclsCbx: End Property
Private Sub mclsCbx_Change()
MsgBox Me.Cbx.name
End Sub
그런 다음 표준 모듈에서
'this is public so it doesn't go out of scope
Public gclsControlEvents As CControlEvents
Sub MakeCombo()
Dim oleCbx As OLEObject
'Create the combobox
Set oleCbx = Sheet1.OLEObjects.Add("Forms.ComboBox.1")
oleCbx.Object.AddItem "1"
oleCbx.Object.AddItem "2"
'hookup the events
Application.OnTime Now, "HookupEvents"
End Sub
Sub HookupEvents()
Set gclsControlEvents = New CControlEvents
Set gclsControlEvents.Cbx = Sheet1.OLEObjects(1).Object
End Sub
이제 콤보 상자가 변경되면 이벤트가 실행됩니다.
콤보 상자를 생성하는 절차와 다른 절차로 연결해야 합니다.동일한 절차에서 수행하지 못하게 하는 버그(또는 기능)가 있습니다.제 생각에 디자인 모드와 관련이 있는 것 같습니다.그래서 응용프로그램을 사용하는 것입니다.OnTime은 생성 코드가 완료된 후 연결 코드를 실행합니다.
언급URL : https://stackoverflow.com/questions/21738405/programmatically-create-event-listener-in-vba
반응형
'programing' 카테고리의 다른 글
| Docker CMD를 여러 번 사용하여 여러 서비스를 실행할 수 없는 이유는 무엇입니까? (0) | 2023.08.31 |
|---|---|
| 동적 입력 배열에 대한 null 값 삽입 (0) | 2023.08.31 |
| Swift에서 동일한 키에 대한 여러 값을 포함하는 쿼리 매개 변수로 URL을 작성하려면 어떻게 해야 합니까? (0) | 2023.08.31 |
| MVC4 StyleBundle이 이미지를 확인하지 않음 (0) | 2023.08.31 |
| 트랜잭션에서 수행할 작업너무 큼 예외 (0) | 2023.08.31 |