格式化用户表单控件
Formatting User Form Controls
我试图以类似的方式格式化我的每个用户表单上的控件,但我所拥有的是格式化用户表单上的所有控件,而不仅仅是标签或文本框。
这是我的资料:
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 都会覆盖最后一个。有没有办法在用户表单中描述控件,以免它们被覆盖?
此外,每次我打开然后关闭我的用户表单时,我都会收到 "out of memory" 错误。也将不胜感激!谢谢
我没有检查,但 "out of memory" 错误很可能与在其自己的 Initialize
过程中使用 UserForm
的默认实例有关:
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
您在所有控件上循环了 3 次,因此每次调用都会更改所有控件的颜色。命名变量 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
-Event。
我试图以类似的方式格式化我的每个用户表单上的控件,但我所拥有的是格式化用户表单上的所有控件,而不仅仅是标签或文本框。
这是我的资料:
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 都会覆盖最后一个。有没有办法在用户表单中描述控件,以免它们被覆盖?
此外,每次我打开然后关闭我的用户表单时,我都会收到 "out of memory" 错误。也将不胜感激!谢谢
我没有检查,但 "out of memory" 错误很可能与在其自己的 Initialize
过程中使用 UserForm
的默认实例有关:
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
您在所有控件上循环了 3 次,因此每次调用都会更改所有控件的颜色。命名变量 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
-Event。