VBA: перемещение нескольких элементов одновременно в пользовательской форме - PullRequest
0 голосов
/ 26 сентября 2018

Я хочу расширить свою пользовательскую форму, когда я нажимаю на флажок.Некоторые элементы должны перемещаться на одно и то же значение, которое расширяет моя пользовательская форма, чтобы они всегда оставались на одном и том же расстоянии от нижней границы формы.

В данный момент я перемещаю каждый элемент по отдельности, например, где «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. Сохранение идентификаторов элементов"в массиве и выполнить повторяющуюся задачу, перебирая массив (не знаю, как хранить элементы в массиве)
  2. Просто сгруппируйте элементы и выполните задачу только для группы (не знаю, как обращаться к группам)в коде vba)
  3. присваивает элементам общий тег и просто указывает на элементы над тегом (не знаю, как адресовать теги)

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Чтобы использовать « Группу », поместите Frame на вашу форму и поместите / перетащите элементы управления на нее.Когда вы перемещаете рамку, все элементы управления на ней перемещаются вместе с ней.Установите свойства 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
0 голосов
/ 26 сентября 2018

Существует свойство 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, если оно скрыто) вручную.

...