1、43 个典型 ExcelVBA 实例目录例 1.九九乘法表(Print 方法的应用) .3例 2 输入个人信息(Inputbox 函数的应用) 3例 3 退出确认(Msgbox 函数的应用) .5例 4 突出显示不及格学生 .7例 5 从身份证号码中提取性别 8例 6 评定成绩等级 9例 7 计算个人所得税 11例 8 密码验证 13例 9 求最小公倍数和最大公约数 15例 10 输出 ASCII 码表 .16例 11 计算选中区域数值之和 17例 12 换零钱法(多重循环) 18例 13 数据排序 21例 14 彩票幸运号码 22例 15 用数组填充单元格区域 24例 16 判断单元格是否包
2、含公式 .25例 17 自动填充公式 .26例 18 锁定和隐藏公式 .28例 19 将单元格公式转换为数值 .29例 20 删除所有公式 29例 21 用 VBA 表示数组公式 .30数据 查询 31例 22 查找指定的值 31例 23 带格式查找 33例 24 查找上一个/下一个数据 .34例 25 代码转换 .36例 26 模糊查询 37例 27 网上查询快件信息 38例 28 查询基金信息 40例 29 查询手机所在地 41例 30 使用字典查询 43数据排序 45例 31 用 VBA 代码排序 .45例 32 乱序排序 46例 33 自定义序列排序 47例 34 多关键字排序 49例
3、 35 输入数据自动排序 50例 36 数组排序 .51例 37 使用 Small 和 Large 函数排序 52例 38 使用 RANK 函数排序 .54例 39 姓名按笔画排序 56例 40 用 VBA 进行简单筛选 .59例 41 用 VBA 进行高级筛选 .61例 42 筛选非重复值 .62例 43 取消筛选 63:例 1.九九乘法表(Print 方法的应用)1 案例说明在早期的 Basic 版本中,程序运行结果主要依靠 Print 语句输出到终端。在 VB 中,Print 作为窗体的一个方法,用来在窗体中显示信息。但是在 VBA 中,用户窗体已经不支持 Print 方法了。在 VBA
4、 中,Print 方法只能向“立即窗口” 中输出程序的运行中间结果,供开发人员调试程序时使用。本例使用 Print 方法在立即窗口中输入九九乘法表。2 关键技术在 VBA 中,Print 方法只能应用于 Debug 对象,其语法格式如下:Debug.Print outputlist参数 outputlist 是要打印的表达式或表达式的列表。如果省略,则打印一个空白行。 Print 首先计算表达式的值,然后输出计算的结果。在 outputlist 参数中还可以使用分隔符,以格式化输出的数据。格式化分隔符有以下几种: Spc(n):插入 n 个空格到输出数据之间; Tab(n):移动光标到适当位置
5、,n 为移动的列数; 分号:表示前后两个数据项连在一起输出; 逗号:以 14 个字符为一个输出区,每个数据输出到对应的输出区。3编写代码(1)在 VBE 中,单击菜单“插入/模块”命令插入一个模块。(2)在模块中输入以下代码:Sub multi()For i = 1 To 9For j = 1 To iDebug.Print i; “x“; j; “=“; i * j; “ “;NextDebug.Print NextEnd Sub(3)按功能键“F5”运行子过程,在“立即窗口”输出九九乘法表,如图 3-1 所示。例 2 输入个人信息(Inputbox 函数的应用)1案例说明本例演示 Inpu
6、tbox 函数的使用方法。执行程序,将弹出“输入个人信息”对话框,要求用户输入“姓名、年龄、地址”信息,然后在“立即窗口”中将这些信息打印输出。2关键技术为了实现数据输入,VBA 提供了 InputBox 函数。该函数将打开一个对话框作为输入数据的界面,等待用户输入数据,并返回所输入的内容。其语法格式如下:InputBox(prompt, title , default , xpos , ypos , helpfile, context) 各参数的含义如下: Prompt:为对话框消息出现的字符串表达式。其最大长度为 1024 个字符。如果需要在对话框中显示多行数据,则可在各行之间用回车符换行
7、符来分隔,一般使用 VBA 的常数 vbCrLf 代表回车换行符。 Title:为对话框标题栏中的字符串。如果省略该参数,则把应用程序名放入标题栏中。 Default:为显示在文本框中的字符串。如果省略该参数,则文本框为空。 Xpos:应和 Ypos 成对出现,指定对话框的左边与屏幕左边的水平距离。如果省略该参数,则对话框会在水平方向居中。 Ypos:应和 Xpos 成对出现,指定对话框的上边与屏幕上边的距离。如果省略该参数,则对话框被放置在屏幕垂直方向距下边大约三分之一的位置。 Helpfile:设置对话框的帮助文件,可省略。 Context:设置对话框的帮助主题编号,可省略。3编写代码(1
8、)在 VBE 中,单击菜单“插入/模块”命令插入一个模块。(2)在模块中输入以下代码:Sub inputinfo()Title = “输入个人信息“name1 = “请输入姓名:“age1 = “请输入年龄:“address1 = “请输入地址:“strName = InputBox(name1, Title)age = InputBox(age1, Title)Address = InputBox(addres1, Title)Debug.Print “姓名:“; strNameDebug.Print “年龄:“; ageDebug.Print “地址:“; AddressEnd Sub(3
9、)按功能键“F5”运行子过程,将弹出“输入个人信息”窗口。在对话框中输入内容后按“回车” ,或单击“确定”按钮。(4)接着输入“年龄”和“地址”信息,在“立即窗口”中将输出这些内容。例 3 退出确认(Msgbox 函数的应用)1案例说明在应用程序中,有时用户会由于误操作关闭 Excel,为了防止这种情况,可在退出 Excel 之前弹出对话框,让用户确认是否真的要关闭 Excel。本例使用 Msgbox 函数弹出对话框,让用户选择是否退出系统。2关键技术使用 MsgBox 函数可打开一个对话框,在对话框中显示一个提示信息,并让用户单击对话框中的按钮,使程序继续执行。MsgBox 函数语法格式如下
10、:Value=MsgBox(prompt,buttons,title ,helpfile,context)通过函数返回值可获得用户单击的按钮,并可根据按钮的不同而选择不同的程序段来执行。该函数共有 5 个参数,除第 1 个参数外,其余参数都可省略。各参数的意义与 Inputbox 函数参数的意义基本相同,不同的地方是多了一个 buttons 参数,用来指定显示按钮的数目及形式、使用提示图标样式、默认按钮以及消息框的强制响应等。其常数值如表 3-1 所示。表 3-1 按钮常数值常 量 值 说 明vbOkOnly 0 只显示“确定”(Ok)按钮vbOkCancel 1 显示“确定”(Ok)及“取消
11、” ( Cancel)按钮vbAbortRetryIgnore2 显示“异常终止” (Abort) 、 “重试 ”(Retry)及“忽略”(Ignore)按钮vbYesNoCancel3 显示“是”(Yes) 、 “否” (No)及“取消” (Cancel )按钮续表 常 量 值 说 明vbYesNo 4 显示“是”(Yes)及“ 否” (No)按钮vbRetryCancel 5 显示“重试”(Retry )及“取消”(Cancel)按钮vbCritical 16显示 Critical Message 图标vbQuestion 32显示 Warning Query 图标vbExclamatio
12、n 48显示 Warning Message 图标vbInformation 64显示 Information Message 图标vbDefaultButton10 以第一个按钮为默认按钮vbDefaultButton2256以第二个按钮为默认按钮vbDefaultButton3512以第三个按钮为默认按钮vbDefaultButton4768以第四个按钮为默认按钮vbApplicationModal0 进入该消息框,当前应用程序暂停vbSystemModal4096进入该消息框,所有应用程序暂停表 3-1 中的数值(或常数)可分为四组,其作用分别为: 第一组值(05)用来决定对话框中按钮的
13、类型与数量。 第二组值(16,32,48,64)用来决定对话框中显示的图标。 第三组值(0,256,512)设置对话框的默认活动按钮。活动按钮中文字的周转有虚线,按回车键可执行该按钮的单击事件代码。 第四组值(0,4096)决定消息框的强制响应性。buttons 参数可由上面 4 组数值组成,其组成原则是:从每一类中选择一个值,把这几个值累加在一起就是 buttons 参数的值(大部分时间里都只使用前三组数值的组合) ,不同的组合可得到不同的结果。3编写代码(1)在 VBE 中,双击“工程”子窗口中的“ThisWorkbook”打开代码窗口,如图 3-4 所示。(2)在代码窗口左上方的对象列表
14、中选择“Workbook” ,如图 3-5 所示。(3)在代码窗口右上方的事件列表中选择“BeforeClose” ,如图 3-6 所示。代码窗口中将自动生成事件过程结构如下:Private Sub Workbook_BeforeClose(Cancel As Boolean)End Sub(4)在上面生成的事件过程中输入以下代码:Private Sub Workbook_BeforeClose(Cancel As Boolean)Dim intReturn As IntegerintReturn = MsgBox(“真的退出系统吗? “, vbYesNo + vbQuestion, “提示“
15、)If intReturn 18 Then 判断身份证号长度是否正确MsgBox “身份证号码只能为 15 位或 18 位!“Exit SubEnd IfIf i = 15 Then 长度为 15 位s = Right(sid, 1) 取最右侧的数字Else 长度为 18 度s = Mid(sid, 17, 1) 取倒数第 2 位数End IfIf Int(s / 2) = s / 2 Then 为偶数sex = “女“Elsesex = “男“End IfMsgBox “性别: “ + sexEnd Sub(3)切换到 Excel 环境,添加一个按钮 “从身份证号码提取性别” ,并指定执行上
16、步创建的宏。(4)单击“从身份证号码提取性别”按钮。(5)输入身份证号码后单击“确定”按钮。例 6 评定成绩等级1案例说明本例将成绩表中的百分制成绩按一定规则划分为 A、B、C、D、E 五个等级。其中各等级对应的成绩分别为: A:大于等于 90 分; B:大于等于 80 分,小于 90 分; C:大于等于 70 分,小于 80 分; D:大于等于 60 分,小于 70 分; E:小于 60 分。2关键技术本例共有五个分支,使用 IfThenElse 这种二路分支结构也可完成,但需要复杂的嵌套结构才能解决该问题。其实 VBA 中提供了一种 IfThenElseIf 的多分支结构,其语法格式如下:
17、If 逻辑表达式 1 Then语句序列 1ElseIf 逻辑表达式 2 Then语句序列 2.ElseIf 逻辑表达式 3 Then语句序列 3. Else语句序列 nEnd If在以上结构中,可以包括任意数量的 ElseIf 子句和条件, ElseIf 子句总是出现在 Else子句之前。VBA 首先判断“逻辑表达式 1”的值。如果它为 False,再判断“逻辑表达式 2”的值,依此类推,当找到一个为 True 的条件,就会执行相应的语句块,然后执行 End If 后面的代码。如果所有“逻辑表达式”都为 False,且包含 Else 语句块,则执行 Else 语句块。3编写代码(1)在 Exc
18、el 中打开成绩表。(2)按快捷键“Alt+F11”进入 VBE 开发环境。(3)单击“插入/模块”命令向工程中插入一个模块,并编写以下 VBA 代码:Sub 评定等级()Dim i As IntegerFor i = 3 To 11t = Sheets(1).Cells(i, 2).Value 取得成绩If t = 90 Thenj = “A“ElseIf t = 80 Thenj = “B“ElseIf t = 70 Thenj = “C“ElseIf t = 60 Thenj = “D“Elsej = “E“End IfSheets(1).Cells(i, 3) = jNextEnd S
19、ub(4)返回 Excel 操作界面,在成绩表旁边增加一个按钮,并指定执行宏“评定等级” 。(5)单击“评定等级”按钮,即可在成绩表的 C 列显示出各成绩对应的等级,如图 3-17 所示。例 7 计算个人所得税1案例说明在工资管理系统中,需要计算员工应缴纳的个人所得税。个人所得税税额按 5%至 45%的九级超额累进税率计算应缴税额。个人所得税的计算公式为:应纳个人所得税税额=应纳税所得额适用税率- 速算扣除数本例根据工资表中的相应数据计算出纳税额,并填充在工资表对应的列中。2关键技术本例中计算个人所得税时共有九个分支。这时可在 IfThenElseIf 结构中添加多个 ElseIf 块来进行各
20、分支的处理。对于多分支结构,可使用 Select Case 语句。Select Case 语句的功能与 IfThenElse 语句类似,但在多分支结构中,使用 Select Case 语句可使代码简洁易读。Select Case 结构的语法格式如下:Select Case 测试表达式Case 表达式列表 1语句序列 1Case 表达式列表 2语句序列 2 Case Else语句序列 nEnd Select在以上结构中,首先计算出“测试表达式”的值,然后,VBA 将表达式的值与结构中的每个 Case 的值进行比较。如果相等,就执行与该 Case 语句下面的语句块,执行完毕再跳转到 End Sel
21、ect 语句后执行。其流程图如图 3-20 所示。在 Select Case 结构中, “测试表达式”通常是一个数值型或字符型的变量。 “表达式列表”可以是一个或几个值的列表。如果在一个列表中有多个值,需要用逗号将各值分隔开。表达式列表可以按以下几种情况进行书写: 表达式:表示一些具体的取值。例如:Case 10,15,25。 表达式 A To 表达式 B:表示一个数据范围。例如,Case 7 To 17 表示 717 之间的值。 Is 比较运算符表达式:表示一个范围。例如, Case Is60 表示所有大于 90 的值。 以上三种情况的混合。例如,Case 4 To 10, 15, Is20
22、。3编写代码(1)在 Excel 中打开工资表工作簿。(2)按快捷键“Alt+F11”进入 VBE 开发环境。(3)单击菜单“插入/模块” 命令插入一个模块。(4)在模块中编写以下函数,用来计算所得税:Function 个人所得税(curP As Currency)Dim curT As CurrencycurP = curP 1600 1600 为扣除数If curP 0 ThenSelect Case curPCase Is = 3 Then 超过正常输入密码次数MsgBox “非法用户,系统将退出!“Application.QuitElseMsgBox “欢迎你使用本系统!“End If
23、End Sub(4)返回 Excel 操作界面,在工作表中插入一个按钮,设置提示文字为“密码验证” ,并为该按钮指定执行的宏为“login”。(5)单击“密码验证”按钮,弹出对话框,输入密码后单击“确定”按钮进行密码的验证。例 9 求最小公倍数和最大公约数1案例说明几个数公有的倍数叫做这几个数的公倍数,其中最小的一个叫做这几个数的最小公倍数。如 12、18、20 这三个数的最小公倍数为 180。最大公约数是指某几个整数的共有公约数中最大的那个数。如 2、4、6 这三个数的最大公约数为 2。本例使用辗转相除法求两个自然数 m、n 的最大公约数和最小公倍数。2关键技术本例首先求出两数 m、n 的最
24、大公约数,再将 m、n 数的乘积除以最大公约数,即可得到最小公倍数。本例使用 DoLoop 循环,并且没有设置循环条件。一般情况下,这种循环是一个死循环(也就是说程序将一直循环下去) ,因此,在这种循环结构中必须添加一个判断语句,当达到指定的条件时退出循环。如本例中使用以下语句退出循环:If r = 0 Then Exit Do3编写代码(1)新建 Excel 工作簿,按快捷键 “Alt+F11”进入 VBE 环境。(2)单击菜单“插入/模块” 命令向工程中插入一个模块。(3)在模块中编写以下子过程:Sub 最小公倍数和最大公约数()Dim m As Integer, n As Integer
25、Dim m1 As Integer, n1 As IntegerDim t As Integerm = InputBox(“输入自然数 m:“)n = InputBox(“输入自然数 n:“)m1 = mn1 = nIf m1 0,则将生成随机序列中的下一个随机数。 number=0,则将生成最近生成的数。 省略 number,则生成序列中的下一个随机数。 在调用 Rnd 之前,先使用无参数的 Randomize 语句初始化随机数生成器,该生成器具有根据系统计时器得到的种子。为了生成某个范围内的随机整数,可使用以下公式:Int(上限 下限 + 1) * Rnd + 下限)3编写代码(1)新建
26、Excel 工作簿,按快捷键 “Alt+F11”进入 VBE 环境。(2)单击菜单“插入/模块” 命令向工程中插入一个模块。(3)在模块中编写以下代码:Option Base 1Sub 幸运号码()Dim n As Integer, i As Integer, j As IntegerDim l() As Integern = Application.InputBox(“请输入需要产生幸运号码的数量:“, “ 幸运号码“, , , , , , 2)ReDim l(n, 7) As IntegerFor i = 1 To nFor j = 1 To 7Randomizel(i, j) = Int
27、(10 * Rnd)NextNextFor i = 1 To nFor j = 1 To 7Debug.Print l(i, j);NextDebug.PrintNextEnd Sub(4)运行上面的宏,弹出如图 3-35 所示的对话框,提示用户输入数据。输入生成幸运号码的数量。(5)单击“确定”按钮后在“立即窗口”输出生成的幸运号码。例 15 用数组填充单元格区域1案例说明在 Excel 中要处理大量数据时,可使用循环从各单元格读入数据,经过加工处理后再写回单元格区域中。这种方式比在数组中处理数据的速度要慢。因此,如果有大量的数据需要处理时,可先将数据保存到数组中,经过加工处理后,再将数组的
28、数据填充到单元格区域。本例演示将二维数组中的数据填充到工作表中的方法。2关键技术在 Excel 工作表中,工作表是一个二维结构,由行和列组成。这种特性与二维数组类似,因此可以很方便地将工作表单元格区域与二维数组之间进行转换。通过以下语句可将单元格区域赋值给一个二维数组:myarr = Range(Cells(1, 1), Cells(5, 5)反过来,也可将二维数组中的值快速的赋值给一个单元格区域,如以下语句将二维数组 myarr 中的值赋值给单元格区域 Rng:Rng.Value = arr3编写代码(1)新建 Excel 工作簿,按快捷键 “Alt+F11”进入 VBE 环境。(2)单击菜
29、单“插入/模块” 命令向工程中插入一个模块。(3)在模块中编写以下代码:Option Base 1Sub 数组填充单元格区域()Dim i As Long, j As LongDim col As Long, row As LongDim arr() As Longrow = Application.InputBox(prompt:=“输入行数:“, Type:=2)col = Application.InputBox(prompt:=“输入列数:“, Type:=2)ReDim arr(row, col)For i = 1 To rowFor j = 1 To colarr(i, j) =
30、(i - 1) * col + jNextNextSet Rng = Sheets(1).Range(Cells(1, 1), Cells(row, col)Rng.Value = arrEnd Sub(4)返回 Excel 操作环境,向工作表中添加一个按钮,设置提示文字为“填充数据” ,指定该按钮的宏为“数组填充单元格区域”。(5)单击“填充数据”按钮,弹出对话框,分别输入数组的行和列。输入行和列(6)VBA 代码生成一个二维数组,最后填充到工作表中。通过 Excel 相关对象可对工作表中的数据进行操作,如处理单元格区域的公式、对数据进行查询、排序、筛选等操作。本章演示使用 VBA 进行处理
31、数据的实例。处理公式使用 VBA 代码可对工作表中的公式单元格进行处理,如判断单元格是否包含公式、复制公式、将单元格公式转换为具体的值等。例 16 判断单元格是否包含公式1案例说明打开本例工作簿,单击左上角的“公式单元格”按钮,将弹出提示框,显示当前工作表中定义了公式的单元格。显示有公式的单元格2关键技术本例使用 Range 对象的 HasFormula 属性来判断指定单元格是否包含公式,如果区域中所有单元格均包含公式,则该属性值为 True;如果所有单元格均不包含公式,则该属性值为 False;其他情况下为 null。本例对当前单元格区域中的单元格逐个进行判断,并显示出具有公式的单元格。3编
32、写代码“公式单元格”按钮的 VBA 代码如下:Sub 显示公式单元格()Dim rng As RangeSet rng = ActiveSheet.Range(“A1“).CurrentRegionFor Each c In rng.CellsIf c.HasFormula ThenMsgBox “单元格“ & c.Address & “ 定义了公式!“End IfNextEnd Sub例 17 自动填充公式1案例说明打开本例工作簿如图 12-2 所示,在如图所示工作表中,单元格 J3 和 D16 定义了公式,单击“填充公式”按钮,单元格 J3 的公式将向下填充,单元格 D16 的公式向右填充
33、。2关键技术本例使用 Range 对象的 AutoFill 方法,对指定区域中的单元格执行自动填充。该方法的语法格式如下:表达式.AutoFill(Destination, Type)该方法有两个参数,其含义如下: Destination:要填充的单元格。目标区域必须包括源区域。 Type:指定填充类型。该填充类型可使用 xlAutoFillType 枚举类型,其值如表 12-1 所示。xlAutoFillType 枚举值名 称 值 描 述xlFillCopy 1 将源区域的值和格式复制到目标区域,如有必要可重复执行xlFillDays 5 将星期中每天的名称从源区域扩展到目标区域中。格式从源
34、区域复制到目标区域,如有必要可重复执行xlFillDefault0 Excel 确定用于填充目标区域的值和格式xlFillFormats3 只将源区域的格式复制到目标区域,如有必要可重复执行xlFillMonths7 将月名称从源区域扩展到目标区域中。格式从源区域复制到目标区域,如有必要可重复执行xlFillSeries2 将源区域中的值扩展到目标区域中,形式为系列(如, “1, 2”扩展为“3, 4, 5”) 。格式从源区域复制到目标区域,如有必要可重复执行xlFillValues4 只将源区域的值复制到目标区域,如有必要可重复执行xlFillWeekdays6 将工作周每天的名称从源区域扩
35、展到目标区域中。格式从源区域复制到目标区域,如有必要可重复执行xlFillYears8 将年从源区域扩展到目标区域中。格式从源区域复制到目标区域,如有必要可重复执行xlGrowthTrend10将数值从源区域扩展到目标区域中,假定源区域的数字之间是乘法关系(如, “1, 2,”扩展为“4, 8, 16”,假定每个数字都是前一个数字乘以某个值的结果) 。格式从源区域复制到目标区域,如有必要可重复执行xlLinearTrend9 将数值从源区域扩展到目标区域中,假定数字之间是加法关系(如, “1, 2,”扩展为“3, 4, 5”,假定每个数字都是前一个数字加上某个值的结果) 。格式从源区域复制到目
36、标区域,如有必要可重复执行3编写代码“填充公式”按钮的 VBA 代码如下:Sub 填充公式()Dim i As Long, j As LongWith Range(“A1“).CurrentRegioni = .Rows.Count - 1j = .Columns.Count - 1End WithRange(“J3“).AutoFill _Destination:=Range(Cells(3, 10), Cells(i, 10)Range(“D16“).AutoFill _Destination:=Range(Cells(16, 4), Cells(16, j)End Sub以上代码首先获取
37、当前区域的行和列,接着使用 AutoFill 方法在垂直方向和水平方向填充相应的公式。例 18 锁定和隐藏公式1案例说明打开本例工作簿,单击“锁定隐藏公式”按钮,当前工作表中的所有公式单元格将被锁定,不允许用户修改,而其他单元格的数据用户可进行修改。同时,公式单元格定义的公式将被隐藏,单击选取具有公式的单元格时,将不会显示公式。图 12-4 锁定和隐藏公式2关键技术要锁定和隐藏单元格,可通过 Range 对象的以下两个属性来进行设置。 Locked 属性:指明对象是否已被锁定。 FormulaHidden 属性:指明在工作表处于保护状态时是否隐藏公式。当设置以上两个属性为 True 时,对指定
38、区域锁定和隐藏。但要真正锁定和隐藏单元格,必须使用 Protect 方法对工作表进行保护。3编写代码“锁定隐藏公式” 按钮的 VBA 代码如下:Sub 锁定和隐藏公式()If ActiveSheet.ProtectContents = True ThenMsgBox “工作表已保护!“Exit SubEnd IfWorksheets(“Sheet1“).Range(“A1“).CurrentRegion.SelectSelection.Locked = FalseSelection.FormulaHidden = FalseSelection.SpecialCells(xlCellTypeFo
39、rmulas).SelectSelection.Locked = TrueSelection.FormulaHidden = TrueWorksheets(“Sheet1“).Protect DrawingObjects:=True, Contents:=True, Scenarios:=TrueWorksheets(“Sheet1“).EnableSelection = xlNoRestrictionsEnd Sub例 19 将单元格公式转换为数值1案例说明打开本例工作簿,在当前工作表中单元格区域“J3:J15”和“D16:I15”中都定义了公式,单击选择这两个区域中的任意一个单元格,编辑栏
40、中将显示该单元格的公式。单击工作表左上角的“公式转为数值”按钮,当前工作表中所有公式单元格的公式定义都将被具体计算值所替代,这时再修改引用单元格的值,这两个区域的值不会再变化了。2关键技术将单元格公式转换为计算结果的表示方法很简单,只需通过以下的赋值运算即可:rng.Value = rng.Value以上赋值语句中,rng 表示 Range 对象,该语句首先通过右侧的表达式 rng.Value 获取指定单元格的值(如果是公式,则获取公式的计算结果) ,再将该值赋值给单元格的 Value变量,从而取代单元格原有的内容(公式) 。3编写代码“公式转为数值” 按钮的 VBA 代码如下:Sub 公式转
41、为数值()Dim rng As Range, c As RangeSet rng = ActiveSheet.Range(“A1“).CurrentRegionFor Each c In rng.CellsIf c.HasFormula Thenc.Value = c.ValueEnd IfNextEnd Sub以上代码首先获取工作表的当前区域,再逐个单元格判断,如果单元格有公式,则进行转换。例 20 删除所有公式1案例说明在 Excel 中,当单元格的数据发生改变后,引用该单元格的公式单元格的值也会随之变化。有时希望经过计算后,具有公式的单元格的值不再随着引用单元格而变化。这时可以删除工作表
42、中的公式,取消与引用单元格的关联。打开本例工作簿,在如图所示的工作表中部分单元格具有公式,单击选择单元格 I16,在编辑栏中可看到具体的公式。具有公式的工作表单击“删除所有公式”按钮,将打开对话框,询问用户是否删除提示工作簿中的所有公式,单击“是”按钮工作簿中各工作表中的公式都将被删除,选中单元格 I16,编辑栏中可以看到显示的是具体的值,公式已被删除。确认操作删除公式的工作表2关键技术本例代码与上例类似,不同的是本例将对所有打开工作簿进行处理,对每个工作簿的每张工作表进行循环,将具有公式的单元格转换为具体的数值。3编写代码“删除所有公式” 按钮的 VBA 代码如下:Sub 删除所有公式()D
43、im wb1 As Workbook, ws1 As WorksheetDim rng As Range, rng1 As RangeFor Each wb1 In WorkbooksWith wb1If MsgBox(“是否删除工作簿 “ & wb1.Name & “”中的所有公式?“, _vbQuestion + vbYesNo) = vbYes ThenFor Each ws1 In .WorksheetsOn Error Resume NextSet rng1 = ws1.UsedRange.SpecialCells(xlCellTypeFormulas)获取公式单元格区域引用For Each rng In rng1rng.Value = rng.Value 将公式转换成数值NextNextEnd IfEnd WithNextEnd Sub