VBA: 在用户窗体中一次移动多个元素
VBA: Move multiple elements at once in userform
我想在单击复选框时扩展我的用户表单。一些元素应该移动与我的用户窗体扩展相同的值,以便它们始终与窗体的底部边框保持相同的距离。
目前我像这样单独移动每个元素,其中 "Ausklapphoehe" 是 moving/expanding 的值(它工作得很好,但我认为编码不正确):
Private Sub Filtereigenschaften_Click()
If Filtereigenschaften.Value = False Then
Filtergruppe.Visible = False
UserForm.Height = UserForm.Height - Ausklapphoehe
Button.Top = Button.Top - Ausklapphoehe
FHLabel.Top = FHLabel.Top - Ausklapphoehe
FHBox.Top = FHBox.Top - Ausklapphoehe
NutenabstandLabel.Top = NutenabstandLabel.Top - Ausklapphoehe
NutenabstandBox.Top = NutenabstandBox.Top - Ausklapphoehe
SpinButton.Top = SpinButton.Top - Ausklapphoehe
VersionLabel.Top = VersionLabel.Top - Ausklapphoehe
End If
If Filtereigenschaften.Value = True Then
Filtergruppe.Visible = True
UserForm.Height = UserForm.Height + Ausklapphoehe
Button.Top = Button.Top + Ausklapphoehe
FHLabel.Top = FHLabel.Top + Ausklapphoehe
FHBox.Top = FHBox.Top + Ausklapphoehe
NutenabstandLabel.Top = NutenabstandLabel.Top + Ausklapphoehe
NutenabstandBox.Top = NutenabstandBox.Top + Ausklapphoehe
SpinButton.Top = SpinButton.Top + Ausklapphoehe
VersionLabel.Top = VersionLabel.Top + Ausklapphoehe
End If
End Sub
我有三个想法来缩短代码:
- 将元素存储在数组中"IDs"并通过遍历数组执行重复任务(不知道如何将元素存储在数组中)
- 简单地对元素进行分组并只对组执行任务(不知道如何在 vba 代码中处理组)
- 给元素一个共同的标签,并只在标签上寻址元素(不知道如何寻址标签)
每个对象都有一个Tag
属性,您可以为所有要移动的对象分配一个标签,例如toBeMoved
。那么代码就很清晰了:
Private Sub Filtereigenschaften_Click()
Dim obj As Object
Dim adj As Variant
Filtergruppe.Visible = IIf(Filtereigenschaften.Value, True, False)
adj = IIf(Filtereigenschaften.Value, Ausklapphoehe, -Ausklapphoehe)
UserForm.Height = UserForm.Height + adj
For Each obj In Controls
If obj.Tag = toBeMoved Then obj.Top = obj.Top + adj
Next obj
End Sub
给.Tag
赋值的方法可以写在UserForm_Initialize()
中,也可以通过属性Window手动编辑(隐藏则按F4)
要使用“Group”,请将 Frame
放置到您的表单中,并在其上放置 place/drag 控件。
当您移动框架时,其上的所有控件都会随之移动。如果您想让框架本身不可见,请设置框架的 border
和 caption
属性。如果你写类似 Me.Frame1.Visible = false
的东西,它也会隐藏该框架上的所有控件。
使用标签访问控件:
Sub ControlsByTag(tag As String)
Dim ctrl As Control
For Each ctrl In Me.Controls
Debug.Print ctrl.Name, ctrl.tag
Next ctrl
End Sub
使用数组:
' Assign to array:
Dim a
a = Array(Me.CommandButton1, Me.CommandButton2)
' Loop over the array:
Dim i As Long
For i = LBound(a) To UBound(a)
Debug.Print a(i).Name, a(i).tag
Next i
我想在单击复选框时扩展我的用户表单。一些元素应该移动与我的用户窗体扩展相同的值,以便它们始终与窗体的底部边框保持相同的距离。
目前我像这样单独移动每个元素,其中 "Ausklapphoehe" 是 moving/expanding 的值(它工作得很好,但我认为编码不正确):
Private Sub Filtereigenschaften_Click()
If Filtereigenschaften.Value = False Then
Filtergruppe.Visible = False
UserForm.Height = UserForm.Height - Ausklapphoehe
Button.Top = Button.Top - Ausklapphoehe
FHLabel.Top = FHLabel.Top - Ausklapphoehe
FHBox.Top = FHBox.Top - Ausklapphoehe
NutenabstandLabel.Top = NutenabstandLabel.Top - Ausklapphoehe
NutenabstandBox.Top = NutenabstandBox.Top - Ausklapphoehe
SpinButton.Top = SpinButton.Top - Ausklapphoehe
VersionLabel.Top = VersionLabel.Top - Ausklapphoehe
End If
If Filtereigenschaften.Value = True Then
Filtergruppe.Visible = True
UserForm.Height = UserForm.Height + Ausklapphoehe
Button.Top = Button.Top + Ausklapphoehe
FHLabel.Top = FHLabel.Top + Ausklapphoehe
FHBox.Top = FHBox.Top + Ausklapphoehe
NutenabstandLabel.Top = NutenabstandLabel.Top + Ausklapphoehe
NutenabstandBox.Top = NutenabstandBox.Top + Ausklapphoehe
SpinButton.Top = SpinButton.Top + Ausklapphoehe
VersionLabel.Top = VersionLabel.Top + Ausklapphoehe
End If
End Sub
我有三个想法来缩短代码:
- 将元素存储在数组中"IDs"并通过遍历数组执行重复任务(不知道如何将元素存储在数组中)
- 简单地对元素进行分组并只对组执行任务(不知道如何在 vba 代码中处理组)
- 给元素一个共同的标签,并只在标签上寻址元素(不知道如何寻址标签)
每个对象都有一个Tag
属性,您可以为所有要移动的对象分配一个标签,例如toBeMoved
。那么代码就很清晰了:
Private Sub Filtereigenschaften_Click()
Dim obj As Object
Dim adj As Variant
Filtergruppe.Visible = IIf(Filtereigenschaften.Value, True, False)
adj = IIf(Filtereigenschaften.Value, Ausklapphoehe, -Ausklapphoehe)
UserForm.Height = UserForm.Height + adj
For Each obj In Controls
If obj.Tag = toBeMoved Then obj.Top = obj.Top + adj
Next obj
End Sub
给.Tag
赋值的方法可以写在UserForm_Initialize()
中,也可以通过属性Window手动编辑(隐藏则按F4)
要使用“Group”,请将 Frame
放置到您的表单中,并在其上放置 place/drag 控件。
当您移动框架时,其上的所有控件都会随之移动。如果您想让框架本身不可见,请设置框架的 border
和 caption
属性。如果你写类似 Me.Frame1.Visible = false
的东西,它也会隐藏该框架上的所有控件。
使用标签访问控件:
Sub ControlsByTag(tag As String)
Dim ctrl As Control
For Each ctrl In Me.Controls
Debug.Print ctrl.Name, ctrl.tag
Next ctrl
End Sub
使用数组:
' Assign to array:
Dim a
a = Array(Me.CommandButton1, Me.CommandButton2)
' Loop over the array:
Dim i As Long
For i = LBound(a) To UBound(a)
Debug.Print a(i).Name, a(i).tag
Next i