合并单元格时保留每个单元格内容
Excel 的【合并后居中】功能仅保留被合并单元格区域左上角单元格的内容。如果需要全部保留每个单元格的内容,则可以使用如下 VBA 代码。
Sub MergeContent()
Dim strContent As String
Dim rng As Range
' 判断当前选择对象是否为Range对象
If TypeName(Selection) = "Range" Then
' 遍历每个单元格,将内容连接起来
For Each rng In Selection
strContent = strContent & rng.Value
Next rng
' 禁止显示提示和警告消息
Application.DisplayAlerts = False
' 合并选择的单元格区域
Selection.Merge
' 设置合并单元格的内容
Selection.Value = strContent
' 恢复显示提示和警告消息
Application.DisplayAlerts = True
End If
Set rngCell = Nothing
End Sub
运行效果如下:
取消合并时在每个单元格中保留内容
Excel 取消合并的单元格后,仅左上角单元格保留合并前的内容,如果需要取消合并时在每个单元格中保留内容,可以使用以下 VBA 代码。
Sub UnMergeValues()
Dim strText As String
Dim i As Long, intCount As Integer
For i = 2 To Range("B1").End(xlDown).Row
With Cells(i, 1)
' 取得A列每个单元格区域的内容
strText = .Value
' 取得合并区域的单元格数量
intCount = .MergeArea.Count
' 取消合并单元格
.UnMerge
' 将原合并单元格的内容赋值给取消合并后的单元格区域
.Resize(intCount, 1).Value = strText
End With
' 下一次循环从上一个合并区域的下一个单元格开始
i = i + intCount - 1
Next i
End Sub
运行效果如下所示:
合并内容相同的单列连续单元格
如果需要合并同一列内容相同的连续单元格,可以使用以下示例:
Sub MergeSameCells()
Dim intRow As Integer, i As Long
' 禁止显示提示和警告消息
Application.DisplayAlerts = False
With ActiveSheet
intRow = .Range("A1").End(xlDown).Row
' 注意,从最后一行数据开始循环
For i = intRow To 2 Step -1
' 判读当前单元格值是否与上面单元格相等
If .Cells(i, 1).Value = .Cells(i - 1, 1).Value Then
' 将当前当前单元格和上面单元格合并
.Range(.Cells(i - 1, 1), .Cells(i, 1)).Merge
End If
Next i
End With
' 恢复显示提示和警告消息
Application.DisplayAlerts = True
End Sub
注意
为什么此示例要从最后一行数据开始向上合并?这是因为 Excel 合并单元格后只保留区域左上角的值,从下向上合并才能保证所有相同内容的连续单元格都能合并。
运行效果如下所示: