代码之家  ›  专栏  ›  技术社区  ›  Berryl

VBA按钮事件处理程序实现

  •  3
  • Berryl  · 技术社区  · 6 年前

    我要处理点击 命令按钮 在类中使用以下类代码

    Option Explicit
    
    Private m_First                     As MSForms.CommandButton
    Private WithEvents evFirst          As MSForms.CommandButton
    
    Property Get First() As MSForms.CommandButton
        Set First = m_First
    End Property
    Property Let First(ByRef o As MSForms.CommandButton)
        Set m_First = o
        Set evFirst = o
    End Property
    
    Private Sub evFirst_Click()
        MsgBox "It Worked!"
    End Sub
    

    Sub Tester()
        Dim f As New UserForm1
        Dim o As New cButtonClass
        o.First = f.CommandButton1
    
        Dim k1 As LongLong: k1 = ObjPtr(o.First)
        Dim k2 As LongLong: k2 = ObjPtr(f.CommandButton1)
        Debug.Assert k1 = k2 'NOPE!
    End Sub
    

    为什么这样不行?有什么办法?

    1 回复  |  直到 4 年前
        1
  •  2
  •   Brian M Stafford    6 年前

    下面是反映上述注释的更新代码。它按预期工作。不过,关于你的另一个问题,我还没有答案 ObjPtr .

    课程代码如下:

    Option Explicit
    
    Private WithEvents evFirst As MSForms.CommandButton
    
    Property Get First() As MSForms.CommandButton
        Set First = evFirst
    End Property
    
    Property Set First(ByRef o As MSForms.CommandButton)
        Set evFirst = o
    End Property
    
    Private Sub evFirst_Click()
        MsgBox "Class Click"
    End Sub
    

    以下是工作表代码:

    Option Explicit
    
    Public Sub Tester()
        Dim f As UserForm1
        Dim o As cButtonClass
    
        Set f = New UserForm1
        Set o = New cButtonClass
        Set o.First = f.CommandButton1
        f.Show vbModal
    
        Dim k1 As LongPtr: k1 = ObjPtr(o.First)
        Dim k2 As LongPtr: k2 = ObjPtr(f.CommandButton1)
        Debug.Assert k1 = k2 'NOPE!
    End Sub
    

    以下是用户表单代码:

    Private Sub CommandButton1_Click()
       MsgBox "UserForm Click"
    End Sub