通过 Visual Basic for Applications 增强 Excel 宏
介绍
在Microsoft Excel 中的 Visual Basic for Applications 入门中,您学习了如何录制、运行和更新宏来自动执行日常任务。但是,VB 编辑器 (VBE)(可访问该语言的所有功能)并未深入探讨。本指南将解释如何使用 VBA 独有的功能以及您可能熟悉的其他编程概念(条件语句和循环)来操作数据集。您还将了解如何使用表单调用和修改宏的行为(所有操作都在 Microsoft Excel 中完成)。
要遵循本指南,请务必先按照上述指南中的说明启用开发人员。如果您愿意,可以点击此链接下载以下示例中使用的电子表格。
步骤 1:创建用户表单
要插入新表单,请启动 VBE 并右键单击 VBAProject,您将在其中看到当前文件名。接下来,选择“插入”,然后选择“用户表单”:
这将在设计区域中添加一个新表单并显示工具箱,您可以在其中为其选择控件。在此示例中,插入图像的占位符、五个按钮和两个下拉列表,如下所示。为此,将这些控件从工具箱拖放到用户表单中。
此时,无需担心样式、表单标题或其他标签。我们很快就会处理它们。
步骤 2:编辑控件属性
要选择您刚刚在表单中添加的控件之一,请单击它。单击后,您会在左侧区域找到其属性。在那里,修改每个控件中的以下字段:
在UserForm1中,更改:
- 背景颜色为浅黄色。
- (名称)至frmHistoricalPurchaseOrders。
- 历史采购订单的标题。
属性部分应与下图类似:
接下来,更新其他控件中的属性,如下所示:
控制 | 财产 | 新价值 |
命令按钮1 | (姓名) | btn按国家查看订单 |
命令按钮1 | 标题 | 选择国家 |
命令按钮2 | (姓名) | btn查看员工订单 |
命令按钮2 | 标题 | 选择员工 |
命令按钮3 | (姓名) | btn查看待处理订单 |
命令按钮3 | 标题 | 查看待处理订单 |
命令按钮4 | (姓名) | 按钮格式表 |
命令按钮4 | 标题 | 格式化表格 |
命令按钮5 | (姓名) | 清除格式按钮 |
命令按钮5 | 标题 | 清除格式 |
组合框1 | (姓名) | 列出国家 |
组合框2 | (姓名) | 员工列表 |
图片1 | (姓名) | 图片标志 |
图片1 | 边框样式 | 0——frmBorderStyleNone |
图片1 | 图片 | 选择您想要的徽标图像 |
此时,表单应如下所示:
如您所见,按钮和复选框的背景颜色分别更改为浅绿色和黄色。现在我们可以向控件添加操作了。
步骤 3:填充下拉列表
表单首次加载时,应填充cbListCountries和cbListEmployees下拉列表。换句话说,当表单初始化时,宏将向每个组合框控件添加项目(无重复项)。
为了实现此目标,右键单击项目资源管理器中的表单控件并选择查看代码:
在右侧输入以下代码块。第一个代码块UserForm_Initialize()是表单私有的,在表单加载时触发。另一方面,Populate(startCell As String, cbList As comboBox)是自定义宏,在从第一个代码块调用时填充控件:
Private Sub UserForm_Initialize()
Populate "G2", cbListCountries
Populate "H2", cbListEmployees
End Sub
Sub Populate(startCell As String, cbList As comboBox)
Dim itmCollection As New Collection
Dim cell As Range
On Error Resume Next
With cbList
.Clear
For Each cell In Range(startCell, Range(startCell).End(xlDown))
If Len(cell) <> 0 Then
Err.Clear
itmCollection.Add cell.value, cell.value
If Err.Number = 0 Then .AddItem cell.value
End If
Next cell
End With
cbList.ListIndex = 0
End Sub
让我们更详细地研究一下每个过程:
宏在Sub块(代表子过程)内定义。
在UserForm_Initialize()中,Populate宏被调用两次:每个组合框控件一次。后者采用两个参数,分别指示 1) 从哪里开始寻找值来填充每个列表,以及 2) 在每个情况下应填充哪个控件。
当子过程传递两个或多个参数时,它们应该用逗号分隔。
Dim itmCollection As New Collection声明并创建可以作为一个单元处理的项目集合。这种类型的对象比其他类型的对象更适合我们稍后对这些项目进行的操作。
Range对象可以是单个单元格、一行、一列或更大的块。使用Dim cell as Range,您可以定义一个名为cell且类型为Range的占位符变量。
On Error Resume Next意味着如果在运行时访问对象时发生错误,宏不会崩溃。相反,它将继续执行下一个语句。您可以在此处的VBA 在线参考中阅读有关On Error语句的更多信息。
在With块中,当单词前面有一个点时,它指的是正在访问的对象。因此,.Clear和.AddItem是来自cbList的组合框方法。请记住,此变量表示传递给Populate 的第二个参数。
For Each循环用于迭代Range对象,该对象由startCell指定的单元格到同一列中最后一个非空位置之间的所有单元格组成。此处,Range(startCell).End(xlDown)产生的效果与手动将光标放在startCell上并按Ctrl + Shift + 向下箭头相同。Next关键字指示循环在每次迭代后继续处理下一个单元格。
仅当当前单元格不为空时,才会将项目添加到集合中并清除错误。换句话说,宏将检查其长度是否大于零。
Collection对象的一个显著特征是,可以通过索引(集合中的位置)或键(唯一值)访问其项目。在itmCollection.Add cell.value, cell.value中,第一个cell.value是要添加的实际项目,而第二个 cell.value 表示键。这种方法允许我们检查每个步骤中的错误,并且只有当Err.Number等于 0 时才添加项目。仅当当前项目在集合中不存在时才满足此条件。
当If块跨越两行或多行时,需要用相应的End If语句结束。否则,我们可以省略后者。
最后,cbList.ListIndex = 0表示默认情况下应选择集合中的第一个项目。如果您愿意,可以将其更改为其他值。但是,如果数字大于集合的大小,则不会选择任何项目。
当您在编辑器中按 F5 键运行表单时,您会注意到France和Steve Buchanan作为下拉列表的默认值出现。这些正是G和H列中的第一个值。
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~