Excel VBA宏基于行中的多个值合并重复行

Excel VBA宏基于行中的多个值合并重复行,excel,vba,Excel,Vba,我有一个MS Excel表格示例: 我正在尝试编写一个VBA宏,它允许我比较行,比较是使用多个单元格(A2:E2)完成的,其余单元格(F2:I2)将合并其值而不进行比较。我想能够比较一行-单元格(A2:E2)和单元格(A3:E3),然后单元格(A2:E2)和单元格(A4:E4)。。。当比较完成时,它将合并重复项,这样单元格(Fx:Ix)也将合并 最终效果如下所示: 到目前为止,我已经提出了这段代码,但运行它会使Excel崩溃。任何形式的建议都将不胜感激 提前谢谢 Sub MergeDupli

我有一个MS Excel表格示例:

我正在尝试编写一个VBA宏,它允许我比较行,比较是使用多个单元格(A2:E2)完成的,其余单元格(F2:I2)将合并其值而不进行比较。我想能够比较一行-单元格(A2:E2)和单元格(A3:E3),然后单元格(A2:E2)和单元格(A4:E4)。。。当比较完成时,它将合并重复项,这样单元格(Fx:Ix)也将合并

最终效果如下所示:

到目前为止,我已经提出了这段代码,但运行它会使Excel崩溃。任何形式的建议都将不胜感激

提前谢谢

Sub MergeDuplicateRows()

    Dim i As Long
    Dim j As Long
    Dim RowCount As Long

    Dim sameRows As Boolean

    sameRows = True
    RowCount = Rows.Count

    Application.DisplayAlerts = False
    Application.ScreenUpdating = False

    For i = 1 To Range("B" & RowCount).End(xlUp).Row
        For j = 1 To 5
            If StrComp(Cells(i, j), Cells(i + 1, j), vbTextCompare) Then
                sameRows = False
            End If
        Next j

        If sameRows Then
            Range(Cells(i, 1), Cells(i + 1, 1)).Merge
            Range(Cells(i, 2), Cells(i + 1, 2)).Merge
            Range(Cells(i, 3), Cells(i + 1, 3)).Merge
            Range(Cells(i, 4), Cells(i + 1, 4)).Merge
            Range(Cells(i, 5), Cells(i + 1, 5)).Merge
            Range(Cells(i, 6), Cells(i + 1, 6)).Merge
            Range(Cells(i, 7), Cells(i + 1, 7)).Merge
            Range(Cells(i, 8), Cells(i + 1, 8)).Merge
            Range(Cells(i, 9), Cells(i + 1, 9)).Merge
        End If

        sameRows = True
    Next i

    Application.DisplayAlerts = True

End Sub

试一试——我不得不改变一些逻辑,将
For
循环更改为
Do While
循环,而不是合并,而是删除行。我在您的样本数据上进行了测试,它工作正常,但我不确定它在1500行上的性能如何,不过:

Sub MergeDuplicateRows()

    Dim i As Long
    Dim j As Long
    Dim sameRows As Boolean

    Application.DisplayAlerts = False
    Application.ScreenUpdating = False

    i = 2

    Do While Cells(i, 2).Value <> ""
        For j = 1 To 5
            If Cells(i, j).Value <> Cells(i + 1, j).Value Then
                sameRows = False
                Exit For
            Else
                sameRows = True
            End If
        Next j

        If sameRows Then
            If Cells(i, 6).Value = "" Then Cells(i, 6).Value = Cells(i + 1, 6).Value
            If Cells(i, 7).Value = "" Then Cells(i, 7).Value = Cells(i + 1, 7).Value
            If Cells(i, 8).Value = "" Then Cells(i, 8).Value = Cells(i + 1, 8).Value
            If Cells(i, 9).Value = "" Then Cells(i, 9).Value = Cells(i + 1, 9).Value

            Rows(i + 1).Delete
            i = i - 1
        End If

        sameRows = False
        i = i + 1
    Loop

    Application.ScreenUpdating = True
    Application.DisplayAlerts = True

End Sub
子行()
我想我会坚持多久
Dim j尽可能长
Dim sameRows作为布尔值
Application.DisplayAlerts=False
Application.ScreenUpdating=False
i=2
执行While单元格(i,2)。值“”
对于j=1到5
如果单元格(i,j)。给单元格(i+1,j)赋值。然后给单元格赋值
sameRows=False
退出
其他的
sameRows=True
如果结束
下一个j
如果sameRows那么
如果单元格(i,6).Value=”“,则单元格(i,6).Value=单元格(i+1,6).Value
如果单元格(i,7).Value=”“则单元格(i,7).Value=单元格(i+1,7).Value
如果单元格(i,8).Value=”“则单元格(i,8).Value=单元格(i+1,8).Value
如果单元格(i,9).Value=”“那么单元格(i,9).Value=单元格(i+1,9).Value
行(i+1)。删除
i=i-1
如果结束
sameRows=False
i=i+1
环
Application.ScreenUpdating=True
Application.DisplayAlerts=True
端接头

试一试-我不得不改变一些逻辑,将
For
循环更改为
Do While
循环,而不是合并,而是删除行。我在您的样本数据上进行了测试,它工作正常,但我不确定它在1500行上的性能如何,不过:

Sub MergeDuplicateRows()

    Dim i As Long
    Dim j As Long
    Dim sameRows As Boolean

    Application.DisplayAlerts = False
    Application.ScreenUpdating = False

    i = 2

    Do While Cells(i, 2).Value <> ""
        For j = 1 To 5
            If Cells(i, j).Value <> Cells(i + 1, j).Value Then
                sameRows = False
                Exit For
            Else
                sameRows = True
            End If
        Next j

        If sameRows Then
            If Cells(i, 6).Value = "" Then Cells(i, 6).Value = Cells(i + 1, 6).Value
            If Cells(i, 7).Value = "" Then Cells(i, 7).Value = Cells(i + 1, 7).Value
            If Cells(i, 8).Value = "" Then Cells(i, 8).Value = Cells(i + 1, 8).Value
            If Cells(i, 9).Value = "" Then Cells(i, 9).Value = Cells(i + 1, 9).Value

            Rows(i + 1).Delete
            i = i - 1
        End If

        sameRows = False
        i = i + 1
    Loop

    Application.ScreenUpdating = True
    Application.DisplayAlerts = True

End Sub
子行()
我想我会坚持多久
Dim j尽可能长
Dim sameRows作为布尔值
Application.DisplayAlerts=False
Application.ScreenUpdating=False
i=2
执行While单元格(i,2)。值“”
对于j=1到5
如果单元格(i,j)。给单元格(i+1,j)赋值。然后给单元格赋值
sameRows=False
退出
其他的
sameRows=True
如果结束
下一个j
如果sameRows那么
如果单元格(i,6).Value=”“,则单元格(i,6).Value=单元格(i+1,6).Value
如果单元格(i,7).Value=”“则单元格(i,7).Value=单元格(i+1,7).Value
如果单元格(i,8).Value=”“则单元格(i,8).Value=单元格(i+1,8).Value
如果单元格(i,9).Value=”“那么单元格(i,9).Value=单元格(i+1,9).Value
行(i+1)。删除
i=i-1
如果结束
sameRows=False
i=i+1
环
Application.ScreenUpdating=True
Application.DisplayAlerts=True
端接头

在您的最终结果中,为什么
var8
foo1
的行中有一个x(没有M)?“…但是运行它会使Excel崩溃”-您这是什么意思?您收到的是实际的错误消息,还是Excel只是冻结?Excel只是冻结,永远不会醒来-出现一个对话框,要求重新启动MS Excel…最后一个问题-所有可能匹配的行是否都在上/下,或者它们可能在工作表上的任何位置?您也永远不会恢复
屏幕更新
。在您的最终结果中,为什么
var8
foo1
行中有一个x(没有M)?“…但运行它会使Excel崩溃”-这是什么意思?您收到的是实际的错误消息,还是Excel只是冻结?Excel只是冻结,永远不会醒来-出现一个对话框,要求重新启动MS Excel…最后一个问题-所有可能匹配的行是否都在上/下,或者他们可能在工作表上的任何地方?你也永远不会恢复
屏幕更新
。非常感谢-在一个小数据集上工作就像一个符咒;大约1500需要一段时间——至少我可以看出我的逻辑哪里出了问题:)。感谢您的帮助。非常感谢-在一个小数据集上就像一个符咒;大约1500需要一段时间——至少我可以看出我的逻辑哪里出了问题:)。谢谢你的帮助。