Вы продолжаете изменять ячейки в rngMerge, но не определяете их до повторного использования. Скорее всего, это сработает лучше, если вы начнете снизу и будете работать, поскольку ситуация похожа на вставку или удаление строк.
Option Explicit
Private Sub MergeCells()
Dim i As Long, c As Long, col As Variant
Application.DisplayAlerts = False
'Application.ScreenUpdating = false
col = Array("B", "C", "AF", "AG")
For c = LBound(col) To UBound(col)
For i = Cells(Rows.Count, col(c)).End(xlUp).Row - 1 To 2 Step -1
If Cells(i, col(c)).Value = Cells(i, col(c)).Offset(1, 0).Value And Not IsEmpty(Cells(i, col(c))) Then
Cells(i, col(c)).Resize(2, 1).Merge
Cells(i, col(c)).HorizontalAlignment = xlCenter
Cells(i, col(c)).VerticalAlignment = xlCenter
End If
Next i
Next c
Application.DisplayAlerts = True
'Application.ScreenUpdating = True
End Sub
Я добавил цикл обтекания, который циклически перебирает несколько столбцов, извлеченных из массива.
Я также заметил закрытую природу подпроцедуры, и я предполагаю, что она находится в закрытом листе кода рабочей таблицы (щелчок правой кнопкой мыши на вкладке имени, Просмотреть код). Если код должен выполняться на нескольких рабочих листах, он принадлежит общедоступной кодовой таблице модуля (в VBE используется Вставка, Модуль), и в ячейки должны быть добавлены соответствующие ссылки на родительские рабочие листы.