VBA:在用户窗体中一次移动多个元素

时间:2018-09-26 09:00:10

标签: excel vba excel-vba userform

当我单击复选框时,我想扩展用户窗体。某些元素的移动值应与我的用户窗体扩展时的值相同,以便它们始终与窗体的底部边框保持相同的距离。

此刻,我像这样单独移动每个元素,其中“ Ausklapphoehe”是移动/扩展的值(它工作得很好,但我认为它的编码不好):

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. 将元素“ ID”存储在数组中,并通过遍历数组执行重复任务(不知道如何将元素存储在数组中)
  2. 仅对元素进行分组并仅对组执行任务(不知道如何在vba代码中处理组)
  3. 给元素一个共同的标签,然后在标签上添加元素(不知道如何添加标签)

2 个答案:

答案 0 :(得分:2)

每个对象都有一个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()中,也可以通过“属性窗口”(如果隐藏则按F4键)手动编辑。

答案 1 :(得分:1)

要使用“ ”,请在表单上放置一个Frame并在其上放置/拖动控件。 移动框架时,框架上的所有控件都会随之移动。如果要使框架本身不可见,请设置框架的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