【Excel VBA】如何批量合并相同值单元格?

论坛 期权论坛 期权     
数据分析就用Excel   2019-7-28 23:17   4577   0
大家晚上好,今天和大家分享的VBA代码是……
批量合并相同值单元格
很久以前,我们和大家分享过一段类似功能的代码,链接:【Excel VBA】批量合并相同值单元格
但那段代码只支持单列数据合并……
另外,在那段推文的结尾,我们也留了一个尾巴。尾巴里说使用数组的方法,批量合并效率会高于遍历单元格两两合并……
打个响指,欠揍脸,我们今天和大家分享的方法就是数组法的啦。
效果动画如下:


小贴士:
1,该段代码支持用户选择单列或多列数据,选择区域的整行数据相同则进行合并。
2,代码照例允许用户选择整列数据,也不用担心运算量过大,系统假死的情况。
3,代码使用了一个数组brr用于存放数据以及合并单元格的行数。VBA在使用数组处理数据时,这个方法是经常使用到的。如果你函数还可以,那么你可以把这样的数组理解为辅助列。对于函数大神,比如曾经的我,可能相当讨厌辅助列,认为不够表现高超的水平;但是,在VBA中,善于使用辅助列性质的数组不但是个好习惯,而且经常是解决问题的最好方法,任性的不加之一。
4,事实上这段代码也可以不使用数组brr,而只使用变量……
5,我们下期再分享如何批量撤销合并单元格。
晚安,晚安,晚安……
代码如下:
Sub RngMergeCondition() '批量合并单元格    Dim rngUser As Range    Dim rngMerge As Range    Dim rngSelect As Range    Dim i As Long, j As Long    Dim lngRowFirst As Long    Dim lngClnFirst As Long    Dim arr As Variant    Dim brr As Variant    Dim strTemp As String    Dim lngBK As Long    Dim shtUser As Worksheet    On Error Resume Next    Set rngSelect = Selection    Set rngUser = Application.InputBox("请选择需要合并的单元格区域!", Default:=rngSelect.Address, Type:=8)    Set rngUser = Intersect(rngUser.Parent.UsedRange, rngUser)    '使用Intersect规避用户选择整列数据    If rngUser Is Nothing Then MsgBox "选择的单元格区域不能为空白": Exit Sub    arr = rngUser.Value    ReDim brr(1 To UBound(arr), 1 To 2)    '结果数组,第一列保存值,第二列保存合并行数    For i = 1 To UBound(arr)        strTemp = ""        For j = 1 To UBound(arr, 2)            strTemp = strTemp & "@@" & arr(i, j)            '合并多列字符串为单个字符串        Next        brr(i, 1) = strTemp        '字符串装入结果数组        If i > 1 Then        '如果不是第一行            If brr(i - 1, 1) = strTemp Then                If lngBK = 0 Then lngBK = i - 1                'lngBK变量赋值结果数组用于存放合并行数的位置                brr(lngBK, 2) = brr(lngBK, 2) + 1                '累计相同值的行数            Else                lngBK = i            End If        End If    Next    Application.ScreenUpdating = False    Application.DisplayAlerts = False    lngRowFirst = rngUser.Row    '用户选择单元格区域的开始行    lngClnFirst = rngUser.Column    '用户选择单元格区域的开始列    Set shtUser = rngUser.Parent    For i = 1 To UBound(brr)        If brr(i, 2) > 0 Then            For j = 1 To UBound(arr, 2)                Set rngMerge = shtUser.Cells(i + lngRowFirst - 1, lngClnFirst + j - 1)                rngMerge.Resize(brr(i, 2) + 1, 1).Merge            Next        End If    Next    Application.ScreenUpdating = True    Application.DisplayAlerts = TrueEnd Sub

淘宝、当当、京东各大网店均有销售

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:113
帖子:22
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP