使用VBA对Excel任意UserForm内多种控件执行统一格式化
解决方案
核心思路
把样式设置逻辑提取到标准模块中,修改为接收窗体对象作为入参的通用方法,无需在每个窗体模块重复粘贴代码,仅需要在对应窗体的初始化事件中加一行调用即可。
具体实现步骤
- 第一步:新建标准模块(不要写在任意窗体的代码模块中),粘贴以下代码:
' 放在标准模块中,全局可调用 Sub ApplyFormStyle(targetForm As MSForms.UserForm) Dim ctrl As MSForms.Control ' 窗体基础样式设置 With targetForm .BackColor = Grey4 .BorderColor = Grey1 .Font.Name = "Arial" .ForeColor = Grey1 .SpecialEffect = 1 End With ' 遍历当前传入窗体的所有控件 For Each ctrl In targetForm.Controls Select Case TypeName(ctrl) Case "TextBox" ctrl.BackColor = White ctrl.BorderColor = Grey1 ctrl.SpecialEffect = 1 ctrl.BorderStyle = 1 ctrl.Font.Name = "Arial" Case "Frame" ctrl.BackColor = Grey4 ctrl.BorderColor = Grey1 ctrl.SpecialEffect = 1 ctrl.BorderStyle = 1 ctrl.Font.Name = "Arial" ctrl.ForeColor = Grey1 ctrl.Font.Bold = True Case "Label" ctrl.BackColor = Grey4 ctrl.BorderColor = Grey4 ctrl.SpecialEffect = 1 ctrl.BorderStyle = 1 ctrl.Font.Name = "Arial" ctrl.ForeColor = Grey1 ctrl.Font.Bold = True Case "ComboBox" ctrl.BackColor = White ctrl.BorderColor = Grey1 ctrl.SpecialEffect = 1 ctrl.BorderStyle = 1 ctrl.Font.Name = "Arial" ctrl.ShowDropButtonWhen = fmShowDropButtonWhenFocus ctrl.Style = fmStyleDropDownList End Select Next ctrl End Sub
- 第二步:在需要应用样式的窗体代码模块中,找到
UserForm_Initialize事件(没有就手动添加),添加一行调用代码即可:
Private Sub UserForm_Initialize() ' 传入当前窗体实例应用样式 ApplyFormStyle Me End Sub
补充说明
你之前使用For Each ctrl In Me.Controls报错的原因是如果这段代码写在标准模块中,Me关键字没有对应的指代对象,只有在窗体/类模块中Me才会指向当前窗体实例本身。
如果你的Grey4、Grey1、White等颜色值还没有做全局定义,需要在同个标准模块顶部添加常量定义,示例:
' 顶部常量定义,可根据需求调整色值 Public Const White As Long = &HFFFFFF Public Const Grey1 As Long = &HC0C0C0 Public Const Grey4 As Long = &H808080
内容的提问来源于stack exchange,提问作者William Jarvis
相关产品推荐
相关产品推荐

