有这样一个表格,想达到图2那种样子。

原表

想实现的效果

三种方法:1是直接选中,然后点击“合并后居中”按钮;2是录制一段宏,然后挨个运行;3是编写一段VBA代码实现。

数据量一大,还是第三种方法省时省力。好了开始。

点击“开发工具”里的“Visual Basic"按钮

插入一个模块

然后敲入下面的代码

Sub 合并单元格() Application.DisplayAlerts = False '关闭系统提醒 For i = 16 To 2 Step -1 If Cells(i, 1) = Cells(i - 1, 1) Then Range(Cells(i - 1, 1), Cells(i, 1)).Merge Next i Application.DisplayAlerts = True '记得在程序结尾打开系统提醒 End Sub

然后,关闭编辑器,点击开发工具里的”宏“。

选择列表里的”合并单元格“,点击右边的”执行“

是不是变成我们想要的效果了?

知识点:range(),表示单元格区域。可以是一片,也可以是一个。如:

range("A1") ‘表示单元格A1

range("A1:B10") ’表示区域A1:B10

range("A1:A3","C1:C3") '表示A1:C3

range("A5:E5 B1:B12") '表示A5:E5和B1:B12的交叉部分单元格

cells(),表示一个单元格。 就一个单元格。如:

cells(8,2) cells(8,"B") cells(2)

那么问题又来了,假如现在行数增加了,需要合并的也不一定是第一列?如何让程序有通用性?

设置一些变量,来代替经常改变的系数,如行,列。改变后如下:

Sub 合并单元格() Application.DisplayAlerts = False lie = "A" '设置第几列需要合并单元格,填写列号或列的子母 r = Cells(65535, lie).End(3).Row For i = r To 2 Step -1 If Cells(i, lie) = Cells(i - 1, lie) Then Range(Cells(i - 1, lie), Cells(i, lie)).Merge Next i Application.DisplayAlerts = True End Sub

好了,这样的话,如果实际数据改了,我们只需改变一下斜体部分就可以合并单元格了。