VBA Userform对象 - 定义运行时创建Label作为在sub中使用的通用名称

问题描述 投票:0回答:1

我有一个userform,在初始化时创建20-30个标签。同时,列表框中填充了所有这些标签的名称。

我希望用户从列表框中选择标签,通过将其定义为ActiveTB来“激活”该标签。然后我将能够运行以下代码在userform上移动该标签。

enter image description here

如果我只有3个标签:Label1,label2,label3 - 我可以在下面复制并粘贴此代码,并将ActiveTB替换为其名称。然而,对于30个标签来说,这是荒谬的,我也不知道这些标签的名称是什么(在那里有重命名功能)。

我确定这是一个简单的修复,但我找不到通过常用名称调用对象的方法。

Private Sub ActiveTB_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)

    If Button = 1 Then
        m_sngLeftPos = X
        m_sngTopPos = Y
    End If

End Sub

Private Sub ActiveTB_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)

    Dim sngLeft As Single
    Dim sngTop As Single

    If Button = 1 Then
        With ActiveTB
            sngLeft = .Left + X - m_sngLeftPos
            If sngLeft < SeriesImage.Left Then sngLeft = SeriesImage.Left
            If (sngLeft + .Width) > (SeriesImage.Left + SeriesImage.Width) Then
                sngLeft = SeriesImage.Left + SeriesImage.Width - .Width
            End If
            sngTop = .Top + Y - m_sngTopPos
            If sngTop < SeriesImage.Top Then sngTop = SeriesImage.Top
            If (sngTop + .Height) > (SeriesImage.Top + SeriesImage.Height) Then
                sngTop = SeriesImage.Top + SeriesImage.Height - .Height
            End If
            .Move sngLeft, sngTop
        End With
    End If

End Sub
vba object runtime userform
1个回答
1
投票

您可以使用使用WithEvents声明的全局变量,并将其设置为与用户的列表框选择对应的标签。

这是一个只有两个标签的简单示例 - 每个标签都由一个单独的按钮“设置”:

Private WithEvents ActiveLabel As MSForms.Label '<< ######
Dim m_sngLeftPos, m_sngTopPos

'activate label1
Private Sub CommandButton1_Click()
    Set ActiveLabel = Me.Label1
End Sub

'activate label2
Private Sub CommandButton2_Click()
    Set ActiveLabel = Me.Label2
End Sub

Private Sub ActiveLabel_MouseDown(ByVal Button As Integer, _
            ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    If Button = 1 Then
        m_sngLeftPos = X
        m_sngTopPos = Y
    End If
End Sub

Private Sub ActiveLabel_MouseMove(ByVal Button As Integer, _
             ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)

    Dim sngLeft As Single
    Dim sngTop As Single

    If Button = 1 Then
        With ActiveLabel
            sngLeft = .Left + X - m_sngLeftPos
            If sngLeft < SeriesImage.Left Then sngLeft = SeriesImage.Left
            If (sngLeft + .Width) > (SeriesImage.Left + SeriesImage.Width) Then
                sngLeft = SeriesImage.Left + SeriesImage.Width - .Width
            End If
            sngTop = .Top + Y - m_sngTopPos
            If sngTop < SeriesImage.Top Then sngTop = SeriesImage.Top
            If (sngTop + .Height) > (SeriesImage.Top + SeriesImage.Height) Then
                sngTop = SeriesImage.Top + SeriesImage.Height - .Height
            End If
            .Move sngLeft, sngTop
        End With
    End If
End Sub
© www.soinside.com 2019 - 2024. All rights reserved.