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

我有三个想法来缩短代码:

  1. 将元素存储在数组中"IDs"并通过遍历数组执行重复任务(不知道如何将元素存储在数组中)
  2. 简单地对元素进行分组并只对组执行任务(不知道如何在 vba 代码中处理组)
  3. 给元素一个共同的标签,并只在标签上寻址元素(不知道如何寻址标签)

每个对象都有一个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 控件。 当您移动框架时,其上的所有控件都会随之移动。如果您想让框架本身不可见,请设置框架的 bordercaption 属性。如果你写类似 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