- Excel VBA范例大全
- 罗刚君编著
- 4720字
- 2020-08-26 20:14:32
第10章 合并单元格相关操作
在处理表格标题时,为了美观,一般都将上标题或者左侧标题合并居中。当需要合并或者取消合并的单元格较多时,手工操作无疑事倍功半。本章通过12个实例讲解单元格合并、取消合并及对具有合并属性区域进行相关操作的技巧。
● 实例73全选合并单元格
● 实例74将所有合并单元格加上背景
● 实例75取消所有合并单元格之合并属性
● 实例76取得合并单元格的首个和末尾地址
● 实例77合并数据并居中
● 实例78合并数据并粘贴
● 实例79批量合并单元格
● 实例80指定列取消合并同时恢复数据
● 实例81取得合并单元格数目
● 实例82报告合并单元格地址
● 实例83对所有合并单元格添加批注并标示序数
● 实例84将已用区域合并取消且填充空白单元格
实例73 全选合并单元格
【技巧说明】 全选合并单元格。
【案例实现】 参见以下步骤:
【案例介绍】 如图2.81所示。邮编列表中有4个合并单元格,现需将之全部选中。
[1] 使用快捷键Alt+F11进入VBE(Visual Basic Editor)环境。
[2] 单击菜单【插入】\【模块】,打开模块代码窗口。
[3] 在右边代码窗口输入以下代码:
Sub全选合并单元格() Dim arr(), rng As Range, i As Byte, indexx As String, n As String For Each rng In ActiveSheet.UsedRange If rng.MergeCells Then '如果具有合并属性 If Split(rng.MergeArea.Address, ":")(0) <> indexx Then '如果地址为合并单元格中第一个单元格地址 ReDim Preserve arr(i) '重定义数组 arr(i)=rng.Address '对数组赋值 i=i+1 '循环/重复 indexx=rng.Address End If End If Next n=Join(arr, ",") Range(n).Select '选择合并单元格 End Sub
[4] 关闭VBE窗口返回到工作表。
[5] 利用快捷键Alt+F8调出运行宏窗口,然后单击“执行”按钮,可以看到所有具有合并属性的单元格已被选中,如图2.82所示。
图2.81 邮编列表
图2.82 已选中合并单元格
提示
本实例参见光盘样本:..\第2部分\实例73.xlsm。
【相关知识说明】
(1)MergeCells:如果区域包含合并单元格,则为True。Variant型,可读写。本例用于检测单元格是否合并。
(2)Split:返回一个下标从零开始的一维数组,它包含指定数目的子字符串。语法为:
Split(expression[, delimiter[, limit[, compare]]])
(3)Join:返回一个字符串,该字符串是通过连接某个数组中的多个子字符串而创建的。语法为:
Join(sourcearray[, delimiter])
实例74 将所有合并单元格加上背景
【技巧说明】 将所有合并单元格加上颜色背景。
【案例介绍】 以实例73数据为例,将合并单元格标示为黄色。
【案例实现】 参见以下步骤:
[1] 使用快捷键Alt+F11进入VBE(Visual Basic Editor)环境。
[2] 单击菜单【插入】\【模块】,打开模块代码窗口。
[3] 在右边代码窗口输入以下代码:
Sub将所有合并单元格添加红色背景() Dim rng As Range For Each rng In ActiveSheet.UsedRange If rng.MergeCells Then If rng.Address=Split(rng.MergeArea.Address, ":")(0) Then rng. Interior.Color=65535 End If Next End Sub
[4] 关闭VBE窗口返回到工作表。
[5] 利用快捷键Alt+F8调出运行宏窗口,然后单击“执行”按钮,可以看到所有具有合并属性的单元格已被添加上黄色背景,如图2.83所示。
图2.83 给合并单元格添加背景
提示
本实例参见光盘样本:..\第2部分\实例74.xlsm。
实例75 取消所有合并单元格之合并属性
【技巧说明】 取消所有合并单元格之合并属性。
【案例介绍】 以实例73数据为例,将合并单元格取消合并。
【案例实现】 参见以下步骤:
[1] 使用快捷键Alt+F11进入VBE(Visual Basic Editor)环境。
[2] 单击菜单【插入】\【模块】,打开模块代码窗口。
[3] 在右边代码窗口输入以下代码:
Sub取消合并() ActiveSheet.UsedRange.MergeCells=False End Sub
[4] 关闭VBE窗口返回到工作表。
[5] 利用快捷键Alt+F8调出运行宏窗口,然后单击“执行”按钮,可以看到所有具有合并属性的单元格已被取消合并,如图2.84所示。
图2.84 已取消合并单元格
提示
本实例参见光盘样本:..\第2部分\实例75.xlsm。
【相关知识说明】
MergeCells=False:取消合并。
实例76 取得合并单元格的首个和末尾地址
【技巧说明】 取得合并单元格的首个和末尾地址。
【案例介绍】 以实例73数据为例,取得单元格A1所在合并区域的首个和末端单元格地址。
【案例实现】 参见以下步骤:
[1] 使用快捷键Alt+F11进入VBE(Visual Basic Editor)环境。
[2] 单击菜单【插入】\【模块】,打开模块代码窗口。
[3] 在右边代码窗口输入以下代码:
Sub取得合并单元格的首个和末尾地址() MsgBox "单元格A1所在合并区域中" & Chr(10) & _ "第一个单元格为:" & Split(Range("a1").MergeArea.Address, ":")(0) & Chr(10) _ & "最末端单元格为:" & Split(Range("a1").MergeArea.Address, ":")(1), 64, "提示" End Sub
[4] 关闭VBE窗口返回到工作表。
[5] 选中A1,利用快捷键Alt+F8调出运行宏窗口,然后单击“执行”按钮,程序将弹出提示框,显示合并单元格地址,如图2.85所示。
图2.85 显示合并单元格地址
提示
本实例参见光盘样本:..\第2部分\实例76.xlsm。
【相关知识说明】
MergeArea.Address:多个单元格合并后的区域。本例中A1∶A3三个单元格合并后的合并区域即为A1∶A3。
实例77 合并数据并居中
【技巧说明】 多单元格数据合并并将数据居中显示。
【案例介绍】 Excel 2007本身的“合并居中”只能留下区域左上角数据,本例合并单元格时将数据也同时合并。如图2.86所示,A2:C2存放日期,现在对它们做合并处理。
【案例实现】 参见以下步骤:
[1] 使用快捷键Alt+F11进入VBE(Visual Basic Editor)环境。
[2] 单击菜单【插入】\【模块】,打开模块代码窗口。
[3] 在右边代码窗口输入以下代码:
Sub合并居中() Dim i%, counts%, sTem$ Application.ScreenUpdating=False Application.DisplayAlerts=False Rng_count=Selection.Count For i=1 To Rng_count sTem=sTem & Selection.Cells(i) Next With Selection .MergeCells=True .HorizontalAlignment=xlCenter .VerticalAlignment=xlCenter .NumberFormatLocal="@" .Value=sTem End With Application.DisplayAlerts=True Application.ScreenUpdating=True End Sub
[4] 关闭VBE窗口返回到工作表。
[5] 选中有数据的单元格A2∶C2,利用快捷键Alt+F8调出运行宏窗口,然后单击“执行”按钮,则单元格及数据均被合并,如图2.87所示。
图2.86 合并日期前的财务表
图2.87 合并后的日期
提示
本实例参见光盘样本:..\第2部分\实例77.xlsm。
【相关知识说明】
(1)HorizontalAlignment:代表指定对象的水平对齐方式。
(2)VerticalAlignment:代表指定对象的垂直对齐方式。
实例78 合并数据并粘贴
【技巧说明】 合并数据并粘贴。
【案例介绍】 Excel 2007在粘贴单元格数据时是将复制区域的所有信息都粘贴过来,包括单元格个数。若复制区域有三个单元格,则粘贴后的目标区域也将有三个单元格,这有时无法满足用户需求。本例中将多单元格数据粘贴到单个单元格中,待合并的数据如图2.88所示。
【案例实现】 参见以下步骤:
[1] 使用快捷键Alt+F11进入VBE(Visual Basic Editor)环境。
[2] 单击菜单【插入】\【模块】,打开模块代码窗口。
图2.88 待合并的数据
[3] 在右边代码窗口输入以下代码:
Sub合并后粘贴() Dim temp As String, TD As New DataObject, rng As Range On Error GoTo err For Each rng In Selection temp=temp & rng.Value '合并区域中的数据 Next rng TD.SetText temp '将合并的文本复制到DataObject TD.PutInClipboard '将DataObject中的文本移到剪贴板上 End err: MsgBox "对不起,您选择的不是单元格!", 64, "提示" End Sub
[4] 关闭VBE窗口返回到工作表。
[5] 单击【工具】\【引用】菜单,打开“引用”对话框,将里面的Miscrosoft Forms 2.0 Object Library控件打上钩,如图2.89所示。
[6] 选中有数据的单元格A1∶C3,利用快捷键Alt+F8调出运行宏窗口,然后单击“执行”按钮。
[7] 选中单元格A4,单击鼠标右键,从弹出的快捷菜单中选择“粘贴”菜单,结果如图2.90所示。
图2.89 “引用”控件对话框
图2.90 合并并粘贴后的数据
提示
本实例参见光盘样本:..\第2部分\实例78.xlsm。
【相关知识说明】
(1)SetText:用特定的格式复制文本串到DataObject。
(2)PutInClipboard:将数据从DataObject移到剪贴板上。
实例79 批量合并单元格
【技巧说明】 批量合并单元格。
【案例介绍】 如图2.91所示的数据,A列有很多相同的数据,显示不太简洁。现需要将相同内容的单元格合并居中。
【案例实现】 参见以下步骤:
[1] 使用快捷键Alt+F11进入VBE(Visual Basic Editor)环境。
[2] 单击菜单【插入】\【模块】,打开模块代码窗口。
[3] 在右边代码窗口输入以下代码:
Sub批量合并单元格() Application.DisplayAlerts=False '禁止提示 For i=3 To Range("b65536").End(xlUp).Row Step 3'为变量i赋值,步长为3 Range(Cells(i, 1), Cells(i+2, 1)).Merge '合并 Range(Cells(i, 1), Cells(i+2, 1)).HorizontalAlignment=xlCenter '居中 Next Application.DisplayAlerts=True End Sub
[4] 关闭VBE窗口返回到工作表;
[5] 利用快捷键Alt+F8调出运行宏窗口,然后单击“执行”按钮,发现A列相同姓名已合并,如图2.92所示。
图2.91 成绩表
图2.92 合并姓名后的成绩表
提示
本实例参见光盘样本:..\第2部分\实例79.xlsm。
实例80 指定列取消合并同时恢复数据
【技巧说明】 将合并后的单元格取消合并,同时给空白单元格填充数据。
【案例介绍】 以实例79中合并后的数据为例,将之恢复至合并前的状态(本例代码仅适合单元格纵向合并之状况)。
【案例实现】 参见以下步骤:
[1] 使用快捷键Alt+F11进入VBE(Visual Basic Editor)环境。
[2] 单击菜单【插入】\【模块】,打开模块代码窗口。
[3] 在右边代码窗口输入以下代码:
Sub取消合并() On Error GoTo err '出错时运行“err”标签处的语句 With Range(Cells(2, 1), Cells(Range("b65536").End(xlUp).Row, 1)) .UnMerge '将A列数据取消合并 .SpecialCells(xlCellTypeBlanks).Select '选择空白单元格 Selection.FormulaR1C1="=R[-1]C" '输入公式 .Value=.Value '将公式转为值 End With [a1].Select: Exit Sub '退出程序,不运行下面的语句 err: MsgBox "区域中没有合并单元格!", 64, "提示" End Sub
[4] 关闭VBE窗口返回到工作表。
[5] 利用快捷键Alt+F8调出运行宏窗口,然后单击“执行”按钮,A列合并单元格全部取消合并,同时填充单元格数据。
提示
本实例参见光盘样本:..\第2部分\实例80.xlsm。
【相关知识说明】
(1): Exit Sub:语句前加冒号可以将两行代码合并为一行。执行时等同于两行。
(2)本例中取消合并时借用了公式,这使得程序运行速度相对慢一些。可以利用填充功能来恢复数据,效率将大大提高。代码如下:
Sub取消合并方法二() For i=3 To Range("b65536").End(xlUp).Row Step 3 Range(Cells(i, 1), Cells(i+2, 1)).UnMerge Range(Cells(i, 1), Cells(i+2, 1)).FillDown Next End Sub
实例81 取得合并单元格数目
【技巧说明】 取得合并单元格数目。
【案例介绍】 以实例79中合并后的数据为例,统计其合并单元格数目。
【案例实现】 参见以下步骤:
[1] 使用快捷键Alt+F11进入VBE(Visual Basic Editor)环境。
[2] 单击菜单【插入】\【模块】,打开模块代码窗口。
[3] 在右边代码窗口输入以下代码:
Sub取得合并单元格数目() Dim rng As Range, i As Byte Application.DisplayAlerts=False For Each rng In ActiveSheet.UsedRange '遍历本表已用区域 If rng.MergeCells Then '如果单元格已合并 If rng.Address=Split(rng.MergeArea.Address, ":")(0) Then i=i+1 '如果单元格是合并区域中第一个单元格,则累加计数器 End If Next MsgBox "本表共有" & i & "个合并单元格!", 64, "单元格记数" End Sub
[4] 关闭VBE窗口返回到工作表;
[5] 利用快捷键Alt+F8调出运行宏窗口,然后单击“执行”按钮,将弹出对话框显示合并单元格的数目,如图2.93所示。
图2.93 合并单元格记数
提示
1.本实例参见光盘样本:..\第2部分\实例81.xlsm。
2.本例中一个合并区域算一个,即A1∶A3合并算1个合并单元格而非3个。
实例82 报告合并单元格地址
【技巧说明】 报告合并单元格地址(合并区域左上角单元格地址)。
【案例介绍】 以实例79中合并后的数据为例,返回其地址。
【案例实现】 参见以下步骤:
[1] 使用快捷键Alt+F11进入VBE(Visual Basic Editor)环境。
[2] 单击菜单【插入】\【模块】,打开模块代码窗口。
[3] 在右边代码窗口输入以下代码:
Sub合并单元格地址() Dim rng As Range, rg As Range, i As Byte For Each rng In ActiveSheet.UsedRange If rng.MergeCells Then If rng.Address=Split(rng.MergeArea.Address, ":")(0) Then If rg Is Nothing Then Set rg=rng Else Set rg=Application.Union(rg, rng) End If i=i+1 End If End If Next MsgBox "合并单元格地址为:" & Chr(10) & rg.Address _ & Chr(10) & "共有合并单元格" & i & "个!", 64, "提示" End Sub
[3] 关闭VBE窗口返回到工作表。
[5] 利用快捷键Alt+F8调出运行宏窗口,然后单击“执行”按钮,将弹出对话框显示合并单元格地址和数目,如图2.94所示。
图2.94 合并单元格地址
提示
本实例参见光盘样本:..\第2部分\实例82.xlsm。
实例83 对所有合并单元格添加批注并标示序数
【技巧说明】 对所有合并单元格添加批注并标示序数。
【案例介绍】 以实例79中合并后的数据为例,对合并单元格添加批注,批注内容为序号。
【案例实现】 参见以下步骤:
[1] 使用快捷键Alt+F11进入VBE(Visual Basic Editor)环境。
[2] 单击菜单【插入】\【模块】,打开模块代码窗口。
[3] 在右边代码窗口输入以下代码:
Sub对所有合并单元格添加批注并标示序数() Dim rng As Range, i As Byte Application.DisplayAlerts=False For Each rng In ActiveSheet.UsedRange If rng.MergeCells Then If rng.Address=Split(rng.MergeArea.Address, ":")(0) Then rng.AddComment ("第" & i+1 & "个合并单元格!") rng.Comment.Shape.TextFrame.AutoSize=True rng.Comment.Visible=False i=i+1 End If End If Next End Sub
[4] 关闭VBE窗口返回到工作表。
[5] 利用快捷键Alt+F8调出运行宏窗口,然后单击“执行”按钮,为合并单元格添加批注并显示序号,如图2.95所示。
图2.95 显示合并单元格序号
提示
本实例参见光盘样本:..\第2部分\实例83.xlsm。
实例84 将已用区域合并取消且填充空白单元格
【技巧说明】 将已用区域合并取消并让空白单元格等于原合并值。
【案例介绍】 本例作用和实例80一样,将合并单元格取消合并,并使取消后的单元格都显示合并状态下的数据。但实例80只能针对某列数据,且只能是纵向全合并才行。比例程序可以适用于任何状况的合并方式。
【案例实现】 参见以下步骤:
[1] 使用快捷键Alt+F11进入VBE(Visual Basic Editor)环境。
[2] 单击菜单【插入】\【模块】,打开模块代码窗口。
[3] 在右边代码窗口输入以下代码:
Sub将已用区域合并取消并让空白单元格等于原合并值() Dim rng As Range, val, cell As String For Each rng In ActiveSheet.UsedRange If rng.MergeCells Then cell=rng.MergeArea.Address val=rng.Value rng.UnMerge Range(cell).Value=val End If Next End Sub
[4] 关闭VBE窗口返回到工作表。
[5] 利用快捷键Alt+F8调出运行宏窗口,然后单击“执行”按钮,则所有合并单元格都取消合并,并且将单元格填充合并前的数据。
图2.96 取消单元格合并并恢复数据
提示
本实例参见光盘样本:..\第2部分\实例84.xlsm。