第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。