Excel·VBA单元格合并、撤销合并

76 篇文章 27 订阅

1,合并选中单元格区域,并保留所有内容

Sub 合并选中单元格区域并保留所有数据()
    '合并选中单元格,单个单元格、单行、单列、多行多列都适用,可指定分隔符
    Dim rng As Range, result As String
    delimiter = ","      '分隔符
    For Each rng In Selection  '从上到下、从左到右顺序
       result = result & delimiter & rng.Value
    Next rng
    result = Right(result, Len(result) - Len(delimiter))  '返回结果,同时去除开头的分隔符
    With Selection
        .Value = Empty   '内容清空
        .Merge  '合并单元格
        .Value = result  '内容赋值
        .WrapText = True  '是否自动换行
    End With
End Sub

举例

A、B列选中运行代码后得到D、E列效果
在这里插入图片描述

2,合并选中单元格区域,仅合并连续相同的值

Sub 合并选中单元格区域的连续同值()
    '合并选中单元格,适用单行、单列、多行多列区域
    Dim rng As Range, dict As Object, i, key_i, v
    Set rng = Intersect(ActiveSheet.UsedRange, Selection)  'intersect语句避免选择整列造成无用计算
    Set dict = CreateObject("scripting.dictionary")
    
    Application.ScreenUpdating = False  '关闭屏幕更新,加快程序运行
    Application.DisplayAlerts = False   '不显示警告信息
    For Each i In rng
        key_i = CStr(i.Value)
        If Not dict.Exists(key_i) Then
            Set dict(key_i) = i
        Else
            Set dict(key_i) = Application.Union(dict(key_i), i)
        End If
    Next
    v = dict.Items
    For i = 0 To dict.count - 1
        v(i).Merge
    Next
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
End Sub

3,撤销选中区域内的合并单元格,并对单元格赋值原值

Sub 撤销选中区域的合并单元格()
    '撤销选中合并单元格,所有单元格赋值,单行、单列、多行多列都适用
    Dim rng As Range, i&, j&, first_row&, last_row&, first_col&, last_col&
    Set rng = Intersect(ActiveSheet.UsedRange, Selection)  'intersect语句避免选择整列造成无用计算
    first_row = rng.Row     '选中区域开始行号
    last_row = first_row + rng.Rows.count - 1  '选中区域结束行号
    first_col = rng.Column  '选中区域开始列号
    last_col = first_col + rng.Columns.count - 1  '选中区域结束列号
    
    Application.ScreenUpdating = False  '关闭屏幕更新,加快程序运行
    Application.DisplayAlerts = False   '不显示警告信息
    For i = first_row To last_row
        For j = first_col To last_col
            If Cells(i, j).MergeCells Then  '区域内是否包含合并单元格
                With Range(Cells(i, j).MergeArea.Address)  '合并单元格地址
                    .UnMerge  '撤销合并
                    .Value = Cells(i, j).Value  '全部赋值
                End With
            End If
        Next
    Next
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
End Sub

举例

A列选中运行sub2后得到C列效果;相反C列选中运行sub3后得到A列效果
在这里插入图片描述

4,选中列向下合并连续空单元格

Sub 选中列向下合并连续空单元格()
    Dim rng As Range, i&, first_row&, last_row&, first_col&, s_row&, e_row&
    Set rng = Intersect(ActiveSheet.UsedRange, Selection)  'intersect语句避免选择整列造成无用计算
    If rng.Columns.Count > 1 Then Debug.Print "仅支持单列": Exit Sub  '仅支持单列,多列则退出
    first_row = rng.row     '选中区域开始行号
    last_row = first_row + rng.Rows.Count - 1  '选中区域结束行号
    first_col = rng.column  '选中区域开始列号
    
    s_row = first_row: e_row = first_row  '行号起止初始化
    For i = first_row To last_row
        If Cells(i, first_col).Value = "" Then
            e_row = i
        Else
            If s_row <> e_row Then Cells(s_row, first_col).Resize(e_row - s_row + 1, 1).Merge  '非空合并
            s_row = i: e_row = i
        End If
        If s_row <> e_row Then Cells(s_row, first_col).Resize(e_row - s_row + 1, 1).Merge  '最后一个合并
    Next
End Sub

举例

A列选中运行代码得到E列效果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薛定谔_51

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值