用户表单创建与控件使用指南
一、用户表单示例:大小写转换对话框
在进行用户表单操作时,建议将 VBE 赋予控件的默认名称修改为更具意义的名称,例如将复选框命名为 “cbxPrintReport”,并使用三字母前缀来表明控件类型。
本示例是一个增强版的大小写转换宏,原始版本将所选单元格中的文本转换为大写,而修改后的版本使用用户表单询问用户要进行的转换类型:大写、小写或适当大小写。
1. 创建用户表单
以下是创建用户表单的具体步骤:
1. 按下 Alt + F11 激活 VBE。
2. 若项目窗口中有多个项目,选择与正在使用的工作簿对应的项目。
3. 选择 “插入”➪“用户表单”,VBE 会插入一个带有空对话框的新用户表单对象。
4. 按下 F4 显示 “属性” 窗口。
5. 在 “属性” 窗口中,将对话框的 “Caption” 属性更改为 “Change Case”。
6. 对话框可能有点大,可点击它并使用右侧和底部的手柄将其缩小,此步骤也可在所有控件定位后进行。
2. 添加命令按钮
添加 “OK” 和 “Cancel” 两个命令按钮的步骤如下:
1. 确保 “工具箱” 已显示,若未显示,选择 “视图”➪“工具箱”。
2. 若 “属性” 窗口不可见,按下 F4 显示它。
3. 在 “工具箱” 中,将 “CommandButton” 拖到对话框中创建一个按钮,该按钮默认名称和标题为 “CommandButton1”。
4. 确保 “CommandButton” 被选中,激活 “属性” 窗口并更改以下属性:
| 属性 | 更改后的值 |
| ---- | ---- |
| Name | OKButton |
| Caption | OK |
| Default | True |
5. 向用户表单添加第二个 “CommandButton” 对象并更改以下属性:
| 属性 | 更改后的值 |
| ---- | ---- |
| Name | CancelButton |
| Caption | Cancel |
| Cancel | True |
6. 调整控件的大小和位置,使对话框类似于图 16 - 4 的样式。
3. 添加选项按钮
在添加选项按钮之前,先添加一个包含选项按钮的框架对象,框架并非必需,但可使对话框看起来更专业。具体步骤如下:
1. 在 “工具箱” 中,点击 “Frame” 工具并将其拖到对话框中,创建一个用于容纳选项按钮的框架。
2. 使用 “属性” 窗口将框架的标题更改为 “Options”。
3. 在 “工具箱” 中,点击 “OptionButton” 工具并将其拖到对话框(框架内),创建一个选项按钮控件。
4. 选择 “OptionButton” 并使用 “属性” 窗口更改以下属性:
| 属性 | 更改后的值 |
| ---- | ---- |
| Name | OptionUpper |
| Caption | Upper Case |
| Accelerator | U |
| Value | True |
设置 “Value” 属性为 “True” 可使此选项按钮成为默认选项。
5. 添加另一个 “OptionButton” 并更改以下属性:
| 属性 | 更改后的值 |
| ---- | ---- |
| Name | OptionLower |
| Caption | Lower Case |
| Accelerator | L |
6. 添加第三个 “OptionButton” 并更改以下属性:
| 属性 | 更改后的值 |
| ---- | ---- |
| Name | OptionProper |
| Caption | Proper Case |
| Accelerator | P |
7. 调整选项按钮、框架和对话框的大小和位置,使你的用户表单类似于图 16 - 5。
若想预览用户表单显示时的样子,可按下 F5,但此时所有控件都还未起作用,需点击标题栏中的红色 “X” 关闭对话框。
“Accelerator” 属性决定标题中哪个字母会有下划线,更重要的是,它决定了使用哪个 Alt 键组合来选择该控件。通常,“OK” 和 “Cancel” 按钮没有加速键,因为按下 Enter 相当于点击 “OK”(由于控件的 “Default” 属性为 “True”),按下 Esc 相当于点击 “Cancel”(由于控件的 “Cancel” 属性为 “True”)。
二、添加事件处理程序
现在要让用户表单真正发挥作用,为 “Cancel” 和 “OK” 按钮添加事件处理程序的步骤如下:
1. 双击 “Cancel” 按钮,VBE 会激活用户表单的 “代码” 窗口并插入一个空过程:
Private Sub CancelButton_Click()
当对话框显示时,点击 “Cancel” 按钮会执行此过程。由于 “Cancel” 按钮的 “Cancel” 属性设置为 “True”,按下 Esc 也会触发该过程。
2. 在过程内(“End Sub” 语句之前)插入以下语句:
Unload UserForm1
此语句会在点击 “Cancel” 按钮时关闭用户表单(并将其从内存中移除)。
3. 按下 Shift + F7 返回用户表单。
4. 双击 “OK” 按钮,VBE 会激活用户表单的 “代码” 窗口并插入一个名为 “Private Sub OKButton_Click()” 的空过程。当用户表单显示时,点击 “OK” 会执行此过程,由于该按钮的 “Default” 属性设置为 “True”,按下 Enter 也会执行该过程。
5. 在过程内输入以下代码:
Private Sub OKButton_Click()
Dim WorkRange As Range
' 仅处理文本单元格,不处理公式
On Error Resume Next
Set WorkRange = Selection.SpecialCells _
(xlCellTypeConstants, xlCellTypeConstants)
' 大写
If OptionUpper Then
For Each cell In WorkRange
cell.Value = UCase(cell.Value)
Next cell
End If
' 小写
If OptionLower Then
For Each cell In WorkRange
cell.Value = LCase(cell.Value)
Next cell
End If
' 适当大小写
If OptionProper Then
For Each cell In WorkRange
cell.Value = Application. _
WorksheetFunction.Proper(cell.Value)
Next cell
End If
Unload UserForm1
End Sub
此代码是本章开头介绍的原始大小写转换宏的增强版本,由三个独立的代码块组成,使用三个 If - Then 结构,每个结构都有一个 For Each 循环,根据用户选择的选项按钮执行相应的代码块,最后一条语句在工作完成后卸载(关闭)对话框。
注意,VBA 有 “UCase” 函数和 “LCase” 函数,但没有将文本转换为适当大小写的函数,因此使用 Excel 的 “PROPER” 工作表函数(前面加上 “Application.WorksheetFunction”)进行适当大小写转换,也可使用 VBA 的 “StrConv” 函数,但该函数并非在所有 Excel 版本中都可用。
三、创建显示对话框的宏
创建使对话框显示的过程步骤如下:
1. 在 VBE 窗口中,选择 “插入”➪“模块”,VBE 会向项目中添加一个空的 VBA 模块(名为 “Module1”)。
2. 输入以下代码:
Sub ChangeCase()
If TypeName(Selection) = "Range" Then
UserForm1.Show
Else
MsgBox "Select a range.", vbCritical
End If
End Sub
此过程会检查是否选择了一个范围,若是,则使用 “Show” 方法显示对话框,用户与对话框交互后,用户表单 “代码” 窗格中存储的代码将被执行;若未选择范围,用户将看到一个带有 “Select a range.” 文本的消息框。
四、使宏可用
为了更方便地执行宏,可分配一个快捷键(Ctrl + Shift + C)来执行 “ChangeCase” 宏,具体步骤如下:
1. 通过 Alt + F11 激活 Excel 窗口。
2. 选择 “开发工具”➪“代码”➪“宏” 或按下 Alt + F8。
3. 在 “宏” 对话框中,选择 “ChangeCase” 宏。
4. 点击 “选项” 按钮,Excel 会显示其 “宏选项” 对话框。
5. 在 “快捷键” 中输入大写的 “C”。
6. 在 “说明” 字段中输入宏的描述。
7. 点击 “确定”。
8. 返回 “宏” 对话框时点击 “取消”。
执行此操作后,按下 Ctrl + Shift + C 会执行 “ChangeCase” 宏,若选择了一个范围,将显示用户表单。也可将此宏添加到快速访问工具栏,右键点击快速访问工具栏,选择 “自定义快速访问工具栏”,在 Excel 选项对话框中,可在 “宏” 下列出的项目中找到 “ChangeCase” 宏。在 Excel 2010 中,将宏添加到快速访问工具栏效果更好,若包含宏的工作簿未打开,Excel 2010 会打开它并运行宏,而在 Excel 2007 中,若工作簿未打开则会出错。
五、测试宏
最后,需要测试宏和对话框是否正常工作,具体步骤如下:
1. 激活一个工作表(任何工作簿中的任何工作表)。
2. 选择一些包含文本的单元格。
3. 按下 Ctrl + Shift + C,用户表单将出现。
4. 做出选择并点击 “OK”,若操作正确,宏将对所选单元格中的文本进行指定的更改。
只要工作簿处于打开状态,就可以从任何其他工作簿执行此宏。若关闭包含宏的工作簿,Ctrl + Shift + C 将不再起作用。若宏不能正常工作,需仔细检查上述步骤以定位并纠正错误,调试是开发宏的正常环节,若实在无法解决,可从相关网站下载完成的工作簿,尝试找出问题所在。
六、使用用户表单控件
用户通过使用对话框中包含的各种控件(按钮、编辑框、选项按钮等)来响应自定义对话框(即用户表单),VBA 代码则利用这些响应来确定要采取的操作。
1. 开始使用对话框控件
在添加控件到用户表单之前,需先拥有一个用户表单,可通过在 VBE 中选择 “插入”➪“用户表单” 来获取,添加时要确保在项目窗口中选择了正确的项目(若有多个项目可用)。
添加控件的步骤如下:
1. 点击 “工具箱” 中与要添加的控件对应的工具。
2. 在用户表单中点击并拖动以调整控件的大小和位置,也可直接将控件从 “工具箱” 拖到用户表单以创建具有默认尺寸的控件。
用户表单可能包含垂直和水平网格线,有助于对齐添加的控件,添加或移动控件时,它会自动对齐到网格。若不喜欢此功能,可按以下步骤关闭网格:
1. 在 VBE 中选择 “工具”➪“选项”。
2. 在 “选项” 对话框中,选择 “常规” 选项卡。
3. 在 “表单网格设置” 部分设置所需选项。
2. 控件属性介绍
每个添加到用户表单的控件都有决定其外观和行为的属性,可在以下两个时间更改控件属性:
- 设计时:在设计用户表单时,手动使用 “属性” 窗口进行更改。
- 运行时:在宏运行时,通过编写 VBA 代码进行更改,但运行时的更改总是临时的,是对正在显示的对话框副本进行的更改,而非对设计的实际用户表单对象进行的更改。
添加控件到用户表单时,几乎总是需要在设计时对其属性进行一些调整,可在 “属性” 窗口中进行这些更改(按下 F4 显示 “属性” 窗口)。
所有控件都有一些共同属性,如下表所示:
| 属性 | 说明 |
| ---- | ---- |
| Accelerator | 控件标题中带下划线的字母,用户按下此键与 Alt 键组合来选择控件 |
| AutoSize | 若为 True,控件会根据标题中的文本自动调整大小 |
| BackColor | 控件的背景颜色 |
| BackStyle | 背景样式(透明或不透明) |
| Caption | 控件上显示的文本 |
| Value | 控件的值 |
| Left 和 Top | 确定控件位置的值 |
| Width 和 Height | 确定控件宽度和高度的值 |
| Visible | 若为 False,控件将隐藏 |
| Name | 控件的名称,默认名称基于控件类型,可更改为任何有效名称,但每个控件的名称在对话框中必须唯一 |
| Picture | 要显示的图形图像,图像可以来自图形文件,也可选择 “Picture” 属性并粘贴复制到剪贴板的图像 |
当选择一个控件时,该控件的属性会出现在 “属性” 窗口中,要更改属性,只需在 “属性” 窗口中选择它并进行更改,有些属性会提供帮助,例如更改 “TextAlign” 属性时,“属性” 窗口会显示一个下拉列表,包含所有有效的属性值。
3. 对话框控件详情
以下是各种对话框控件的详细介绍及部分有用属性:
| 控件类型 | 描述 | 部分有用属性 |
|---|---|---|
| CheckBox 控件 | 用于获取二元选择,如是或否、真或假、开或关等 | Accelerator:用户可通过键盘更改控件值的字母;ControlSource:与复选框关联的工作表单元格地址;Value:若为 True,复选框有选中标记,若为 False 则没有 |
| ComboBox 控件 | 类似于 ListBox 控件,但为下拉框,一次只显示一项,用户可能被允许输入列表中未出现的值 | BoundColumn:若列表包含多列,此属性确定包含返回值的列;ColumnCount:列表中的列数;ControlSource:存储在组合框中所选值的单元格;ListRows:列表下拉时显示的项数;ListStyle:列表项的外观;RowSource:包含组合框中显示的项列表的范围地址;Style:确定控件是作为下拉列表还是组合框;Value:用户选择并显示在组合框中的项的文本 |
| CommandButton 控件 | 普通的可点击按钮,需提供事件处理程序才能发挥作用 | Cancel:若为 True,按下 Esc 执行与按钮关联的宏;Default:若为 True,按下 Enter 执行与按钮关联的宏 |
| Frame 控件 | 用于包围其他控件,出于美观或逻辑分组的目的 | BorderStyle:框架的外观;Caption:框架顶部显示的文本,若不想显示标题,可设为空字符串 |
| Image 控件 | 用于在对话框中显示图像 | Picture:要显示的图形图像;PictureSizeMode:当控件大小与图像大小不匹配时,图像的显示方式 |
| Label 控件 | 仅用于在对话框中显示文本 | 可对其格式进行较多控制 |
| ListBox 控件 | 向用户呈现一个项目列表,用户可从中选择一个或多个 | BoundColumn:若列表包含多列,此属性确定包含返回值的列;ColumnCount:列表中的列数;ControlSource:存储在列表框中所选值的单元格;IntegralHeight:若为 True,列表框高度会自动调整以在垂直滚动列表时显示整行文本;ListStyle:列表项的外观;MultiSelect:确定用户是否可以从列表中选择多个项目;RowSource:包含列表框中显示的项列表的范围地址;Value:列表框中所选项目的文本 |
| MultiPage 控件 | 用于创建选项卡式对话框 | Style:确定控件的外观,选项卡可以正常显示(在顶部)、在左侧、作为按钮或隐藏(无选项卡,由 VBA 代码确定显示哪一页);Value:确定显示哪一页或选项卡,值为 0 显示第一页,值为 1 显示第二页,依此类推 |
| OptionButton 控件 | 当用户需要从少量项目中选择时很有用,总是以至少两个为一组使用 | Accelerator:用户可通过键盘选择选项的字母;GroupName:用于标识与具有相同 “GroupName” 属性的其他选项按钮相关联的选项按钮;ControlSource:与选项按钮关联的工作表单元格,若控件被选中,单元格显示 TRUE,否则显示 FALSE;Value:若为 True,选项按钮被选中,若为 False 则未被选中 |
| RefEdit 控件 | 用于让用户在工作表中选择一个范围 | Value 属性保存所选范围的地址(作为文本字符串),在较复杂的用户表单中可能会出现问题,最好不要将其放在框架或多页控件内 |
| ScrollBar 控件 | 可设置为水平或垂直,类似于 SpinButton 控件,但用户可拖动滑块以较大增量更改控件值,垂直滚动条点击向上按钮时值会减小 | Value:控件的当前值;Min:控件的最小值;Max:控件的最大值;ControlSource:显示控件值的工作表单元格;SmallChange:点击时控件值的更改量;LargeChange:点击按钮两侧时控件值的更改量 |
| SpinButton 控件 | 用户可通过点击控件上的两个箭头(一个增加值,一个减小值)来选择一个值,可水平或垂直定向 | Value:控件的当前值;Min:控件的最小值;Max:控件的最大值;ControlSource:显示控件值的工作表单元格;SmallChange:点击时控件值的更改量,通常设置为 1,但可设为任何值,若使用 “ControlSource”,每次控件值更改时工作表都会重新计算,若工作表计算时间较长,可能需要避免使用 “ControlSource” 存储值 |
| TabStrip 控件 | 类似于 MultiPage 控件,但使用起来不太方便,可基本忽略,使用 MultiPage 控件代替 | |
| TextBox 控件 | 让用户输入文本 | AutoSize:若为 True,控件会根据文本量自动调整大小;ControlSource:包含文本框中文本的单元格地址;IntegralHeight:若为 True,文本框高度会自动调整以在垂直滚动列表时显示整行文本;MaxLength:文本框中允许的最大字符数,若为 0,则字符数无限制;MultiLine:若为 True,文本框可显示多行文本;TextAlign:确定文本在文本框中的对齐方式;WordWrap:确定控件是否允许自动换行;ScrollBars:确定控件的滚动条类型:水平、垂直、两者都有或无,添加文本框控件时,其 “WordWrap” 属性设置为 True,“MultiLine” 属性设置为 False,若要实现自动换行,需将 “MultiLine” 属性设置为 True |
| ToggleButton 控件 | 有开和关两种状态,点击按钮会在这两种状态之间切换,点击时按钮外观会改变,值为 True(按下)或 False(未按下) | 不太常用,更推荐使用 CheckBox 控件 |
用户表单创建与控件使用指南
六、使用用户表单控件(续)
3. 对话框控件详情(续)
为了更清晰地展示这些控件的使用逻辑,我们可以用 mermaid 流程图来呈现部分控件的交互流程。以下是一个简单的示例,展示了用户在使用包含 OptionButton 和 CommandButton 的用户表单时的基本流程:
graph LR
A[打开用户表单] --> B{选择 OptionButton}
B -->|Upper Case| C[执行大写转换代码]
B -->|Lower Case| D[执行小写转换代码]
B -->|Proper Case| E[执行适当大小写转换代码]
C --> F[点击 OK 按钮]
D --> F
E --> F
F --> G[关闭用户表单]
B --> H[点击 Cancel 按钮]
H --> G
从这个流程图中可以看出,用户打开用户表单后,先选择 OptionButton 确定转换类型,然后点击 OK 按钮执行相应的转换代码,最后关闭用户表单;若点击 Cancel 按钮则直接关闭用户表单。
在实际使用这些控件时,还需要注意一些细节。例如,对于 ComboBox 和 ListBox 控件,如果列表项不是存储在工作表中,可以使用 VBA 代码的 AddItem 方法来添加项目。以下是一个简单的示例代码,展示如何向 ComboBox 控件添加项目:
Private Sub UserForm_Initialize()
With ComboBox1
.AddItem "Item 1"
.AddItem "Item 2"
.AddItem "Item 3"
End With
End Sub
这段代码在用户表单初始化时,向 ComboBox1 控件添加了三个项目。
对于 ListBox 控件,如果其 MultiSelect 属性设置为 1 或 2,用户可以选择多个项目。在这种情况下,不能指定 ControlSource,需要编写宏来确定哪些项目被选中。以下是一个示例代码,展示如何获取 ListBox 中被选中的项目:
Private Sub CommandButton1_Click()
Dim i As Integer
For i = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(i) Then
MsgBox ListBox1.List(i)
End If
Next i
End Sub
这段代码在点击 CommandButton1 时,会遍历 ListBox1 中的所有项目,若项目被选中,则弹出消息框显示该项目的文本。
七、总结与注意事项
通过以上内容,我们详细介绍了用户表单的创建、控件的添加、事件处理程序的编写以及宏的使用等方面。在实际应用中,需要注意以下几点:
- 控件命名 :为控件赋予有意义的名称,方便代码的编写和维护。例如,将复选框命名为 “cbxPrintReport”,而不是使用默认的名称。
- 属性设置 :根据实际需求合理设置控件的属性。例如,对于 TextBox 控件,若要实现自动换行,需将 MultiLine 属性设置为 True;对于 CommandButton 控件,合理设置 Default 和 Cancel 属性,方便用户操作。
- 代码调试 :在开发宏的过程中,调试是必不可少的环节。若宏不能正常工作,要仔细检查代码和操作步骤,找出问题所在。可以利用 VBA 的调试工具,如断点、单步执行等,帮助定位问题。
- 兼容性 :在使用一些函数和控件时,要考虑不同 Excel 版本的兼容性。例如,VBA 的 StrConv 函数并非在所有 Excel 版本中都可用,因此在进行适当大小写转换时,推荐使用 Excel 的 PROPER 工作表函数。
通过遵循以上步骤和注意事项,你可以创建出功能强大、易用的用户表单,提高工作效率。希望这些内容对你有所帮助,祝你在 Excel VBA 开发中取得成功!
超级会员免费看
398

被折叠的 条评论
为什么被折叠?



