我有一个userform,在初始化时创建20-30个标签。同时,列表框中填充了所有这些标签的名称。
我希望用户从列表框中选择标签,通过将其定义为ActiveTB来“激活”该标签。然后我将能够运行以下代码在userform上移动该标签。
如果我只有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
您可以使用使用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