VBA Excel-基于A列合并合并B列中的单元格

VBA Excel-基于A列合并合并B列中的单元格,vba,excel,mergesort,Vba,Excel,Mergesort,我有一个例程可以合并列a中的连续单元格。我需要合并列B中顺序匹配的单元格,但不能跨合并列a单元格的行边界合并。我的A列合并工作正常 但是,如果列B中的值具有顺序值,这些值从合并的单元格旁边开始,然后继续到下一个单元格,则它们会跨边界合并。我如何根据已经合并的A单元合并顺序匹配的B单元 下面是我的代码当前如何合并A列合并单元格的行边界: 下面是我打算让它看起来的样子: 我当前的代码: Sub MergeV() ' Merge Administration and Category wh

我有一个例程可以合并列a中的连续单元格。我需要合并列B中顺序匹配的单元格,但不能跨合并列a单元格的行边界合并。我的A列合并工作正常

但是,如果列B中的值具有顺序值,这些值从合并的单元格旁边开始,然后继续到下一个单元格,则它们会跨边界合并。我如何根据已经合并的A单元合并顺序匹配的B单元

下面是我的代码当前如何合并A列合并单元格的行边界:

下面是我打算让它看起来的样子:

我当前的代码:

Sub MergeV()
    ' Merge Administration and Category where sequentional matching rows exist

    ' Turn off screen updating
    Application.Calculation = xlCalculationManual
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False

    Dim Current As Worksheet
    Dim lrow As Long

    For Each Current In ActiveWorkbook.Worksheets
        lrow = Cells(Rows.Count, 1).End(xlUp).Row
        Set rngMerge = Current.Range("A2:B" & lrow)

MergeAgain:
        For Each cell In rngMerge
            If cell.Value = cell.Offset(1, 0).Value And IsEmpty(cell) = False Then
                Range(cell, cell.Offset(1, 0)).Merge
                GoTo MergeAgain
            End If
        Next

    Next Current

    ' Turn screen updating back on
    Application.Calculation = xlCalculationAutomatic

End Sub

我们将非常感谢任何关于实现这一点的指导

这很难解决。合并A列后,在合并B列中顺序匹配的单元格时,我可以检查A列中的相邻单元格是否为合并单元格。偏移量(0,-1)。合并单元格。我还可以获得第一个合并行j=cell.Offset(0,-1).MergeArea.row,并通过计算合并行的计数k=cell.Offset(0,-1).MergeArea.count并设置lastmergerow=j+k-1(减去1得到合并区域的结尾)来计算最后一个合并行

然而,关键是在范围内循环时设置和更新变量。在下面的代码中,我更新了范围的开始行和结束行,以防止从A列合并超过合并区域。这使我能够合并列B中的顺序匹配值,同时保持在列A的合并区域内

尽可能避免使用合并的单元格!!!但是,在很少有人需要这样做的情况下,我希望下面的代码能有所帮助

我的最后代码:

Sub MergeB() ' Merge Category (Column B) where sequentially matching rows exist while staying within the range of merged cells in Administration (Column A) ' Turn off screen updating Application.Calculation = xlCalculationManual Application.ScreenUpdating = False Application.DisplayAlerts = False On Error Resume Next Dim Current As Worksheet Dim lrow As Long Dim k As Long Dim j As Long Dim bRow As Long Dim endRow As Long For Each Current In ActiveWorkbook.Worksheets bRow = 2 lrow = Cells(Rows.Count, 2).End(xlUp).Row endRow = Cells(Rows.Count, 2).End(xlUp).Row MergeAgain: Set rngMerge = Current.Range("B" & bRow & ":B" & lrow) For Each cell In rngMerge If cell.Offset(0, -1).MergeCells Then k = cell.Offset(0, -1).MergeArea.Count j = cell.Offset(0, -1).MergeArea.Row lastmergerow = j + k - 1 m = k - 1 End If Dim i As Integer For i = 1 To m If cell.Value = cell.Offset(1, 0).Value And IsEmpty(cell) = False And bRow < lastmergerow Then Range(cell, cell.Offset(1, 0)).Merge bRow = bRow + 1 Else bRow = bRow + 1 lrow = lastmergerow If bRow > endRow Then GoTo NextSheet End If If bRow > lrow Then lrow = endRow End If GoTo MergeAgain End If Next i bRow = lastmergerow + 1 lrow = endRow GoTo MergeAgain Next NextSheet: Next Current ' Turn screen updating back on Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True Application.DisplayAlerts = True Call AutoFit End Sub 子合并b() '合并类别(B列),其中存在顺序匹配的行,但仍在管理中的合并单元格范围内(A列) '关闭屏幕更新 Application.Calculation=xlCalculationManual Application.ScreenUpdating=False Application.DisplayAlerts=False 出错时继续下一步 将当前设置为工作表 暗淡的光线和长的一样 暗k一样长 Dim j尽可能长 黯淡的眉毛 暗尾行与长尾行相同 对于ActiveWorkbook.工作表中的每个当前 眉毛=2 lrow=单元格(Rows.Count,2).结束(xlUp).行 endRow=单元格(Rows.Count,2).End(xlUp).Row 再次合并: 设置rngMerge=Current.Range(“B”&bRow&“:B”&lrow) 对于rngMerge中的每个单元格 如果单元格偏移量(0,-1),则合并单元格 k=单元格偏移量(0,-1).MergeArea.Count j=单元格偏移量(0,-1).MergeArea.Row lastmergerow=j+k-1 m=k-1 如果结束 作为整数的Dim i 对于i=1到m 如果cell.Value=cell.Offset(1,0).Value和IsEmpty(cell)=False,然后浏览< lastmergerow 范围(单元格,单元格偏移量(1,0)).Merge 眉毛=眉毛+1 其他的 眉毛=眉毛+1 lrow=lastmergerow 如果浏览>结束行,则 转到下一页 如果结束 如果眉毛>;低,则 lrow=endRow 如果结束 又来了 如果结束 接下来我 bRow=lastmergerow+1 lrow=endRow 又来了 下一个 下表: 下一个电流 '重新打开屏幕更新 Application.Calculation=xlCalculationAutomatic Application.ScreenUpdating=True Application.DisplayAlerts=True 调用自动拟合 端接头
首先,您应该在
应用程序之后将
屏幕更新
显示警报
设置为
True
,从而将它们重新“打开”。计算
使用?cell.Offset(-1,0).MergeArea.Address严格来说,为了确保列A cells范围内的最后一行是@Marcucciboy2,Excel会自动将
屏幕更新
重置为True,但对于我来说,我更愿意明确地声明。感谢@Cyril的建议。我在If声明中添加了以下内容,但没有改变结果。如果cell.Value=cell.Offset(1,0).Value和IsEmpty(cell)=False,cell.Row@JohnMiller,则检查涉及完整的“?cell.Offset(-1,0).mergearea.address”,它应提供返回的范围。您需要确定该范围的最后一行,它可能最好作为变量(k)保存,然后您的if语句包括cell.row