Постоянно меняющиеся пользовательские формы

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

Я обнаружил, что это работает для некоторых людей. Я не уверен, что может быть не так для меня.

Sub FormatUserForms(UF As UserForm)

UF.BackColor = RGB(51, 51, 102)
Dim ctrl As Control

With ThisWorkbook.VBProject.VBComponents("UFNewRequest").Designer
    For Each ctrl In UF.Controls
        Select Case TypeName(ctrl)
            Case "Label"
                ctrl.BackColor = RGB(51, 51, 102)
                ctrl.ForeColor = RGB(247, 247, 247)
            Case "CommandButton"
                ctrl.BackColor = RGB(247, 247, 247)
                ctrl.ForeColor = RGB(0, 0, 0)
            Case "TextBox"
                ctrl.BackColor = RGB(247, 247, 247)
                ctrl.ForeColor = RGB(0, 0, 0)
            Case "OptionButton"
                ctrl.BackColor = RGB(51, 51, 102)
                ctrl.ForeColor = RGB(247, 247, 247)
        End Select
    Next
End With
End Sub

Sub formatting()

FormatUserForms UFNewRequest

End Sub

Спасибо за любую помощь в этом!


person mjcallen    schedule 24.02.2017    source источник
comment
Итак, в чем вопрос?   -  person Mathieu Guindon    schedule 24.02.2017
comment
Кстати, если этот код находится в коде формы, отбросьте параметр UF и вместо него используйте Me, как вам сказали вчера . FormatUserForms UFNewRequest отправляет экземпляр по умолчанию, который не обязательно является экземпляром, выполняющимся в данный момент.   -  person Mathieu Guindon    schedule 24.02.2017
comment
Просто из любопытства, почему вы хотите изменить свойства элемента управления в сохраненном двоичном потоке формы? Их динамическая установка увеличивает нагрузку на форму с минимальными накладными расходами и является гораздо более гибкой и удобной в сопровождении, если вы решите, что цвет фона TextBox должен быть на пару оттенков светлее.   -  person Comintern    schedule 24.02.2017


Ответы (1)


Вы смешиваете две вещи. Правильно использовать объект ThisWorkbook.VBProject.VBComponents("UFNewRequest").Designer, но вы его не используете. Вместо этого ваш код работает с формой, переданной в качестве параметра, и это будет работать только во время выполнения.

Sub FormatUserForm(frm As Object)

Dim d As UserForm
Set d = frm.Designer

d.BackColor = RGB(51, 51, 102)

Dim ctrl As Control
For Each ctrl In d.Controls
    Select Case TypeName(ctrl)
            (...)
    End Select
Next ctrl

End Sub

Вы можете вызвать функцию для всех форм в вашем проекте:

Dim f As Object
For Each f In ThisWorkbook.VBProject.VBComponents
    If f.Type = 3 Then
       Call FormatUserForm(f)
    End If
Next f

Я предполагаю, что есть способ использовать раннее связывание для f, но вы должны добавить ссылку на VBE в свой проект, а мне не разрешено делать это на моем компьютере, поэтому я не могу протестировать. Вероятно, существует константа, определенная для магического типа номер 3 (= формы) также

person FunThomas    schedule 24.02.2017
comment
Я думаю, это то, что я ищу, особенно возможность вызывать функцию для всех форм в моем проекте, но Set d = frm.designer дает мне ошибку, объект не поддерживает это свойство или метод. Любые идеи? - person mjcallen; 24.02.2017