在userform上生成一个可以拖放的新标签

时间:2015-07-05 06:22:26

标签: excel-vba vba excel

我使用以下代码让用户可以拖放标签。

代码工作正常 - 但我正在寻找一种方法 1)在处理多个标签时简化代码 2)为用户提供创建具有相同属性的新标签的选项,即拖放。

按照目前的情况,代码专门指代特定的标签,即Label1等,我必须一次又一次地复制代码以引用我想要的所有标签(50 +)

基本上有一种方法可以让我的代码自动适用于现有和新创建的所有标签吗?

Private x_offset%, y_offset%
Private Sub Label1_MouseDown(ByVal Button As Integer, ByVal Shift As    Integer, _
ByVal X As Single, ByVal Y As Single)

If Button = XlMouseButton.xlPrimaryButton Then
 x_offset = X
 y_offset = Y 
End If

End Sub

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

If Button = XlMouseButton.xlPrimaryButton Then
Label1.Left = Label1.Left + X - x_offset
Label1.Top = Label1.Top + Y - y_offset
End If

End Sub

谢谢

3 个答案:

答案 0 :(得分:2)

响应有点晚,但这是如何完成的。我们的想法是您需要创建一个可以处理Label事件的类模块。一旦你有了这个类来处理这个事件,你需要连接新的/现有的Labels来完成这个课程。这通常通过创建一个包含所有类对象的Collection来完成。除此之外,您只需要为每个标签(新标签或现有标签)创建一个类对象。需要以下部分:

  • UserForm1及其代码
  • LabelHolder类模块

LabelHolder 类模块包含理想"标签持有者的代码"。这是一个简单的类,它包含对MSForms.Label的引用并处理每个事件。请注意,我已调用对象Label1,以便我可以懒惰地复制您的代码。此Label1Label1上的UserForm 无关;他们有不同的范围,是独立的。

'class module code
Public WithEvents Label1 As MSForms.Label
Private x_offset%, y_offset%

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

    If Button = XlMouseButton.xlPrimaryButton Then
        x_offset = X
        y_offset = Y
    End If

End Sub

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

    If Button = XlMouseButton.xlPrimaryButton Then
        Label1.Left = Label1.Left + X - x_offset
        Label1.Top = Label1.Top + Y - y_offset
    End If

End Sub

后面的UserForm1代码显示按钮的事件,该按钮会创建新的Label并将其添加到Collection。它还存储Collection,以确保类对象具有全局范围,并且不会提前进行垃圾回收。还有一个Initialize事件,其中显示了如何将现有Label添加到折叠中。

'UserForm1 code behind
Dim labels As Collection

Private Sub CommandButton1_Click()

    If labels Is Nothing Then
        Set labels = New Collection
    End If

    Dim lbl As MSForms.Label
    Set lbl = Frame1.Controls.Add("Forms.Label.1")

    lbl.Caption = "testing"

    Dim holder As New LabelHolder
    Set holder.Label1 = lbl

    labels.Add holder

End Sub

Private Sub UserForm_Initialize()

    If labels Is Nothing Then
        Set labels = New Collection
    End If

    Dim holder As New LabelHolder
    Set holder.Label1 = Label1

    labels.Add holder

End Sub

最后,这是UserForm1的图像,其中包含所有控件的默认名称。

image of user form

点击按钮并拖动周围的相同形式:

picture after some work

所有这些代码都显示了如何将类模块连接到用户表单上的动态创建和原始组件。它没有解决如何使用拖放创建新的Label,但它是可能的。您可以将该代码放在类模块中,并确保您有足够的引用返回到用户表单,以便访问您需要的属性。

答案 1 :(得分:0)

我无法解决这个问题 - 我决定将几个标签设置为visible = false并隐藏起来。然后我有一个按钮将它们带回来,并且已经设置了mounsdown代码。看起来容易多了!但是,如果有人看到这个并且可以回答它,我会非常感兴趣!

答案 2 :(得分:-1)

查看此问题:Use string variable to set object variable in VBA? (Excel 2013)

也许您可以遍历所有按钮名称并将其分配给对象,然后移动对象。

让我知道它是否对你有帮助。如果您需要修改问题并提供标签的屏幕截图,请

问候