Добавление элементов управления в кадр в пользовательской форме Excel с VBA - PullRequest
12 голосов
/ 19 февраля 2009

Мне нужно динамически создавать ярлыки и кнопки, а затем добавлять их в рамку в пользовательской форме. Как мне это сделать? Кажется, что должно быть проще, чем на самом деле.

Ответы [ 2 ]

18 голосов
/ 25 февраля 2009

Следующий код демонстрирует, как можно динамически заполнять кадр в пользовательской форме элементами управления ...

В форме, которую я использовал, у меня был элемент управления фрейма с именем Frame1, поэтому в UserForm_Initialize вы вызываете Frame1.Controls.Add для встраивания элемента управления в фрейм. Вы можете установить элемент управления, который будет возвращен в переменную элемента управления WithEvents, которую вы определили в модуле кода UserForm, чтобы вы могли реагировать на события в любых элементах управления, которые вы хотите ...

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

Также обратите внимание, что вы можете позиционировать и изменять размеры элементов управления, даже если свойства top, left, width и height не обязательно совпадают с intellisense ...

Private WithEvents Cmd As MSForms.CommandButton
Private WithEvents Lbl As MSForms.Label

Private Sub UserForm_Initialize()
    Set Lbl = Frame1.Controls.Add("Forms.Label.1", "lbl1")
    Lbl.Caption = "Foo"
    Set Cmd = Frame1.Controls.Add("Forms.CommandButton.1", "cmd1")
End Sub

Private Sub Cmd_Click()
    Cmd.Top = Cmd.Top + 5
End Sub

Private Sub Lbl_Click()
    Lbl.Top = Lbl.Top + 5
End Sub
4 голосов
/ 06 августа 2010

Моя вариация на тему выше. Это только для массива кнопок 4х4. Создайте пользовательскую форму и добавьте ее в свой код. С вашими ярлыками можно использовать те же понятия (или см. Предыдущий ответ):

Private cmdLots(20) As MSForms.CommandButton

Private Sub UserForm_Initialize()
For i = 1 To 4
For j = 1 To 4
    k = i + (4 * j)
    Set cmdLots(k) = UserForm2.Controls.Add("Forms.CommandButton.1", "cmd1")
    With cmdLots(k)
        .Top = i * 25
        .Left = (j * 80) - 50
        .BackColor = RGB(50 * i, 50 * j, 0)
        .Caption = "i= " & i & "  j= " & j
    End With
Next j
Next i
End Sub
...