объединить ячейки по горизонтали, когда значение идентично
Sub mergeCells()
Dim ws As Worksheet
Dim UsedColumns As Long
Dim rng As Range
Dim CurrentRow As Long, CurrentColumn As Long
Set ws = ActiveWorkbook.Worksheets("sheet3")
UsedColumns = ws.Cells.Find(What:="*", LookIn:=xlFormulas, _
SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column
Application.DisplayAlerts = False
For CurrentRow = 1 To 2
For CurrentColumn = UsedColumns To 2 Step -1
Set rng = ws.Cells(CurrentRow, CurrentColumn)
If rng.Value <> "" And rng.Value = rng.Offset(0, -1).Value Then
rng.Offset(0, -1).Resize(1, 2).Merge
End If
Next CurrentColumn
Next CurrentRow
Application.DisplayAlerts = True
set rng = Nothing
Set ws = Nothing
End Sub
объединить ячейки по горизонтали, когда месяц совпадает
Если достаточно сравнитьзначения (например, каждый "jan" - это просто одна и та же строка), тогда приведенный выше код работает.
Если месяц основан на формате ячейки с разными датами (например, 1-е декабря, 8-е декабря, 15-е декабря ... все показанокак "dec" или "12"), тогда вы можете сравнить Month(rng.Value)
с Month(rng.Offset(0, -1).Value)
.
Unmerge
Sub UnmergeCells()
Dim ws As Worksheet
Dim UsedColumns As Long
Dim rng As Range
Dim cellcount As Long
Dim CurrentRow As Long, CurrentColumn As Long
Set ws = ActiveWorkbook.Worksheets("sheet3")
UsedColumns = ws.UsedRange.Cells(1).Column + ws.UsedRange.Columns.Count - 1
For CurrentRow = 1 To 2
For CurrentColumn = 1 To UsedColumns
Set rng = ws.Cells(CurrentRow, CurrentColumn)
If rng.Value <> "" And rng.MergeCells Then
cellcount = rng.MergeArea.Cells.Count
rng.MergeArea.UnMerge
rng.Resize(1, cellcount).Value = rng.Value
End If
Next CurrentColumn
Next CurrentRow
Set rng = Nothing
Set ws = Nothing
End Sub
Поскольку Range.Find
плохов поиске последнего использованного столбца, если он находится в объединенных ячейках.Поэтому вместо этого я использую стандарт UsedRange
, чтобы найти его, даже когда ячейки объединены.