Excel VBA宏基于行中的多个值合并重复行
我有一个MS Excel表格示例: 我正在尝试编写一个VBA宏,它允许我比较行,比较是使用多个单元格(A2:E2)完成的,其余单元格(F2:I2)将合并其值而不进行比较。我想能够比较一行-单元格(A2:E2)和单元格(A3:E3),然后单元格(A2:E2)和单元格(A4:E4)。。。当比较完成时,它将合并重复项,这样单元格(Fx:Ix)也将合并 最终效果如下所示: 到目前为止,我已经提出了这段代码,但运行它会使Excel崩溃。任何形式的建议都将不胜感激 提前谢谢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
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需要一段时间——至少我可以看出我的逻辑哪里出了问题:)。谢谢你的帮助。