programing

VBA에서 이벤트 수신기를 프로그래밍 방식으로 생성

elecom 2023. 8. 31. 23:38
반응형

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

반응형