格式化用户表单控件

时间:2017-02-23 16:30:52

标签: vba foreach formatting controls userform

我正在尝试在每个用户表单上格式化控件,但是我在用户表单上格式化了所有控件,而不仅仅是标签或文本框。

这就是我所拥有的:

Private Sub UserForm_Initialize()

FormatUserForms UFNewRequest

End Sub

Sub FormatUserForms(UF As UserForm)

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

For Each Label In UF.Controls
    Label.BackColor = RGB(51, 51, 102)
    Label.ForeColor = RGB(247, 247, 247)
Next

For Each Button In UF.Controls
    Button.BackColor = RGB(247, 247, 247)
    Button.ForeColor = RGB(0, 0, 0)
Next

For Each TextBox In UF.Controls
    TextBox.BackColor = RGB(247, 247, 247)
    TextBox.ForeColor = RGB(0, 0, 0)
Next

End Sub

这种做了我想要的,但每个For Each都覆盖了最后一个。反正是否在用户表单中描述控件以便不会覆盖它们?

此外,每次我打开我的用户表单然后关闭我的用户表单时,我会得到一个"内存不足"错误。对此的帮助也将受到赞赏!感谢。

2 个答案:

答案 0 :(得分:3)

我没有检查,但“内存不足”错误很可能与在UserForm过程中使用Initialize的默认实例有关:

FormatUserForms UFNewRequest

你不应该这样做(而且不需要)。您始终可以使用Me在代码隐藏中获取对表单的引用。我完全删除它。至于控件,您可以调用TypeName来确定它是什么类型的控件,然后使用Select Case相应地格式化它们:

Private Sub UserForm_Initialize()
    FormatUserForms
End Sub

Sub FormatUserForms()
    Me.BackColor = RGB(51, 51, 102)
    Dim current As Control

    For Each current In Me.Controls
        Select Case TypeName(current)
            Case "Label"
                current.BackColor = RGB(51, 51, 102)
                current.ForeColor = RGB(247, 247, 247)
            Case "CommandButton"
                current.BackColor = RGB(247, 247, 247)
                current.ForeColor = RGB(0, 0, 0)
            Case "TextBox"
                current.BackColor = RGB(247, 247, 247)
                current.ForeColor = RGB(0, 0, 0)
    Next
End Sub

答案 1 :(得分:1)

您循环遍历所有控件三次,因此每次调用都会更改所有控件的颜色。命名变量Textbox不会仅过滤文本框的控件。 您必须使用TypeName(ctrl)

分隔控件类型
For Each ctrl In u.Controls
    If TypeName(ctrl) = "TextBox" Then
        ctrl.BackColor = ...
    ElseIf TypeName(ctrl) = "Label" Then
        ctrl.BackColor = ...
    Else
        ...
    End If
next ctrl

据我所知,这仅适用于表单已打开的情况,因此请将您的函数调用到UserForm_Initialize - 事件中。