《第2章 实用VBA代码实例.pdf》由会员分享,可在线阅读,更多相关《第2章 实用VBA代码实例.pdf(21页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、人民邮电出版社Excel 公式与函数大辞典配套光盘附赠电子书Excel 2013 VBA 篇 第第2章 简单而实用的章 简单而实用的 VBA 代码代码 本章将针对上一章介绍的几个重要对象,给出与它们相关的一些简单而实用的 VBA 代码,这样既可以复习这几个重要对象的知识,又能了解它们在 Excel VBA 中的具体用法,还可以掌握一些简单的代码实例。2.1 控制窗口这里说的控制窗口,是指通过 VBA 程序控制 Excel 窗口的各种状态,如调整窗口大小、设置窗口标题、控制窗口界面显示状态、改变窗口显示比例等。2.1.1 最大化 Excel 程序窗口 要让 Excel 程序窗口最大化,可以使用下
2、面的代码:Sub 最大化 Excel 程序窗口()Application.WindowState=xlMaximized End Sub WindowState 属性有以下 3 个常量:?xlMaximized:最大化窗口。?xlMinimized:最小化窗口。?xlNormal:恢复正常窗口。2.1.2 设置工作簿窗口大小 下面的代码将当前 Excel 工作簿窗口的高度和宽度各缩小为原来的四分之一:Sub 设置工作簿窗口大小()Dim h As Long,w As Long ActiveWindow.WindowState=xlNormal h=ActiveWindow.Height w=A
3、ctiveWindow.Width ActiveWindow.Height=h/4 ActiveWindow.Width=w/4 End Sub 2.1.3 设置工作簿窗口标题栏的显示内容 如果想要人工控制工作簿窗口标题栏的显示内容,那么可以使用下面的代码:16人民邮电出版社Excel 公式与函数大辞典配套光盘附赠电子书Excel 2013 VBA 篇 Sub 设置工作簿窗口标题栏的显示内容()Application.Caption=使用程序设置 Excel 工作簿的标题 End Sub 运行上面的代码后,将显示如图 2-1所示的结果。图 2-1 通过程序改变 Excel 窗口标题栏的显示内容
4、 2.1.4 设置显示比例 要设置工作簿窗口内的显示比例,可以使用下面的代码:Sub 设置显示比例()ActiveWindow.Zoom=True ActiveWindow.Zoom=200 End Sub 2.1.5 控制 Excel 界面的显示 Excel 程序窗口中的公式栏、滚动条和状态栏的显示状态,由下面 3 个属性控制:?DisplayFormulaBar 属性:控制是否显示公式栏。?DisplayScrollBars 属性:控制是否显示滚动条。?DisplayStatusBar 属性:控制是否显示状态栏。因此,可以使用下面的代码来控制公式栏、滚动条和状态栏都不显示:Sub 控制 E
5、xcel 界面的显示()With Application .DisplayFormulaBar=False .DisplayScrollBars=False .DisplayStatusBar=False End With End Sub 运行上面的代码后,Excel 工作簿窗口将显示如图 2-2所示的结果,隐藏了公式栏、滚动条和状态栏。17人民邮电出版社Excel 公式与函数大辞典配套光盘附赠电子书Excel 2013 VBA 篇 图 2-2 隐藏了公式栏、滚动条和状态栏 2.1.6 设置状态栏 您希望在 Excel 运行过程中,时刻在状态栏中反映出当前 Excel 正在做什么吗?那么可以设
6、置状态栏中的显示内容。使用 StatusBar 属性可以设置或返回状态栏中的内容,而 DisplayStatusBar 属性则控制是否显示 Excel 的状态栏。Sub 设置状态栏()OldStatusBar=Application.DisplayStatusBar Application.DisplayStatusBar=True Application.StatusBar=系统正在进行数值运算,请耐心等待 End Sub 运行上面的代码,在 Excel 窗口的状态栏中,将显示如图 2-3所示的结果。图 2-3 自定义状态栏中的显示内容 由于在上面的代码开始处使用一个变量保存了 Excel
7、状态栏的初始状态。因此,在执行完相应操作后,可以使用下面的代码将状态栏还原为初始值:Application.StatusBar=False Application.DisplayStatusBar=OldStatusBar 18人民邮电出版社Excel 公式与函数大辞典配套光盘附赠电子书Excel 2013 VBA 篇 2.2 处理工作簿本节将给出一些使用VBA处理Excel工作簿的代码实例,包括工作簿的一些基本操作,例如新建、打开、保存、关闭工作簿以及判断工作簿状态和设置工作簿密码等内容。2.2.1 新建工作簿 Workbooks 集合包含 Excel 程序中所有打开的工作簿对象(Workb
8、ook)。可以使用 Wordkbooks 集合中的 Add 方法来新建工作簿,代码如下:Sub 新建工作簿()Workbooks.Add End Sub 2.2.2 打开工作簿 使用 Workbooks 集合的 Open 方法可以打开一个指定的工作簿,在代码中要注意正确输入工作簿的路径和名称。例如,下面的代码将打开电脑中磁盘分区 E 中的文件夹为“工作簿素材”中的工作簿“第 1 章.xlsx”:Sub 打开工作簿()Workbooks.Open(E:工作簿素材第 1 章.xlsx)End Sub 2.2.3 保存工作簿 可以使用 Workbooks 集合的 Save 方法对工作簿进行保存,相当
9、于单击 Excel 快速访问工具栏中的【保存】按钮。例如,下面的代码对当前工作簿进行保存:Sub 保存工作簿()ActiveWorkbook.Save End Sub 运行上面的代码,将对当前工作簿自动保存。如果工作簿从未保存过,那么将会自动提示用户是否对当前工作簿进行保存。2.2.4 另存工作簿 如果需要为当前工作簿创建一个副本,那么需要使用另存为工作簿的功能,这时可以使用 Workbooks 集合的 SaveAs 方法。下面的代码将当前工作簿以“第 2 章.xlsm”名称进行保存:Sub 另存工作簿()19人民邮电出版社Excel 公式与函数大辞典配套光盘附赠电子书Excel 2013 V
10、BA 篇 ActiveWorkbook.SaveAs Filename:=第 2 章.xlsm End Sub 2.2.5 保存所有工作簿 如果要对当前所有打开的多个工作簿进行一次性保存,可以使用 For Each 语句遍历所有工作簿,然后对每个工作簿执行保存命令,代码如下:Sub 保存所有工作簿()Dim WB As Workbook For Each WB In Workbooks WB.Save Next WB End Sub 2.2.6 保存并关闭所有工作簿 如果希望对所有的工作簿再保存后关闭,那么可以使用下面的代码:Sub 保存并关闭所有工作簿()Dim WB As Workbook
11、 For Each WB In Workbooks If WB.Name ThisWorkbook.Name Then WB.Close savechanges:=True End If Next WB ThisWorkbook.Close savechanges:=True End Sub 运行上面的代码,Excel 将遍历所有已打开的工作簿,ThisWorkbook 属性表示当前包含宏的工作簿。需要设置一个 IF 语句来判断当前要关闭的工作簿是否是宏工作簿,如果不是则关闭。因为如果关闭了包含宏的工作簿,那么这段代码也就无法继续运行了。2.2.7 判断工作簿是否存在 由于使用 VBA 程序打
12、开工作簿都是自动完成而不需要人工干预的,因此在运行打开工作簿的代码前应该先判断该工作簿是否已经存在。如果该工作簿不存在,那么程序将会出错。在 VBA 代码中可以使用 Dir 函数来获取指定文件所在的路径字符串,然后使用 LEN函数判断字符串长度。如果不大于 0,那么说明指定工作簿不存在。可以使用以下代码在打开工作簿前先判断工作簿是否存在:Sub 判断工作簿是否存在()If Not Len(Dir(E:工作簿素材第 1 章.xlsx)0 Then 20人民邮电出版社Excel 公式与函数大辞典配套光盘附赠电子书Excel 2013 VBA 篇 MsgBox 要打开的工作簿不存在!Else Wor
13、kbooks.Open E:工作簿素材第 1 章.xlsx End If End Sub 运行上面的代码,如果要打开的工作簿不存在,那么将显示提示信息,如图 2-4所示。图 2-4 当工作簿不存在是显示提示信息 2.2.8 将 R1C1 转换为 A1 样式 在 Excel 中可以通过【Excel 选项】对话框中的设置,在 R1C1 和 A1 引用样式之间切换。也可以使用 VBA 代码来完成这项工作,ConvertFormula 方法可以完成在 R1C1 和 A1引用样式间切换,而且该方法还可以在相对引用和绝对引用间切换。其语法格式如下:Application.ConvertFormula(公式
14、字符串,原来的引用样式,要返回的引用样式,转换类型,关联的单元格)例如,可以使用下面的代码将包含 R1C1 引用样式的公式“=SUM(R1C1:R10C1)”转换为包含 A1 引用样式的公式,并显示转换结果:Sub 将 R1C1 转换为 A1 样式()inputFormula=SUM(R1C1:R10C1)MsgBox Application.ConvertFormula(Formula:=inputFormula,_ fromReferenceStyle:=xlR1C1,toReferenceStyle:=xlA1)End Sub 运行上面的代码,将显示如图 2-5所示的结果。图 2-5 转
15、换结果提示信息 2.2.9 设置工作簿密码 如果希望保护工作簿的安全,那么可以使用 VBA 来设置打开工作簿的密码。使用 Wo 21人民邮电出版社Excel 公式与函数大辞典配套光盘附赠电子书Excel 2013 VBA 篇 rkbook 对象的 Password 属性可以完成这个工作。下面的代码将要求用户输入一个密码,然后关闭当前工作簿:Sub 设置工作簿密码()ActiveWorkbook.Password=InputBox(请您输入密码:,设置工作簿密码)ActiveWorkbook.Close End Sub 运行上面的代码时,将打开如图 2-6所示的对话框,输入密码并单击【确定】按钮
16、后,即可关闭当前工作簿。图 2-6 输入工作簿的密码 要删除工作簿的密码,可以使用下面的代码:ActiveWorkbook.Password=2.3 处理工作表本节将给出一些使用VBA处理Excel工作表的代码实例,包括工作表的一些基本操作,例如新建、复制、移动、重命名、排列、隐藏、保护和删除工作表以及判断工作表状态和拆分工作表等内容。2.3.1 新建工作表 要新建工作表,需要使用 Worksheets 集合的 Add 方法,Worksheets 集合它包含了每一个工作表对象(Worksheet)。使用下面的代码可以在当前工作簿中新建 5 个工作表:Sub 新建工作表()Worksheets.
17、Add Count:=5 End Sub Add 方法还有其他 3 个参数:Before、After 和 Type,各参数含义如下:?Before:在该参数中指定一个工作表对象,新建的工作表位于该工作表对象之前。?After:在该参数中指定一个工作表对象,新建的工作表位于该工作表对象之后。?Type:指定工作表的类型。该参数有 5 个取值,分别是:xlWorksheet(工作表,默认)、xlChart(图表)、xlDialogSheet(对话框工作表)、xlExcel4IntMacroSheet(国际宏工作表)、xlExcel4MacroSheet(宏工作表)。22人民邮电出版社Excel 公
18、式与函数大辞典配套光盘附赠电子书Excel 2013 VBA 篇 2.3.2 复制工作表 要复制工作表,可以使用 Worksheet 对象的 Copy 方法,该方法有 Before 和 After 两个参数,用于决定工作表复制到的位置。如果两个参数都不使用,那么将以要复制的工作表新建一个工作簿。下面的代码将工作簿中名为“第 3 章”的工作表复制到“第 2 章”之前,将工作表“第 2 章”复制到“第 1 章”之前:Sub 复制工作表()Worksheets(第 3 章).Copy before:=Worksheets(第 2 章)Worksheets(第 2 章).Copy before:=Wo
19、rksheets(第 1 章)End Sub 运行上面代码前后的效果如图 2-7所示。图 2-7 复制工作表前后的效果 2.3.3 移动工作表 要移动工作表,可以使用 Worksheet 的对象的 Move 方法,该方法有 Before 和 After 两个参数,用于决定工作表移动到的位置。下面的代码可以将工作表“第 3 章”移动到工作表“第 1 章”之前:23人民邮电出版社Excel 公式与函数大辞典配套光盘附赠电子书Excel 2013 VBA 篇 Sub 移动工作表()Worksheets(第 3 章).Copy before:=Worksheets(第 1 章)End Sub 如果要将
20、工作表移动到工作簿的最后,那么可以使用下面的代码:Sub 移动工作表()Worksheets(第 1 章).Copy before:=Worksheets(Worksheets.Count)End Sub 上面的代码通过将 Worksheets.Count 的值返回给 Worksheets 集合,以便得到最后一个工作表对象的引用。然后将指定的工作表复制到 Worksheets(Worksheets.Count)工作表之后。2.3.4 重命名工作表 可以使用 VBA 对工作表进行重命名操作,使用 InputBox 函数作为用户与程序的中转站。唯一需要注意的是,在代码中要能判断用户输入的内容是否与
21、已有名称重复。如果发生重名,那么需要强制用户输入新名称。代码如下:Sub 重命名工作表()Dim WSName As String Retry:Err.Clear WSName=InputBox(请输入工作表的新名称:,重命名工作表,ActiveSheet.Name)If WSName=Then Exit Sub On Error Resume Next ActiveSheet.Name=WSName If Err.Number 0 Then MsgBox Err.Number&Err.Description Err.Clear GoTo Retry End If On Error GoTo
22、0 End Sub 运行上面的代码后,将弹出一个对话框,在文本框中显示的是当前工作表的名称,如图 2-8所示,由此可见正在对工作表 Sheet1 进行重命名。24人民邮电出版社Excel 公式与函数大辞典配套光盘附赠电子书Excel 2013 VBA 篇 图 2-8 提示用户输入工作表的新名称 如果在文本框中输入一个与其他工作表重复的名称,例如输入 Sheet2。单击【确定】按钮后,将显示如图 2-9所示的错误信息。单击【确定】按钮,将返回输入名称对话框,如果不想继续输入名称,可以单击【取消】按钮。图 2-9 输入已有的名称将发生错误 2.3.5 排列工作表 最初创建的工作簿中只包含 3 张工
23、作表,但是在以后的使用中可能会在同一个工作簿中添加多个工作表。也许您曾经想过要按照字母顺序对同一个工作簿中的所有工作表进行排序,以便可以方便地找到某个工作表。如果手工调整工作表之间的顺序,无疑是一件费力不讨好的事。这时可以使用 VBA 来解决工作表的排序问题,代码如下:Sub 排序工作表()Dim OrderOk As Boolean Dim OrderWSNum As Long Dim WSNum As Long Dim i As Long WSNum=Worksheets.Count OrderWSNum=0 Do While(OrderWSNum 0 Then Worksheets(i+
24、1).Move before:=Worksheets(i)OrderOk=False End If Next i Loop End Sub 在上面的代码中,OrderWSNum 为工作簿中的已进行过排序的工作表数量,而 WSNum 为工作簿中工作表的总数。运行该段代码,将按字母顺序在顷刻间对当前工作簿中的所有工作表排序。在上面的代码中,使用了冒泡排序法,它的原理是比较相邻的两个数,将较小的那个数移动到前面。然后将那个较大的数再与下一个数进行比较,仍然将结果中较小的数移动到较大数的前面,再继续此类比较。直到数字序列中的最后一个数为止。数字最终的顺序就是从小到达的排列顺序。2.3.6 隐藏工作表
25、可以通过 VBA 代码隐藏不想显示的工作表,可以使用下面的代码:Sub 隐藏工作表()Dim i As Integer Worksheets(2).Visible=False i=MsgBox(第 2 个工作表已经被隐藏,vbOKCancel,提示信息)If i=2 Then Worksheets(2).Visible=True End Sub 运行上面的代码,将隐藏工作簿中的第 2 个工作表,并弹出一个对话框,如图 2-10所示。如果单击【取消】按钮,将取消隐藏操作。图 2-10 将第 2 个工作表隐藏 26人民邮电出版社Excel 公式与函数大辞典配套光盘附赠电子书Excel 2013 V
26、BA 篇 2.3.7 保护工作表 如果不希望用户随意更改工作表中的内容,那么可以使用 Worksheet 对象的 Protect 方法为工作表设置密码。例如,可以使用下面的代码为工作簿中的所有工作表设置密码“songxiang”,并在设置完成时显示确认信息:Sub 保护工作表()Dim WS As Worksheet For Each WS In Worksheets WS.Protect Password:=songxiang Next WS MsgBox 所有的工作表已加密完成!End Sub 如果需要解除密码,那么可以使用 UnProtect 方法,代码如下:Sub 解除密码()Dim
27、WS As Worksheet For Each WS In Worksheets WS.Unprotect Password:=songxiang Next WS MsgBox 所有的工作表已解密成功!End Sub 2.3.8 删除空白工作表 也许开始时您在一个工作簿创建了很多工作表,或者命令 Excel 在新建工作簿时自动创建指定数量的工作簿(在【Excel 选项】对话框的【常规】选项卡中设置)。但是后来发现有很多工作表是多余的,对于这些空白的工作表当然要删除掉。但是要删除数量众多的工作表,也许花费一点时间。那么我们可以把这项重复劳动交给 VBA,让它忙去吧!要删除空白工作表,就需要先判
28、断工作表中的数据是否为空,然后才能执行删除操作。这需要使用 COUNTA 函数来完成判断工作,并且使用 WorksheetFunction 来引用 COUNTA函数。代码如下:Sub 删除空白工作表()Dim WS As Worksheet For Each WS In Worksheets If Application.WorksheetFunction.CountA(WS.Cells)=0 Then Application.DisplayAlerts=False WS.Delete Application.DisplayAlerts=True 27人民邮电出版社Excel 公式与函数大辞典
29、配套光盘附赠电子书Excel 2013 VBA 篇 End If Next WS End Sub 运行上面的代码后,Excel 将遍历工作簿中的所有工作表,当找到空白工作表时,会自动将其删除。添加 Application.DisplayAlerts=False 是为了在删除工作表时不会出现提示信息,在删除工作表后,再恢复 Application.DisplayAlerts 为 True,以便在执行某些操作时会显示默认的提示信息。2.3.9 拆分工作表 在 Excel 工作表中,如果单击除 A 列或第一行以外的任意单元格,然后单击功能区中的【视图】?【窗口】?【拆分】按钮,即可将工作表拆分为 4
30、 个窗格。如果希望使用 VBA 代码来自动完成这个工作,那么可以使用 SplitRow 和 SplitColumn 属性。SplitRow 属性将指定窗口拆分为窗口处的行号,而 SplitColumn 属性则指定将窗口拆分为窗格处的列号。代码如下:Sub 拆分工作表()Dim SRow As Long Dim SCol As Long SRow=Range(B5).Row SCol=Range(B5).Column ActiveWindow.SplitRow=SRow ActiveWindow.SplitColumn=SCol End Sub 运行上面的代码,Excel 将从单元格 B5 处将
31、工作表拆分为 4 个窗格,如图 2-11所示。图 2-11 使用 VBA 代码自动将工作表拆分为 4 个窗格 28人民邮电出版社Excel 公式与函数大辞典配套光盘附赠电子书Excel 2013 VBA 篇 2.4 使用区域本节将给出关于区域操作的一些 VBA 代码实例。包括对单元格、行和列的选择,遍历整个区域,复制、移动、合并区域的操作以及设置区域格式等内容。2.4.1 选定单元格区域 在 Excel 中对单元格或单元格区域进行各种操作之前,都需要先选择要操作的区域。但是在 VBA 中无须在操作前选中单元格或单元格区域。例如,要在单元格 B2 中输入“200”,在 Excel 中操作时,需要
32、先单击单元格 B2,然后输入 200。而在 VBA 中,可以使用下面的代码:Sub 输入单元格内容()Dim Rng As Range Set Rng=ActiveSheet.Range(B2)Rng.Value=200 End Sub 2.4.2 选择一行或一列 在 Excel 中要选择一行或一列,需要单击工作表中的行号或列字母。而在 Excel VBA中选择一行或一列,则使用 Range 对象的 EntireRow 和 EntireColumn 属性。下面的代码用于选择当前活动单元格所在的整行:Sub 选择一行()ActiveCell.EntireRow.Select End Sub 而下
33、面的代码则用于选择当前活动单元格所在的整列:Sub 选择一列()ActiveCell.EntireColumn.Select End Sub 2.4.3 选择至行或列的结尾 在 Excel 中,可以单击某个数据区域中的任意一个单元格,然后按【Ctrl+Shift+下方向】键来选择从活动单元格到连续数据最底端的整个区域;而按【Ctrl+Shift+右方向】键可以选择从活动单元格到连续数据最右端的整个区域。例如下面的两段代码:Sub 选择整列的连续数据区域()Range(ActiveCell,ActiveCell.End(xlDown).Select End Sub 29人民邮电出版社Excel
34、公式与函数大辞典配套光盘附赠电子书Excel 2013 VBA 篇 Sub 选择整行的连续数据区域()Range(ActiveCell,ActiveCell.End(xltoRight).Select End Sub 如图 2-12所示为一个数据区域,单击区域中的单元格 B3,使其成为活动单元格。图 2-12 使单元格 B3 成为活动单元格 然后运行上面两段代码,会分别选择从活动单元格到当前列数据的底端和当前行数据的右端,如图 2-13所示。图 2-13 从活动单元格选择到数据区域末尾 2.4.4 确定选中对象的类型 使用 TypeName 函数,可以检测当前选择对象的类型,代码如下:Sub
35、确定选中对象的类型()MsgBox 您选择了一个&TypeName(Selection)End Sub 例如,当单击工作表中的一个单元格后,运行上面的代码,将弹出如图 2-14所示的对话框,并告知您选择的对象类型。30人民邮电出版社Excel 公式与函数大辞典配套光盘附赠电子书Excel 2013 VBA 篇 图 2-14 确定选择对象的类型 2.4.5 有效遍历选择区域 如果需要对一个选中区域中的每个单元格进行各种操作,那么就需要遍历选中区域中的每个单元格。这又要用到 For Each 语句。例如,下面的代码可以在单元格区域 A1:D4中检查单元格的值,如果单元格为负值,那么将该单元格的填充
36、色设置为红色:Sub 有效遍历选择区域()Dim Cell As Range For Each Cell In ActiveSheet.Range(A1:D4)If Cell.Value 0 Then Cell.Interior.ColorIndex=3 Next Cell End Sub 运行上面的代码,将得到如图 2-15所示的结果。图 2-15 将包含负值的单元格填充为红色 2.4.6 复制单元格区域 在2.4.1节中曾经介绍过在Excel VBA中对单元格操作时不用先选择单元格。但是如果使用宏录制器进行操作时,例如,在复制单元格时,宏录制器会对单元格执行选择操作,然后再执行复制和粘贴操
37、作。请看下面的代码:Sub 复制单元格()Range(A1:B4).Select Selection.Copy 31人民邮电出版社Excel 公式与函数大辞典配套光盘附赠电子书Excel 2013 VBA 篇 Range(A6).Select ActiveSheet.Paste Application.CutCopyMode=False End Sub 如果在 Excel VBA 中要实现上面代码的功能,那么将变得很简单,代码如下:Sub 复制单元格()Range(A1:B4).Copy Range(A6)End Sub 2.4.7 复制动态区域 前面介绍的区域复制操作,都是基于固定区域进行的
38、。但是实际工作中可能会由于输入新的数据而改变区域范围。这时可以使用 CurrentRegion 属性,来返回单元格所处的连续数据区域。所谓连续的数据区域,即是四周由空行空列间隔出来的一个数据区域。下面的代码复制包含单元格 A1 在内的连续数据区域,并将该区域粘贴到 Sheet2 工作表中以单元格 A1 为左上角的区域中:Sub 复制动态区域()Worksheets(Sheet1).Range(A1).CurrentRegion.Copy Worksheets(Sheet2).Range(A1)End Sub 2.4.8 移动区域 移动区域与复制区域是类似的。如果使用宏录制器录制移动区域的操作,
39、将得到下面的代码:Sub 移动区域()Range(A1:B4).Select Selection.Cut Range(A6).Select ActiveSheet.Paste End Sub 如果在 Excel VBA 中要实现上面代码的功能,那么将变得很简单,代码如下:Sub 移动区域()Range(A1:B4).Cut Range(A6)End Sub 2.4.9 合并单元格区域 可以使用 Range 对象的 Merge 方法合并指定区域的单元格,下面的代码将合并工作表 32人民邮电出版社Excel 公式与函数大辞典配套光盘附赠电子书Excel 2013 VBA 篇 Sheet1 中的单元
40、格区域 A1:D4:Sub 合并单元格区域()Worksheets(Sheet1).Range(A1:D4).Merge End Sub 运行上面的代码,将得到如图 2-16所示的结果。图 2-16 合并单元格区域 A1:D4 如果要进行跨越合并(相当于单击功能区中的【开始】?【对齐方式】?【合并后居中】按钮并选择【跨越合并】命令),那么可以使用下面的代码:Sub 合并单元格区域()Worksheets(Sheet1).Range(A1:D4).Merge True End Sub 运行上面的代码,将得到如图 2-17所示的结果。图 2-17 跨越合并单元格区域 A1:D4 2.4.10 锁定
41、单元格区域 如果不想让用户在指定的单元格区域内进行编辑操作,那么可以对该区域锁定,用户只能在锁定区域外编辑内容,代码如下:Sub 锁定单元格区域()Dim WS As Worksheet Set WS=Worksheets(sheet1)WS.Unprotect Cells.Locked=True WS.Range(A1:D4).Locked=False WS.Protect End Sub 运行上面的代码,Excel 将锁定除单元格区域 A1:D4 以外的其他单元格。换句话说,只能在单元格区域 A1:D4 中进行编辑操作。33人民邮电出版社Excel 公式与函数大辞典配套光盘附赠电子书Exc
42、el 2013 VBA 篇 2.4.11 设置列宽 如果要设置工作表中的列的宽度,可以使用 Range 对象的 ColumnWidth 属性。例如,下面的代码将使 AD 列的列宽增大 3 倍,即原列宽的 4 倍:Sub 设置列宽()Dim Rng As Range Set Rng=ActiveSheet.Columns(A:D)Rng.ColumnWidth=Rng.ColumnWidth*4 End Sub 2.4.12 设置单元格格式 在 Excel 中通过【设置单元格格式】对话框可以设置单元格的数字格式。在 Excel VBA 中需要使用 NumberFormat 属性进行设置。例如,在
43、下面的代码中,将当前工作表中的单元格区域 A1:D4 设置为对数值缩小 1000 倍后四舍五入去掉小数点的格式:Sub 设置单元格格式()Range(A1:D4).NumberFormat=#,#,End Sub 对 NumberFormat 属性进行的赋值与第 2 章介绍的自定义格式代码是相同的。2.4.13 定义条件格式 在 Excel VBA 中,用于设置条件格式的是 FormatCondition 对象,而 FormatConditions集合则表示多个条件格式的组合。例如,下面的代码将单元格区域 A1:D4 中的值与单元格F1 进行比较,将大于单元格 F1 的值所在的单元格设置为斜体
44、加下划线的形式,并设置单元格填充色为绿色:Sub 设置条件格式()With Worksheets(sheet1).Range(A1:D4).FormatConditions.Add(xlCellValue,xlGreater,=$F$1)With.Font .Italic=True .Underline=True End With With.Interior .ColorIndex=4 End With End With End Sub 34人民邮电出版社Excel 公式与函数大辞典配套光盘附赠电子书Excel 2013 VBA 篇 运行上面的代码将得到如图 2-18所示的结果。图 2-18
45、利用 VBA 自动设置条件格式 FormatCondition 对象的 Add 方法用于设置条件,Add 方法有 4 个参数:?Type:指定条件格式是基于单元格值还是基于表达式。Type 参数的取值见表 2-1。?Operator:条件格式运算符。Operator 参数的取值见表 2-2。?Formula1:与条件格式相关联的值或表达式。可为常量值、字符串值、单元格引用或公式。?Formula2:当 Operator 为 xlBetween 或 xlNotBetween 时,它是与条件格式第二部分相关联的值或表达式(否则忽略该参数)。可为常量值、字符串值、单元格引用或公式。表 2-1 Typ
46、e 参数列表 名称 取值 说明 xlAboveAverageCondition 12 高于平均值条件 xlBlanksCondition 10 空值条件 xlCellValue 1 单元格值 xlColorScale 3 色阶 xlCompareColumns 18 比较列 xlDatabar 4 数据条 xlErrorsCondition 16 错误条件 xlExpression 2 表达式 XlIconSet 6 图标集 xlNoBlanksCondition 13 无空值条件 xlNoErrorsCondition 17 无错误条件 xlTextString 9 文本字符串 xlTimePeriod 11 时间段 xlTop10 5 前 10 个值 xlUniqueValues 8 唯一值 表 2-2 Operator 参数列表 名称 说明 xlBetween 介于 xlEqual 等于 xlGreater 大于 xlGreaterEqual 大于等于 35人民邮电出版社Excel 公式与函数大辞典配套光盘附赠电子书Excel 2013 VBA 篇 xlLess 小于 xlLessEqual 小于等于 xlNotBetween 不介于 xlNotEqual 不等于 36