我使用以下代码让用户可以拖放标签。
代码工作正常 - 但我正在寻找一种方法 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
谢谢
答案 0 :(得分:2)
响应有点晚,但这是如何完成的。我们的想法是您需要创建一个可以处理Label
事件的类模块。一旦你有了这个类来处理这个事件,你需要连接新的/现有的Labels
来完成这个课程。这通常通过创建一个包含所有类对象的Collection
来完成。除此之外,您只需要为每个标签(新标签或现有标签)创建一个类对象。需要以下部分:
LabelHolder 类模块包含理想"标签持有者的代码"。这是一个简单的类,它包含对MSForms.Label
的引用并处理每个事件。请注意,我已调用对象Label1
,以便我可以懒惰地复制您的代码。此Label1
与Label1
上的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
的图像,其中包含所有控件的默认名称。
点击按钮并拖动周围的相同形式:
所有这些代码都显示了如何将类模块连接到用户表单上的动态创建和原始组件。它没有解决如何使用拖放创建新的Label
,但它是可能的。您可以将该代码放在类模块中,并确保您有足够的引用返回到用户表单,以便访问您需要的属性。
答案 1 :(得分:0)
我无法解决这个问题 - 我决定将几个标签设置为visible = false并隐藏起来。然后我有一个按钮将它们带回来,并且已经设置了mounsdown代码。看起来容易多了!但是,如果有人看到这个并且可以回答它,我会非常感兴趣!
答案 2 :(得分:-1)
查看此问题:Use string variable to set object variable in VBA? (Excel 2013)
也许您可以遍历所有按钮名称并将其分配给对象,然后移动对象。
让我知道它是否对你有帮助。如果您需要修改问题并提供标签的屏幕截图,请
问候