基于列值合并单元格的 VBA 宏

Posted

技术标签:

【中文标题】基于列值合并单元格的 VBA 宏【英文标题】:VBA Macro to Merge Cells based on Column Values 【发布时间】:2019-08-22 10:01:22 【问题描述】:

我正在尝试使用基于列值的 VBA 合并 Excel 中的单元格。例如,在第一行,只要月份相同,就合并这些单元格。我试过以下代码:

Sub Main()

Dim j As Long

    For j = 1 To 13
        If StrComp(Cells(1, j), Cells(1, j + 1), vbTextCompare) Then
            Range(Cells(1, j), Cells(1, j + 1)).Merge
        End If

    Next j

End Sub

在这里,我将行固定为第一行并遍历列并检查下一个单元格值是否与当前值相同。但是,在输出中它合并了不正确的单元格。我在这里错过了什么?

【问题讨论】:

【参考方案1】:

这更容易理解。

Application.DisplayAlerts = False
    With ThisWorkbook.Sheets("Sheet1")
        For i = 13 To 2 Step -1 'Loop from the last cell, and stop at the second column 
            If .Cells(1, i).Value = .Cells(1, i).Offset(, -1).Value Then
                .Range(.Cells(1, i), .Cells(1, i).Offset(, -1)).Merge
            End If
        Next i
    End With
Application.DisplayAlerts = True

【讨论】:

但值得一提的是,它的速度要慢得多(它比需要的合并频率更高)并且它有一个无用的With 语句(你的statemets 中没有一个使用With)。 @Pᴇʜ 首先,我认为您是该站点上最好的编码人员之一,并且您提供了可以帮助人们的精明答案。我并不是要贬低您的答案,只是提供一个替代示例。是的,它确实更频繁地合并,但它更容易理解,而且我认为在处理 OPs 问题中的小范围时,速度不是一个因素。感谢您指出我没有正确连接工作表焦点,我尝试始终设置工作表,因为当工作表未正确识别时,我看到了太多错误。我已经更新了我的代码。谢谢 只是不要被误解。我的评论并不是要抹黑你的答案。看到替代品总是很好的(我总是给他们点数)。但我认为也值得了解给定解决方案之间的差异。所以 pro “更容易理解” 带有 con “slower”。当然,速度并不总是一个相关因素,但如果任何未来的读者(有类似问题但数据量不同)阅读它并知道有什么区别,他/她可以根据自己的需要选择适当的答案。【参考方案2】:

应该像这样工作......

Option Explicit

Public Sub MergeSameValuesInRow()
    Const iRow As Long = 1         'the row number
    Const FirstColumn As Long = 1  'first column with data in iRow

    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Sheet1")  'define your worksheet

    Dim LastColumn As Long  'find last used column in iRow
    LastColumn = ws.Cells(iRow, ws.Columns.Count).End(xlToLeft).Column

    Dim StartCell As Range  'remember the start cell (first occurence of a new value)
    Set StartCell = ws.Cells(iRow, FirstColumn)

    Dim iCol As Long
    For iCol = FirstColumn + 1 To LastColumn + 1  'loop through columns in iRow
        If ws.Cells(iRow, iCol).Value <> StartCell.Value Then  'if value changed …
            Application.DisplayAlerts = False  'hide merging messages
            ws.Range(StartCell, ws.Cells(iRow, iCol - 1)).Merge  'merge from start cell until one before value change
            Application.DisplayAlerts = True

            Set StartCell = ws.Cells(iRow, iCol)  'set start cell to the next value
        End If
    Next iCol
End Sub

它将改变这一点……

进入这个……

【讨论】:

我接受了 GMalc 的回答,因为它简短而简洁。但是,感谢您的回答!

以上是关于基于列值合并单元格的 VBA 宏的主要内容,如果未能解决你的问题,请参考以下文章

从 vba 中的单元格地址获取 excel 合并单元格的值

使用 VBA 在 Excel 中处理合并和居中单元格

text 如何用VBA遍历含有合并单元格的文字表格?

合并仅用变量引用的连续单元格

使用ms字VBA宏合并表中的单元格

怎么把两个单元格合并成一个