VBA典型实例:368例 下载本文

完全手册Excel VBA典型实例大全:通过368个例子掌握

目录

第1章 宏的应用技巧

宏是一个VBA程序,通过宏可以完成枯燥的、频繁的重复性工作。本章的实例分别介绍在Excel 2003、Excel 2007中录制宏、使用Visual Basic代码创建宏的方法,最后还以实例演

示运行宏和编辑宏的方法。

1.1 创建宏 1

例001 在Excel 2003中录制宏 1 例002 打开Excel 2007的录制宏功能 3

例003 在Excel 2007中录制宏 4 例004 使用Visual Basic创建宏 5

1.2 管理宏 6 例005 运行宏 7 例006 编辑宏 8 第2章 VBE使用技巧

VBE(Visual Basic Editor)是编写VBA代码的工具,在上一章中曾使用VBE编辑宏代码。本章的实例介绍了设置VBE操作环境、在VBE中管理工程代码、使用VBE的辅助工具提

高代码输入效率等方法。 2.1 设置VBE操作环境 10 例007 停靠VBE子窗口 10 例008 定制VBE环境 12

2.2 工程管理 13 例009 增加模块 13

例010 删除模块 15 例011 导出模块 16 例012 导入模块 17 2.3 管理代码 18 例013 属性/方法列表 18

例014 常数列表 19 例015 参数信息 20 例016 自动完成关键字 21 第3章 程序控制流程技巧

结构化程序设计中使用的基本控制结构有3种:顺序结构、选择结构和循环结构。 本章以实例演示了VBA中这三种控制结构的控制语句,最后还介绍了在VBA中使用数组

的方法。

3.1 常用输入/输出语句 23

例017 九九乘法表(Print方法的应用) 23 例018 输入个人信息(Inputbox函数的应用) 24 例019 退出确认(Msgbox函数的应用) 25

3.2 分支结构 27

例020 突出显示不及格学生 27 例021 从身份证号码中提取性别 29

例022 评定成绩等级 30 例023 计算个人所得税 32

3.3 循环结构 34

例024 密码验证 34

例025 求最小公倍数和最大公约数 36

例026 输出ASCII码表 37 例027 计算选中区域数值之和 39 例028 换零钱法(多重循环) 40

3.4 使用数组 42 例029 数据排序 42 例030 彩票幸运号码 44 例031 用数组填充单元格区域 46 第4章 Range对象操作技巧

用户在使用Excel时,大部分时间都是在操作单元格中的数据,同样地,在Excel中使用VBA编程时,也需要频繁地引用单元格区域。本章实例介绍用VBA引用单元格、获取单元

格信息、操作单元格数据、设置单元格格式等内容。

4.1 获取单元格的引用 48 例032 使用A1样式引用单元格 48 例033 使用索引号引用单元格 49 例034 引用多个单元格区域 50 例035 合并单元格区域 51 例036 引用合并区域的子区域 52 例037 动态选中单元格区域 53 例038 引用相对其他单元格的单元格 54

例039 扩展单元格区域 55

例040 引用单元格交叉区域 56

例041 引用当前区域 57 例042 获取已使用区域 58 例043 引用区域内的单元格 59 例044 设置标题行格式 61 例045 选取条件格式单元格 62 例046 选择数据列末单元格 63 例047 获取某列连续数据区域 64 例048 获取多个不同长度的非连续列 65 例049 当前单元格的前后单元格 65

例050 获取三维区域 66 4.2 获取单元格信息 67 例051 获取标题行和数据行 67 例052 获取当前区域信息 68 例053 单元格区域是否有公式 69 例054 追踪公式单元格 70 例055 获取单元格地址 71

4.3 操作单元格 72 例056 合并相同值单元格 72 例057 删除指定字符后的内容 73 例058 给单元格设置错误值 75

例059 活动单元格错误类型 76 例060 自动设置打印区域 77 例061 按设置长度换行 77 例062 选择不含公式的单元格 79 例063 生成不重复随机数 80 例064 拆分单元格 82 例065 添加超链接 83 例066 删除超链接 84 例067 限制单元格移动范围 85

例068 插入批注 86 例069 隐藏/显示批注 87

例070 删除批注 87 例071 复制单元格区域 88 例072 给单元格设置公式 90

例073 复制公式 90 例074 查找并填充空白单元格 91

例075 清除单元格 92 例076 删除单元格区域 93 4.4 设置单元格格式 94 例077 按颜色统计单元格数量 94 例078 获取单元格底纹和图案 95

例079 设置页眉为单元格值 96

例080 设置日期格式 97 例081 生成大写金额 98 例082 格式化当前区域的数据 100 例083 设置自动套用格式 101 例084 突出显示当前位置 101 例085 设置边框线 103 例086 设置文本对齐格式 104 例087 单元格文本缩排 105 例088 设置文本方向 107 例089 设置自动换行格式 108 例090 设置缩小字体填充 108 例091 设置条件格式 109 例092 设置单元格图案 111 例093 合并单元格 112 第5章 Worksheet对象操作技巧

Worksheet对象表示Excel工作簿中的工作表,Worksheet对象是Worksheets集合的成员。在VBA中,通过操作Worksheet对象和Worksheets集合对象,即可控制Excel的工作表。本章实例介绍了用VBA代码操作工作表、操作工作表行和列、通过工作表事件控制工作表等内

容。

5.1 控制工作表集合 114 例094 增加工作表 114 例095 窗体方式新增工作表 115

例096 窗体方式删除工作表 118 例097 批量新建工作表 119 例098 获取工作表数 120 例099 循环激活工作表 121 例100 选择工作表 121

例101 选取前一个工作表/后一个工作表 例102 选中工作表的名称 123 例103 保护工作表 124 例104 撤销工作表的保护 126 例105 判断工作表是否存在 127

例106 工作表排序 129 例107 复制工作表 130 例108 移动工作表 131 例109 删除工作表 132 例110 删除空工作表 133 例111 密码控制删除工作表 134 例112 隐藏/显示工作表 135 例113 工作表移至最前/最后 136 例114 工作表打印页数 137 例115 重命名工作表 138 例116 设置工作表标签颜色 140

122

例117 导出工作表 141 5.2 操作工作表的行和列 144

例118 删除空行 144 例119 插入行 145 例120 插入多行 146 例121 插入列 147 例122 隐藏/显示行 148 例123 隐藏/显示列 149 例124 设置行高 149 例125 设置列宽 151 5.3 操作工作表 152 例126 合并工作表数据 152 例127 工作表是否被保护 153 例128 制作工作表目录 154

例129 删除图片 155 例130 修改工作表的代码名 156

5.4 控制工作表事件 158

例131 为输入数据的单元格添加批注 158

例132 自动填充相同值 159 例133 记录同一单元格多次输入值 160

例134 禁止选中某个区域 161

例135 禁止输入相同数据 162 例136 设置滚动区域 163 例137 自动添加边框线 164 例138 限制在数据区域下一行输入数据 165

例139 增加快捷菜单 166 例140 限制选择其他工作表 168 例141 自动隐藏工作表 169 例142 将原数据作批注 170

例143 输入编码 171 第6章 Workbook对象操作技巧

Workbook对象表示Excel工作簿,Workbooks集合对象表示Excel中所有打开的工作簿。本章实例介绍VBA控制工作簿的方法,包括对工作簿集合和工作簿的操作、通过工作簿事件

控制工作簿的操作。 6.1 操作工作簿集合 173 例144 批量新建工作簿 173 例145 设置背景音乐 174 例146 打开工作簿 176 例147 保存工作簿 177 例148 更名保存工作簿 178 例149 将工作簿保存为Web页 180

例150 打开文本文件 181 例151 设置工作簿密码 182

例152 保护工作簿 184 例153 查看文档属性 185 例154 处理命名单元格区域 187 例155 判断工作簿是否存在 190 例156 判断工作簿是否打开 191

例157 备份工作簿 192

例158 获取关闭工作簿中的值(方法1) 194 例159 获取关闭工作簿中的值(方法2) 196

例160 多工作簿数据合并 197 6.2 控制工作簿事件 199 例161 自动打开关联工作簿 199 例162 禁止拖动单元格 200 例163 设置新增工作表为固定名称 201 例164 退出前强制保存工作簿 202

例165 限制打印 203 例166 限制保存工作簿 204 例167 限制工作簿使用次数 205 例168 限制工作簿使用时间 207 例169 设置应用程序标题 207 例170 根据密码打开工作簿 209 例171 打开工作簿禁用宏 210

例172 用VBA删除宏代码 212 第7章 Application对象操作技巧

Application对象代表整个Excel应用程序,使用Application对象可控制应用程序范围的设置和选项。本章实例介绍使用VBA,通过Application对象自定义Excel外观、设置Excel操作选项、控制Excel应用程序,以及通过Application对象的OnTime方法和OnKey方法响

应用户操作的内容。 7.1 自定义Excel外观 214 例173 显示/关闭编辑栏 214 例174 设置状态栏 215 例175 控制鼠标指针形状 217 例176 全屏幕显示 218 例177 最大化Excel窗口 219 例178 查询计算机信息 219 7.2 设置Excel操作选项 220 例179 关闭屏幕刷新 220 例180 禁止弹出警告信息 222 例181 复制/剪切模式 223 例182 获取系统路径 224 7.3 控制应用程序 225

例183 激活Microsoft应用程序 225

例184 控制最近使用文档 226 例185 文件选择器 228 例186 快速跳转 230

例187 激活Excel 2007的功能区选项卡 232

7.4 Application对象事件处理 234 例188 工作表上显示时钟 234

例189 整点报时 235 例190 自定义功能键 236 第8章 Window对象操作技巧

Window对象代表一个窗口,许多工作表特征(如滚动条和标尺)实际上是窗口的属性。本章实例介绍用VBA控制窗口的方法,包括通过Window对象的属性和方法创建、拆分窗口、

设置窗口大小、显示比例、控制窗口显示状态等。

8.1 控制窗口 238 例191 创建窗口 238 例192 调整窗口大小 239 例193 获取窗口状态 242 例194 拆分窗格 243 例195 并排比较窗口 244 例196 排列窗口 245 例197 窗口显示比例 246 8.2 控制工作表的显示选项 248 例198 工作簿显示选项 248 例199 工作表显示选项 249 例200 工作表网格线 250 例201 获取指定窗口选中的信息 252

第9章 Chart对象操作技巧

在Excel中可以快速简便地创建图表。在程序中,通过VBA代码也可方便地创建图表。本章实例介绍用VBA创建图表(包括嵌入式图表)、控制图表中的对象、通过图表事件响应

用户操作等内容。 9.1 创建图表 254 例202 创建图表工作表 254 例203 创建嵌入图表 255 例204 转换图表类型 257 例205 删除图表 258 9.2 控制图表对象 260 例206 获取嵌入图表的名称 260 例207 获取图表标题信息 260 例208 获取图例信息 262 例209 获取图表坐标轴信息 263 例210 获取图表的系列信息 264 例211 判断工作表的类型 265 例212 重排嵌入图表 266 例213 调整图表的数据源 268 例214 为图表添加阴影 269 例215 显示数据标签 271 例216 将图表保存为图片 273 例217 设置图表颜色 274

例218 按值显示颜色 276 例219 修改嵌入图表外形尺寸 277

例220 修改图表标题 279 例221 修改坐标轴 280 例222 图表插入到Word文档 282

9.3 图表事件 283 例223 激活图表工作表 283 例224 显示图表各子对象名称 284 例225 捕获嵌入图表事件 285 第10章 用户界面设计技巧

在Excel中,用户大部分时间是在工作表中进行操作。在Excel中,也可以设计用户窗体,用户直接在窗体上进行操作,而将工作表作为保存数据的地方。本章实例介绍在VBA中调

用Excel内置对话框、在VBE中创建自定义窗体等内容。

10.1 使用内置对话框 288

例226 显示打开对话框(使用GetOpenFilename方法) 288 例227 显示保存文件对话框(使用GetSaveAsFilename方法) 290

例228 显示内置对话框 291

例229 用VBA调用Excel 2007功能区功能 293

10.2 创建自定义窗体 294 例230 制作Splash窗口 294 例231 控制窗体显示 295 例232 列表框间移动数据 297

例233 通过窗体向工作表添加数据 302 例234 制作多页窗体——报名登记 305 例235 通过窗体设置单元格格式 307 例236 用窗体控制工作表显示比例 308

例237 调色板窗体 311 例238 在窗体中显示图表 312 例239 制作向导窗体 314 例240 拖动窗体上的控件 317 例241 制作交通信号灯 318 例242 制作进度条 320 第11章 命令栏和功能区操作技巧

在Excel 2007中,以新的功能区取代了以前版本的命令栏(包括菜单栏和工具栏)。本章实例分别介绍了用VBA控制Excel 2003以前版本的命令栏、用XML自定义Excel 2007功能

区等内容。 11.1 控制命令栏 322

例243 显示内置菜单和工具栏的ID 322

例244 创建自定义菜单 323 例245 删除自定义菜单 325 例246 创建快捷菜单 326 例247 禁止工作表标签快捷菜单 328 例248 屏蔽工作表标签部分快捷菜单 329

11.2 Excel 2007的功能区 330

例249 创建功能区选项卡 330 例250 禁用Office按钮的菜单 332 例251 在“Office按钮”中新建菜单 333 例252 重定义“Office按钮”菜单项功能 335

例253 为内置选项卡增加功能 336 第12章 Excel处理工作表数据技巧

通过Excel相关对象可对工作表中的数据进行操作,如处理单元格区域的公式、对数据进行查询、排序、筛选等操作。本章实例介绍了用VBA处理公式,对数据进行查询、排序、筛

选等内容。 12.1 处理公式 339

例254 判断单元格是否包含公式 339

例255 自动填充公式 340 例256 锁定和隐藏公式 341 例257 将单元格公式转换为数值 342

例258 删除所有公式 343 例259 用VBA表示数组公式 345

12.2 数据查询 346 例260 查找指定的值 346 例261 带格式查找 349 例262 查找上一个/下一个数据 349

例263 代码转换 351 例264 模糊查询 353

例265 网上查询快件信息 354 例266 查询基金信息 357 例267 查询手机所在地 358 例268 使用字典查询 360 12.3 数据排序 361 例269 用VBA代码排序 362

例270 乱序排序 363 例271 自定义序列排序 364 例272 多关键字排序 366 例273 输入数据自动排序 367

例274 数组排序 369

例275 使用Small和Large函数排序 370

例276 使用RANK函数排序 372 例277 姓名按笔画排序 374

12.4 数据筛选 376

例278 用VBA进行简单筛选 377 例279 用VBA进行高级筛选 378

例280 筛选非重复值 380 例281 取消筛选 381 第13章 Excel处理数据库技巧

通过VBA代码,可在Excel中访问数据库。本章实例介绍通过ADO访问Excel工作簿中的数据、在Excel中处理Access数据库(包括获取、添加、修改、删除记录,创建Access数

据)等内容。

13.1 用ADO访问Excel工作表 383 例282 使用ADO连接数据库 383 例283 从工作表中查询数据 384 例284 使用ADO导出数据 386

例285 汇总数据 387

例286 不打开工作簿获取工作表名称 388

13.2 处理Access数据库 390 例287 从Access中获取数据 390 例288 添加数据到Access 391 例289 创建Access数据库 393 例290 是否存在指定表 395 例291 列出数据库的表名 396 例292 列出数据表的字段信息 398

例293 修改记录 399 例294 删除记录 401 第14章 创建加载宏技巧

在Excel中,通过加载宏可以扩展功能,加载宏是为Excel提供自定义命令或自定义功能的补充程序。本章实例介绍了在Excel中通过VBA代码创建Excel加载宏和COM加载宏的方

法。

14.1 创建加载宏的方法 404 例295 创建Excel加载宏 404

例296 创建COM加载宏 408 例297 系统加载宏列表 413 14.2 常用加载宏示例 414 例298 时间提示 414 例299 大写金额转换 416 例300 计算个人所得税 418

例301 加盖公章 419 第15章 文件和文件夹操作技巧

通过VBA代码可在Excel中操作文件。有两种方式访问操作文件和文件夹:一 是使用过程形式的VB访问和操作方法,另一种是将文件系统作为对象的文件对象模型方式。本章实例介绍了用VB语句操作文件和文件夹、用FSO操作文件和文件夹的内容。

15.1 用VB语句操作文件和文件夹 422 例302 显示指定文件夹的文件 422 例303 判断文件(文件夹)是否存在 424

例304 新建文件夹 425 例305 复制文件 426 例306 重命名文件或文件夹 427

例307 删除文件 429 例308 查看文件属性 430 15.2 用FSO操作文件和文件夹 432 例309 判断文件是否存在(FSO) 432 例310 分离文件名和扩展名 434

例311 新建和删除文件夹(FSO) 435

例312 复制文件(FSO) 437 例313 复制文件夹(FSO) 439 例314 列出文件夹名称 440 例315 显示文件属性 441 例316 删除所有空文件夹 442 例317 显示驱动器信息 444

第16章 文本文件操作技巧

上一章介绍了对文件进行复制、删除之类的操作,更多的时候用户还需要从文本文件中读取数据,或向文本文件中写入数据。本章实例介绍用VBA操作文本文件的内容,包括用VB语句操作文本文件和用FSO操作文本文件。 16.1 用VB语句操作文本文件 446 例318 创建文本文件 446 例319 读取文本文件数据 448 例320 工作表保存为文本文件 450 例321 导出批注到文本文件 451 例322 从文本文件导入批注 453 16.2 用FSO操作文本文件 455 例323 创建文本文件(FSO) 455 例324 添加数据到文本文件(FSO) 456 例325 读取文本文件数据(FSO) 458 第17章 用Excel控制其他程序技巧

在Excel中,通过VBA代码可调用其他应用程序的功能。包括创建和打开Word文 档、创建和打开幻灯片、发送和导入Outlook邮件等。另外,使用VBA提供的Shell函数还可打开Windows中的其他程序、打开控制面板对应的选项等。 17.1 控制Office应用程序 460 例326 打开Word文档 460 例327 从Word文档中获取数据 462 例328 生成成绩通知书 464 例329 在Excel中打开PPT 469 例330 在Excel中创建PPT 470 例331 使用SendMail发送邮件 473 例332 用Outlook发送邮件 474 例333 导入Outlook中的邮件 476 例334 保存Outlook中的附件 478 17.2 调用其他程序 479 例335 运行系统自带程序 479

例336 在Excel中打开控制面板 481 第18章 VBE工程实用操作技巧

在第2章中介绍了VBE的使用方法。其实,VBE也包含一个对象模型,通过该对象模型可控制VBA工程的主要元素。本章实例介绍通过VBE对象模型,用VBA代码添加或删除模块、创建用户窗体、生成VBA代码等内容。 18.1 显示工程相关信息 483 例337 显示工程信息 483 例338 列出工程所有组件 485

例339 显示工作簿中VBA的过程名 486 例340 导出VBA过程代码 488 例341 列出工程引用的外部库 489 18.2 动态创建组件 490 例342 重命名组件 490 例343 导出/导入模块代码 492 例344 删除指定子过程代码 494 例345 查找代码 496 例346 增加模块 498 例347 增加类模块 500 例348 控制VBE的子窗口 501 例349 工作表中动态增加按钮 502 例350 创建动态用户窗体 504 第19章 VBA程序调试优化技巧

Excel应用程序的顺利完成,调试的过程是非常重要的。本章实例介绍Excel VBA调试程序的基本方法和VBA程序的优化技巧。 19.1 VBA程序调试技巧 507 例351 设置断点 507 例352 使用本地窗口 508 例353 使用立即窗口 510 例354 单步执行 510 例355 运行选定部分代码 512

例356 调用堆栈 513 例357 使用监视窗口 514 例358 使用条件编译 515 例359 错误处理语句 517 19.2 VBA程序优化技巧 518 例360 使用VBA已有功能 518 例361 避免使用变体 520 例362 使用对象变量 521 例363 使用数组处理单元格 522 例364 检查字符串是否为空 522 例365 优化循环体 523 例366 使用For Each循环 525 例367 关闭屏幕刷新 526 例368 使用内置函数 527

VBA应用程序由一系列的VBA代码组成,这些代码将按照一定的顺序执行。有时程序根据一定的条件只能执行某一部分代码,有时需要重复执行某一段代码。通过程序结构控制代码来完成这些功能,本章介绍这些程序控制流程方面的技巧。

3.1 常用输入/输出语句

结构化程序设计中使用的基本控制结构有3种:顺序结构、选择结构和循环结构。顺序结构就是按照语句的书写顺序从上到下、逐条语句地执行。执行时,编写在前面的代码先执行,编写在后面的代码后执行。这是最普遍的结构形式,也是后面两种结构的基础。

顺序结构不需要使用结构控制语句,本节介绍常用的输入输出语句的技巧。

例017 九九乘法表(Print方法的应用)

1.案例说明

在早期的Basic版本中,程序运行结果主要依靠Print语句输出到终端。在VB中,Print作为窗体的一个方法,用来在窗体中显示信息。但是在VBA中,用户窗体已经不支持Print方法了。

在VBA中,Print方法只能向“立即窗口”中输出程序的运行中间结果,供开发人员调试程序时使用。

本例使用Print方法在立即窗口中输入九九乘法表。

2.关键技术

在VBA中,Print方法只能应用于Debug对象,其语法格式如下: Debug.Print [outputlist]

参数outputlist是要打印的表达式或表达式的列表。如果省略,则打印一个空白行。 — Print首先计算表达式的值,然后输出计算的结果。在outputlist参数中还可以使用分隔符,以格式化输出的数据。格式化分隔符有以下几种: — Spc(n):插入n个空格到输出数据之间; — Tab(n):移动光标到适当位置,n为移动的列数; — 分号:表示前后两个数据项连在一起输出;

— 逗号:以14个字符为一个输出区,每个数据输出到对应的输出区。

3.编写代码

(1)在VBE中,单击菜单“插入/模块”命令插入一个模块。 (2)在模块中输入以下代码: Sub multi() For i = 1 To 9 For j = 1 To i

Debug.Print i; \j; \i * j; \\ Next

Debug.Print '换行 Next End Sub

(3)按功能键“F5”运行子过程,在“立即窗口”输出九九乘法表,如图3-1所示。

图3-1 立即窗口

例018 输入个人信息(Inputbox函数的应用)

1.案例说明

本例演示Inputbox函数的使用方法。执行程序,将弹出“输入个人信息”对话框,要求用户输入“姓名、年龄、地址”信息,然后在“立即窗口”中将这些信息打印输出。

2.关键技术

为了实现数据输入,VBA提供了InputBox函数。该函数将打开一个对话框作为输入数据的界面,等待用户输入数据,并返回所输入的内容。其语法格式如下: InputBox(prompt[, title] [, default] [, xpos] [, ypos] [, helpfile, context]) 各参数的含义如下:

— Prompt:为对话框消息出现的字符串表达式。其最大长度为1024个字符。如果需要在对话框中显示多行数据,则可在各行之间用回车符换行符来分隔,一般使用VBA的常数vbCrLf代表回车换行符。

— Title:为对话框标题栏中的字符串。如果省略该参数,则把应用程序名放入标题栏中。

— Default:为显示在文本框中的字符串。如果省略该参数,则文本框为空。 — Xpos:应和Ypos成对出现,指定对话框的左边与屏幕左边的水平距离。如果省略该参数,则对话框会在水平方向居中。

— Ypos:应和Xpos成对出现,指定对话框的上边与屏幕上边的距离。如果省略该参数,则对话框被放置在屏幕垂直方向距下边大约三分之一的位置。 — Helpfile:设置对话框的帮助文件,可省略。 — Context:设置对话框的帮助主题编号,可省略。

3.编写代码

(1)在VBE中,单击菜单“插入/模块”命令插入一个模块。 (2)在模块中输入以下代码: Sub inputinfo()

Title = \输入个人信息\ name1 = \请输入姓名:\ age1 = \请输入年龄:\ address1 = \请输入地址:\ strName = InputBox(name1, Title) age = InputBox(age1, Title) Address = InputBox(addres1, Title) Debug.Print \姓名:\strName Debug.Print \年龄:\age Debug.Print \地址:\Address End Sub

(3)按功能键“F5”运行子过程,将弹出“输入个人信息”窗口,如图3-2所示。在对话框中输入内容后按“回车”,或单击“确定”按钮。

(4)接着输入“年龄”和“地址”信息,在“立即窗口”中将输出这些内容,如图3-3所示。

图3-2 输入个人信息 图3-3 输出结果

例019 退出确认(Msgbox函数的应用)

1.案例说明

在应用程序中,有时用户会由于误操作关闭Excel,为了防止这种情况,可在退出Excel之前弹出对话框,让用户确认是否真的要关闭Excel。

本例使用Msgbox函数弹出对话框,让用户选择是否退出系统。

2.关键技术

使用MsgBox函数可打开一个对话框,在对话框中显示一个提示信息,并让用户单击对话框中的按钮,使程序继续执行。

MsgBox函数语法格式如下:

Value=MsgBox(prompt[,buttons][,title][ ,helpfile,context])

通过函数返回值可获得用户单击的按钮,并可根据按钮的不同而选择不同的程序段来执行。

该函数共有5个参数,除第1个参数外,其余参数都可省略。各参数的意义与Inputbox函数参数的意义基本相同,不同的地方是多了一个buttons参数,用来指定显示按钮的数目及形式、使用提示图标样式、默认按钮以及消息框的强制响应等。其常数值如表3-1所示。 表3-1 按钮常数值

常 量 0 1 值 只显示“确定”(Ok)按钮说 明 vbOkOnly vbOkCancel 显示“确定”(Ok)及“取消”(Cancel)按钮vbAbortRetryIgnore vbYesNoCancel 2 3 显示“异常终止”(Abort)、“重试”(Retry)及“忽略”(Ignore)按钮显示“是”(Yes)、“否”(No)及“取消”(Cancel)按钮 续表

常 量 4 5 16 32 48 64 0 值 显示“是”(Yes)及“否”(No)按钮说 明 vbYesNo vbRetryCancel vbCritical vbQuestion vbExclamation vbInformation vbDefaultButton1 vbDefaultButton2 vbDefaultButton3 vbDefaultButton4 vbApplicationModal vbSystemModal 显示“重试”(Retry)及“取消”(Cancel)按钮显示Critical Message图标显示Warning Query图标显示Warning Message图标显示Information Message图标以第一个按钮为默认按钮 256 512 768 0 4096 以第二个按钮为默认按钮以第三个按钮为默认按钮以第四个按钮为默认按钮进入该消息框,当前应用程序暂停进入该消息框,所有应用程序暂停表3-1中的数值(或常数)可分为四组,其作用分别为: — 第一组值(0~5)用来决定对话框中按钮的类型与数量。 — 第二组值(16,32,48,64)用来决定对话框中显示的图标。

— 第三组值(0,256,512)设置对话框的默认活动按钮。活动按钮中文字的周转有虚线,按回车键可执行该按钮的单击事件代码。 — 第四组值(0,4096)决定消息框的强制响应性。

buttons参数可由上面4组数值组成,其组成原则是:从每一类中选择一个值,把这几个值累加在一起就是buttons参数的值(大部分时间里都只使用前三组数值的组合),不同的组合可得到不同的结果。

3.编写代码

(1)在VBE中,双击“工程”子窗口中的“ThisWorkboo

k”打开代码窗口,如图3-4所示。

(2)在代码窗口左上方的对象列表中选择“Workbook”,如图3-5所示。

(3)在代码窗口右上方的事件列表中选择“BeforeClose”,如图3-6所示。代码窗口中将自动生成事件过程结构如下:

图3-5 对象列表 图3-6 事件列表

Private Sub Workbook_BeforeClose(Cancel As Boolean) End Sub

(4)在上面生成的事件过程中输入以下代码: Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim intReturn As Integer

intReturn = MsgBox(\真的退出系统吗?\vbYesNo + vbQuestion, \提示\ If intReturn <> vbYes Then Cancel = True End Sub

(5)保存Excel工作簿。

(6)关闭Excel工作簿时,将弹出如图3-7所示的对话框。单击“是”按钮将退出Excel,单击“否”按钮将返回Excel工作簿。

3.2 分支结构

分支结构,又叫选择结构。这种结构的程序将根据给定的条件来决定执行哪一部分代码,而跳过其他代码。

例020 突出显示不及格学生

1.案例说明

本例判断学生成绩表中的成绩,如果成绩不及格(低于60分),则将该成绩着重显示出来。如图3-8所示(左图为原成绩,右图突出显示不及格成绩)。

图3-8 突出显示不及格学生

2.关键技术

在本例中,需要进行一个判断(成绩是否低于60分),这时可使用If…Then语句。用If…Then语句可有条件地执行一个或多个语句。其语法格式如下:

If 逻辑表达式 Then 语句1 语句1 … … 语句n

End If

逻辑表达式也可以是任何计算数值的表达式,VBA将为零(0)的数值看做False,而任何非零数值都被看做True。 该语句的功能为:若逻辑表达式的值是True,则执行位于Then与End If之间的语句;若逻辑表达式的值是False,则不执行Then与End If之间的语句,而执行End If后面的语句。其流程图如图3-9所示。

If…Then结构还有一种更简单的形式:单行结构条件语句。其语法格式如下: If 逻辑表达式 Then 语句

该语句的功能为:若逻辑表达式的值是True,则执行Then后的语句;若逻辑表达式的值是False,则不执行Then后的语句,而执行下一条语句。

3.编写代码

(1)打开“学生成绩表”。

(2)按快捷键“Alt+F11”进入VBE环境。

(3)单击菜单“插入/模块”命令向工程中插入一个模块,并编写以下代码: Sub 显示不及格学生() Dim i As Integer For i = 3 To 11

If Sheets(1).Cells(i, 2).Value < 60 Then Sheets(1).Cells(i, 2).Select Selection.Font.FontStyle = \加粗\ Selection.Font.ColorIndex = 3 End If Next End Sub

(4)关闭VBE开发环境返回Excel。

(5)在功能区“开发工具”选项卡的“控件”组中,单击“插入”按钮弹出“表单控件”面板,如图3-10所示。

图3-10 插入按钮

(6)在“表单控件”面板中单击“按钮”,拖动鼠标在工作表中绘制一个按钮。当松开鼠标时,将弹出“指定宏”对话框,如图3-11所示。

(7)在“指定宏”对话框中,单击选中“显示不及格学生”宏,单击“确定”按钮。 (8)右击工作表中的按钮,弹出快捷菜单如图3-12所示,单击“编辑文字”菜单,修改按钮中的提示文字为“显示不及格学生”。

图3-11 指定宏 图3-12 编辑文字

(9)单击“显示不及格学生”按钮,执行宏代码,成绩表中不及格成绩将突出显示为粗体、红色,如图3-13所示。

图3-13 执行程序

例021 从身份证号码中提取性别

1.案例说明

在很多信息系统中都需要使用到身份证号码,身份证号码中包含有很多信息,如可从其中提取性别。我国现行使用的身份证号码有两种编码规则,即15位居民身份证和18位居民身份证。

15位的身份证号的编码规则。 dddddd yymmdd xx p 18位的身份证号的编码规则。 dddddd yyyymmdd xx p y 其中:

— dddddd为地址码(省地县三级)18位中的和15位中的不完全相同。 — yyyymmdd yymmdd 为出生年月日。 — xx序号类编码。 — p性别。

— 18位中末尾的y为校验码。

2.关键技术

在If…Then语句中,条件不成立时不执行任何语句。在很多时候需要根据条件是否成立分别执行两段不同的代码,这时可用If…Then…Else语句,其语法格式如下:

If 逻辑表达式 Then 语句序列1 Else 语句序列2 End If

VBA判断“逻辑表达式”的值,如果它为True,将执行“语句序列1”中的各条语句,当“逻辑表达式”的值为False时,就执行“语句序列2”中的各条语句。其流程图如图3-14所示。

3.编写代码

(1)新建Excel工作簿,在VBE中插入一个模块。

(2)在模块中编写以下代码: Sub 根据身份证号码确定性别()

sid = InputBox(\请输入身份证号码:\ i = Len(sid)

If i <> 15 And i <> 18 Then '判断身份证号长度是否正确 MsgBox \身份证号码只能为15位或18位!\ Exit Sub End If

If i = 15 Then '长度为15位 s = Right(sid, 1) '取最右侧的数字 Else '长度为18度

s = Mid(sid, 17, 1) '取倒数第2位数 End If

If Int(s / 2) = s / 2 Then '为偶数 sex = \女\ Else sex = \男\ End If

MsgBox \性别:\+ sex End Sub

(3)切换到Excel环境,添加一个按钮“从身份证号码提取性别”,并指定执行上步创建的宏。

(4)单击“从身份证号码提取性别”按钮,弹出如图3-15所示对话框。

(5)输入身份证号码后单击“确定”按钮,将在如图3-16所示对话框中显示性别。

图3-15 输入身份证号码 图3-16 显示性别

例022 评定成绩等级

1.案例说明

本例将成绩表中的百分制成绩按一定规则划分为A、B、C、D、E五个等级,如图3-17所示。

图3-17 评定成绩等级

其中各等级对应的成绩分别为: — A:大于等于90分;

— B:大于等于80分,小于90分; — C:大于等于70分,小于80分; — D:大于等于60分,小于70分; — E:小于60分。

2.关键技术

本例共有五个分支,使用If…Then…Else这种二路分支结构也可完成,但需要复杂的嵌套结构才能解决该问题。其实VBA中提供了一种If…Then…ElseIf的多分支结构,其语法格式如下:

If 逻辑表达式1 Then

语句序列1

ElseIf 逻辑表达式2 Then 语句序列2.

ElseIf 逻辑表达式3 Then 语句序列3 ... … Else 语句序列n End If

在以上结构中,可以包括任意数量的ElseIf子句和条件,ElseIf子句总是出现在Else子句之前。

VBA首先判断“逻辑表达式1”的值。如果它为False,再判断“逻辑表达式2”的值,依此类推,当找到一个为True的条件,就会执行相应的语句块,然后执行End If后面的代码。如果所有“逻辑表达式”都为False,且包含Else语句块,则执行Else语句块。其流程图如图3-18所示。

图3-18 If…Then…ElseIf语句流程图

3.编写代码

(1)在Excel中打开成绩表。

(2)按快捷键“Alt+F11”进入VBE开发环境。

(3)单击“插入/模块”命令向工程中插入一个模块,并编写以下VBA代码: Sub 评定等级() Dim i As Integer For i = 3 To 11

t = Sheets(1).Cells(i, 2).Value '取得成绩 If t >= 90 Then j = \

ElseIf t >= 80 Then j = \

ElseIf t >= 70 Then j = \

ElseIf t >= 60 Then j = \ Else j = \ End If

Sheets(1).Cells(i, 3) = j Next End Sub

(4)返回Excel操作界面,在成绩表旁边增加一个按钮,并指定执行宏“评定等级”。 (5)单击“评定等级”按钮,即可在成绩表的C列显示出各成绩对应的等级,如图3-17所示。

例023 计算个人所得税

1.案例说明

在工资管理系统中,需要计算员工应缴纳的个人所得税。个人所得税税额按5%至45%的九级超额累进税率计算应缴税额,税率表如图3-19所示。

个人所得税的计算公式为:

应纳个人所得税税额=应纳税所得额×适用税率-速算扣除数

本例根据工资表中的相应数据计算出纳税额,并填充在工资表对应的列中。

图3-19 个人所得税税率表

2.关键技术

本例中计算个人所得税时共有九个分支。这时可在If…Then…ElseIf结构中添加多个ElseIf块来进行各分支的处理。对于多分支结构,可使用Select Case语句。Select Case语句的功能与If…Then…Else语句类似,但在多分支结构中,使用Select Case语句可使代码简洁易读。

Select Case结构的语法格式如下: Select Case 测试表达式 Case 表达式列表1 语句序列1 Case 表达式列表2 语句序列2 … … Case Else 语句序列n End Select

在以上结构中,首先计算出“测试表达式”的值,然后,VBA将表达式的值与结构中的每个Case的值进行比较。如果相等,就执行与该Case语句下面的语句块,执行完毕再跳转到End Select语句后执行。其流程图如图3-20所示。

图3-20 Select Case语句流程图

在Select Case结构中,“测试表达式”通常是一个数值型或字符型的变量。“表达式列表”可以是一个或几个值的列表。如果在一个列表中有多个值,需要用逗号将各值分隔开。表达式列表可以按以下几种情况进行书写:

— 表达式:表示一些具体的取值。例如:Case 10,15,25。

— 表达式A To 表达式B:表示一个数据范围。例如,Case 7 To 17表示7~17之间的值。

— Is 比较运算符表达式:表示一个范围。例如,Case Is>60 表示所有大于90的值。 — 以上三种情况的混合。例如,Case 4 To 10, 15, Is>20。

3.编写代码

(1)在Excel中打开工资表工作簿。

(2)按快捷键“Alt+F11”进入VBE开发环境。 (3)单击菜单“插入/模块”命令插入一个模块。 (4)在模块中编写以下函数,用来计算所得税: Function 个人所得税(curP As Currency) Dim curT As Currency

curP = curP – 1600 '1600为扣除数 If curP > 0 Then Select Case curP Case Is <= 500

curT = curP * 0.05 Case Is <= 2000

curT = (curP - 500) * 0.1 + 25 Case Is <= 5000

curT = (curP - 2000) * 0.15 + 125 Case Is <= 20000

curT = (curP - 5000) * 0.2 + 375 Case Is <= 40000

curT = (curP - 20000) * 0.25 + 1375 Case Is < 60000

curT = (curP - 40000) * 0.3 + 3375 Case Is < 80000

curT = (curP - 60000) * 0.35 + 6375 Case Is < 100000

curT = (curP - 80000) * 0.4 + 10375 Case Else

curT = (curP - 100000) * 0.45 + 15375 End Select 个人所得税 = curT Else

个人所得税 = 0

End If End Function

(5)在模块中编写“计算”子过程,计算工资表中每个员工应缴所得税额,并填写在对应的列中。

Sub 计算() For i = 4 To 9

Sheets(1).Cells(i, 8).Value = 个人所得税(Sheets(1).Cells(i, 6).Value) Next End Sub

(6)返回到Excel环境中,在工资表下方插入一个按钮,为按钮指定宏为“计算”。 (7)单击“计算”按钮,可计算出每个员工的所得税额,如图3-21所示。

图3-21 计算所得税

3.3 循环结构

在实际开发的应用系统中,经常需要重复执行一条或多条语句。这种结构称为循环结构。循环结构的思想是利用计算机高速处理运算的特性,重复执行某一部分代码,以完成大量有规则的重复性运算。

VBA提供了多个循环结构控制语句:Do…Loop结构、While…Wend结构、For…Next结构、For Each…Next结构。

例024 密码验证

1.案例说明

在信息管理系统中,很多时候都需要用户进行登录操作。在登录操作时要求用户输入密码,一般都要给用户三次机会,每次的输入过程和判断过程都相同。

本例使用Do…Loop循环完成密码验证过程。

2.关键技术

在VBA中,最常用的循环语句是Do…Loop循环。循环结构Do While…Loop的语法格式如下:

Do While 逻辑表达式 语句序列1 [Exit Do] [语句序列2] Loop

其中Do While和Loop为关键字,在Do While和Loop之间的语句称为循环体。 当VBA执行这个Do循环时,首先判断“逻辑表达式”的值,如果为False(或零),则跳过所有语句,执行Loop的下一条语句,如果为True(或非零),则执行循环体,当执行到Loop语句后,又跳回到Do While语句再次判断条件。在循环体中如果包含有Exit Do语句,当执行到Exit Do语句,马上跳出循环,执行Loop的下一条语句。其流程图如图3-22所示。

图3-22 Do While…Loop流程图

VBA的Do…Loop循环有4种结构,分别如下:

— Do While…Loop循环:先测试条件,如果条件成立则执行循环体。

— Do…Loop While循环:先执行一遍循环体,再测试循环条件,如果条件成立则执行循环体。

— Do Until…Loop循环:先测试条件,如果条件不成立则执行循环体。

— Do…Loop Until循环:先执行一遍循环体,再测试循环条件,如果条件不成立则执行循环体。

3.编写代码

(1)新建Excel工作簿,按快捷键“Alt+F11”进入VBE开发环境。 (2)单击菜单“插入/模块”命令向工程中插入一个模块。 (3)在模块中编写以下VBA代码:

Sub login()

Dim strPassword As String '保存密码 Dim i As Integer '输入密码的次数 Do

strPassword = InputBox(\请输入密码\'输入密码 If strPassword = \Then '判断密码是否正确 Exit Do '退出循环 Else

MsgBox (\请输入正确的密码!\ End If i = i + 1 Loop While i < 3

If i >= 3 Then '超过正常输入密码次数 MsgBox \非法用户,系统将退出!\ Application.Quit Else

MsgBox \欢迎你使用本系统!\ End If End Sub (4)返回Excel操作界面,在工作表中插入一个按钮,设置提示文字为“密码验证”,并为该按钮指定执行的宏为“login”。

(5)单击“密码验证”按钮,弹出如图3-23所示对

话框,输入密码后单击“确定”按钮进行密码的验证。

例025 求最小公倍数和最大公约数

1.案例说明

几个数公有的倍数叫做这几个数的公倍数,其中最小的一个叫做这几个数的最小公倍数。如12、18、20这三个数的最小公倍数为180。

最大公约数是指某几个整数的共有公约数中最大的那个数。如2、4、6这三个数的最大公约数为2。

本例使用辗转相除法求两个自然数m、n的最大公约数和最小公倍数。

2.关键技术

本例首先求出两数m、n的最大公约数,再将m、n数的乘积除以最大公约数,即可得到最小公倍数。求最大公约数的算法流程图如图3-24所示。

图3-24 最大公约数算法流程图

本例使用Do…Loop循环,并且没有设置循环条件。一般情况下,这种循环是一个死循环(也就是说程序将一直循环下去),因此,在这种循环结构中必须添加一个判断语句,当达到指定的条件时退出循环。如本例中使用以下语句退出循环:

If r = 0 Then Exit Do

3.编写代码

(1)新建Excel工作簿,按快捷键“Alt+F11”进入VBE环境。 (2)单击菜单“插入/模块”命令向工程中插入一个模块。 (3)在模块中编写以下子过程: Sub 最小公倍数和最大公约数() Dim m As Integer, n As Integer Dim m1 As Integer, n1 As Integer Dim t As Integer

m = InputBox(\输入自然数m:\ n = InputBox(\输入自然数n:\ m1 = m n1 = n

If m1 < n1 Then m1 = n

n1 = m '交换m和n的值 End If Do

r = m1 Mod n1 If r = 0 Then Exit Do m1 = n1 n1 = r Loop

str1 = m & \& n & \的最大公约数=\& n1 & vbCrLf str1 = str1 & \最小公倍数=\& m * n / n1 MsgBox str1 End Sub

(4)返回Excel操作环境,向工作表中插入一个按钮,为按钮指定执行上步创建的宏。 (5)单击按钮,弹出如图3-25所示的输入提示框,分别输入两个数后,得到如图3-26所示的结果。

图3-25 输入数据 图3-26 最大公约数和最小公倍

例026 输出ASCII码表

1.案例说明

目前计算机中用得最广泛的字符集及其编码,是由美国国家标准局(ANSI)制定的ASCII码。ASCII码由8位二进制组成,一共可包含256个符号。本例使用循环语句输出ASCII中的可见字符,如图3-27所示。

图3-27 ASCII码表

2.关键技术

使用Do…Loop循环时,可以不知道循环的具体次数。如果知道循环的次数,可以使用For…Next循环语句来执行循环。For循环的语法如下:

For 循环变量=初始值 To 终值 [Step 步长值] 语句序列1 [Exit For] [语句序列2] Next [循环变量]

在For循环中使用循环变量来控制循环,每重复一次循环之后,循环变量的值将与步长值相加。步长值可正可负,如果步长值为正,则初始值必须小于等于终值,才执行循环体,否则退出循环。如果步长值为负,则初始值必须大于等于终值,这样才能执行循环体。如果没有设置Step,则步长值默认为1。For…Next循环结构的流程图如图3-28所示。

For循环一般都可计算出循环体的执行次数,计算公式如下: 循环次数=[(终值-初值)/步长值]+1 这里用中括号表示取整。

在事先不知道循环体需要执行多少次时,应该用Do循环。而在知道循环体要执行的次数时,最好使用For…Next循环。

图3-28 For…Next流程图

3.编写代码

(1)新建Excel工作簿,按快捷键“Alt+F11”进入VBE环境。 (2)单击菜单“插入/模块”命令向工程中插入一个模块。 (3)在模块中编写以下子过程: Sub ascii()

Dim a As Integer, i As Integer i = 3

For a = 32 To 126 Sheets(1).Cells(i, 1) = a Sheets(1).Cells(i, 2) = Chr(a) i = i + 1 Next End Sub

(4)返回Excel操作环境,向工作表中插入一个按钮,为按钮指定执行上步创建的宏。 (5)单击按钮,得到如图3-27所示的结果。

例027 计算选中区域数值之和

1.案例说明

在某些情况下,需要统计工作表中选定区域数值单元格的数值之和(例如,临时查看应发奖金之和),在Excel的状态栏就可查看选中单元格的数值之和。本例编写VBA代码,使用循环结构来完成该项功能。

2.关键技术

用户在Excel工作表中选定单元格的数量是不固定的,若需统计所选单元格数值之和,这时可使用For Each循环来进行处理,对选中区域的每个单元格进行判断,然后再累加数值单元格的值。

For Each…Next循环语句的语法格式如下: For Each 元素 In 对象集合 [语句序列1] [Exit For] [语句序列2] Next

使用For Each循环结构,可在对象集合每个元素中执行一次循环体。如果集合中至少有一个元素,就会进入For Each循环体执行。一旦进入循环,便先针对“对象集合”中第一个元素执行循环中的所有语句。如果“对象集合”中还有其他的元素,则会针对它们执行循环中的语句,当“对象集合”中的所有元素都执行完了,便会退出循环,然后从Next语句之后的语句继续执行。

在循环体中可以放置任意多个Exit For语句,随时退出循环。Exit For经常在条件判断之后使用,例如If…Then,并将控制权转移到紧接在Next之后的语句。

3.编写代码

(1)新建Excel工作簿,按快捷键“Alt+F11”进入VBE环境。 (2)单击菜单“插入/模块”命令向工程中插入一个模块。 (3)在模块中编写以下子过程: Sub 求和() Dim r

Dim t As Long

For Each r In Selection If IsNumeric(r.Value) Then t = t + r.Value End If

Next

MsgBox \所选区域数值之和为:\& t End Sub

(4)返回Excel操作环境,向工作表中插入一个按钮,修改按钮的提示字符为“求和”,为按钮指定执行上步创建的宏“求和”。

(5)在工作表“Sheet1”中输入数据,如图3-29左图所示。

(6)拖动鼠标选中如图3-29左图所示数据区域,单击“求和”按钮,求和结果将显示在如图3-29右图所示对话框中。

图3-29 计算选中区域数值之和

例028 换零钱法(多重循环)

1.案例说明

将十元钱换成1角、2角、5角、1元、2元、5元的零钱若干,求出一共有多少种方法进行计算?

2.关键技术

在VBA中,循环结构内的循环体又可以是循环结构,这种情况称为循环的嵌套。VBA允许在同一过程里嵌套多种类型的循环。

在编写嵌套循环程序的代码时,一定要注意每个循环语句的配对情况。如图3-30所示,其中左图是正确的嵌套关系,第一个Next关闭了内层的For循环,而最后一个Loop关闭了外层的Do循环。同样,在嵌套的If语句中,End If语句自动与最靠近的前一个If语句配对。嵌套的Do…Loop结构的工作方式也是一样的,最内圈的Loop语句与最内圈的Do语句匹配。图3-30右图则是错误的嵌套关系。 语句序列2