
VBA实践+查找所有合并单元格并记录其地址
合并单元格是两个以上单元格的合并,但在excel程序内部还是被当成多个单个的单元格的。合并单元格只有左上角的单元格包含数据,其他为空。一般,合并单元格的存在会给数据处理带来麻烦。要处理合并单元格,首先要找到合并单元格。
在excel中,合并单元格是一种格式,可以通过“查找替换”对话框进行查找,如下图所示。Ctrl+H调出“查找和替换”对话框,“查找内容”处单击格式,单击“对齐”选项卡,勾选“合并单元格”,确定后,单击“查找全部”,即可查找到当前工作表中所有的合并单元格。

下图的示例中,共找到了三处合并单元格,并列出每个合并单元格的地址和值。可以单击这个清单中的条目,跳转到相应的合并单元格,以便进行手动处理。
也可以在“替换为”设置替换内容或替换格式,单击“全部替换”,批量对这些合并单元格进行处理。

可以通过一段简单的VBA代码实现上述过程。自定义VBA代码可以实现“查找和替换”不能实现的复杂操作,如往合并单元格中添加内容、进行运算、添加删除行或列等。
Excel的find方法与word中的find方法不同,word的可以检测到文档的结尾,设置是否继续从头查找或者停止查找,而excel的没有相应的设置,会不断的重复查找,所以需要额外设置停止查找的条件,如查找到的单元格的地址与第一次查找到的单元格相同则停止查找。
Excel的find方法似乎不能继承上次的设置,第二次使用时,即使参数相同,最好还是编写完整,否则可能发生错误。
为了能查找到下一处,find.after属性应该设置上次查找到的单元格。
Sub 查找所有合并单元格并记录地址()
Dim firstStr As String, alladd As String, cell1 As Range, i&
i = 0
Application.FindFormat.Clear '清除原有查找格式
Application.FindFormat.MergeCells = True '查找格式设置为合并单元格格式
With ActiveSheet.UsedRange '对已经使用区域查找
Set cell1 = .Find(What:="", LookIn:=xlFormulas, LookAt:=xlPart, SearchFormat:=True) '设置查找参数,并尝试查找一个合并单元格
If cell1 Is Nothing Then
MsgBox "区域内无合并单元格"
Exit Sub '如果找不到则退出
Else
firstStr = cell1.Address '取第一个找到的单元格的地址
Do
Set cell1 = .Find(What:="", After:=cell1, LookIn:=xlFormulas, LookAt:=xlPart, SearchFormat:=True) '查找下一个,虽然前面已设置过,但此处查找参数仍然需要填写完整,否则查找出错
alladd = alladd & Chr(13) & Chr(10) & cell1.Address
i = i + 1
Loop While firstStr <> cell1.Address '直到找到的单元格的地址等于第一个单元格地址时停止
End If
End With
MsgBox "共有" & i & "个合并单元格,地址分别为" & Chr(13) & Chr(10) & alladd
End Sub