Это было трудно решить. После объединения столбца A при объединении последовательно совпадающих ячеек в столбце B можно проверить, объединена ли соседняя ячейка в столбце * cell.Offset (0, -1) .MergeCell . Я также могу получить первую объединенную строку j = cell.Offset (0, -1) .MergeArea.Row и рассчитать последнюю объединенную строку, взяв количество объединенных строк k = cell.Offset (0, -1) .MergeArea.Count и установка lastmergerow = j + k -1 (вычтите 1, чтобы получить конец MergeArea).
Однако ключ заключается в том, чтобы устанавливать и обновлять переменные во время циклического перемещения по диапазону. В приведенном ниже коде я обновил начальную и конечную строки для диапазона, чтобы избежать слияния после MergeArea из столбца A. Это позволило мне объединить последовательно совпадающие значения в столбце B, оставаясь в пределах MergeArea из столбца A.
Избегайте работы с объединенными ячейками, когда это возможно !!! Но, в редких случаях, когда кому-то нужно это сделать, я надеюсь, что следующий код поможет.
Мой FinalCode:
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