根据单元格值合并范围内的单元格,但最后一个单元格没有被合并

Posted

技术标签:

【中文标题】根据单元格值合并范围内的单元格,但最后一个单元格没有被合并【英文标题】:Merge cells in a range based on cell value but the last cells aren't being merged 【发布时间】:2021-10-15 04:34:46 【问题描述】:

我有一个范围,其中包含从 A 列到 K 列的数据的行。C 列中单元格值的每个新更改之间已经有一个空白行。我想根据值是否相同来合并 c 列中的数据加上下面的一个空白行。我绝对需要合并为 B 列中的每个唯一单元格值包含一个空白行,因为稍后我将对值进行分组。

我当前的代码合并了除最后一个唯一值之外的所有内容...谁能帮我调整我的代码,以便我也可以包含我最后一个唯一值?

Sub MergeSameValue()
Application.DisplayAlerts = False
Dim LastRow As Integer
Dim StartRow As Integer
StartRow = 12
LastRow = Range("B" & Rows.Count).End(xlUp).Row

Dim StartMerge As Integer
StartMerge = StartRow

For i = StartRow + 1 To LastRow + 1
   If Cells(i, 2) <> "" Then
        If Cells(i, 2) <> Cells(i - 1, 2) Then
            Range(Cells(i - 1, 2), Cells(StartMerge, 2)).Merge
            StartMerge = i
        End If
    End If
Next i

End Sub

【问题讨论】:

旁注:将所有Integer 更改为Long,参见this。 会的!非常感谢你,BigBen。 【参考方案1】:

您的代码表明您当前在循环中检查的单元格不能为空白,即If Cells(i, 2) &lt;&gt; "" Then。 如果单元格不为空白,则检查是否应合并。

由于最后一部分将永远满足该条件(当 i = 28 时,代码行 Cells(i, 2) &lt;&gt; "" 永远不会为真。所以在我下面的示例中,第 28 行将始终是最后一个单元格并且它永远不会有值)。因此,您的代码将永远不会移动到下一部分:If Cells(i, 2) &lt;&gt; Cells(i - 1, 2) Then... 并尝试合并最后一部分。

您可以通过向单元格B28 添加一个值来尝试此操作,“日记”类别将被合并。

通过在最后一行添加异常,这将解决您的问题。

注意:我建议仅在合并时隐藏警报。否则,如果代码的不同部分没有按预期工作,很容易感到惊讶,因为它会因为警报被隐藏而被隐藏。

完整代码:

Sub MergeSameValue()

Dim LastRow As Long
Dim StartRow As Long
StartRow = 12
LastRow = Range("B" & Rows.Count).End(xlUp).Row

Dim StartMerge As Long
StartMerge = StartRow

For i = StartRow + 1 To LastRow + 1
   If Cells(i, 2) <> "" Then
        If Cells(i, 2) <> Cells(i - 1, 2) Then
            Application.DisplayAlerts = False
            Range(Cells(i - 1, 2), Cells(StartMerge, 2)).Merge
            Application.DisplayAlerts = True
            StartMerge = i
        End If
    End If
    
    If i = LastRow + 1 Then ' for the last row, make an exception and check and run merge
        Application.DisplayAlerts = False
        Range(Cells(i, 2), Cells(StartMerge, 2)).Merge 'To add a blank space for the last row in the merge, remove the -1.
        Application.DisplayAlerts = True
    End If
    
Next i

End Sub

结果:

【讨论】:

非常感谢,维智!我要做的唯一小的调整不是删除-1,而是将其设为+1,以便为最后一个值添加一个空格。这完美! 不!好问题,这是一个有趣的挑战。很高兴你想出了一个让它工作的方法^^。快乐编码:)

以上是关于根据单元格值合并范围内的单元格,但最后一个单元格没有被合并的主要内容,如果未能解决你的问题,请参考以下文章

使用单元格值范围内的条件运行 SQL 查询列表

根据单元格的变化清除所有下一行的单元格值并保留公式

谷歌表格 - 根据公式内的另一个单元格值设置行号?

VBA 突出显示边界条件外范围内的单元格

根据单元格值将特定范围而不是整行复制到另一个谷歌工作表

试图根据给出错误值的范围获取最后一个单元格地址