TL;DR — Merging is not formatting.
Range("A1:C1").Mergefuses three cells into one cell that spans three columns, and only the top-left value survives —B1andC1are erased with no warning. A merged block then breaks sorting,Rangemath, column inserts and loops. When you only want a title centred over several columns, use Center Across Selection (HorizontalAlignment = xlCenterAcrossSelection), which looks identical but leaves every cell independent.
Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Report")
' This LOOKS like a centred title - and quietly deletes B1 and C1.
ws.Range("A1:C1").Merge
' The look-alike that keeps every cell separate:
ws.Range("A1:C1").HorizontalAlignment = xlCenterAcrossSelection
Merging cells is the one operation in the formatting family that is not cosmetic. Font, Interior and NumberFormat change how a cell looks and never touch what it holds. Merge is the opposite: it changes the grid itself and destroys data doing it. This guide is built around that single distinction — merge is structural, not visual — because every merged-cell headache downstream is a consequence of treating a data-model change as if it were a formatting choice.
What you'll learn
- The mental model — merging changes the grid, not just the look
- The rule that matters most — only the top-left value survives a merge
Merge,UnMerge,MergeCellsandMergeArea— the four you actually use- Exactly how merged cells break sorting,
Rangemath, inserts and loops - The look-alike that keeps cells independent — Center Across Selection
- Finding and cleaning up merged cells safely in code
The mental model: merge changes the grid, not the look
A merged cell is not a bigger cell with the same contents — it is a new structural object. Where there
were three independent cells, there is now one cell whose address is the top-left (A1) and whose
footprint (MergeArea) is A1:C1. B1 and C1 still exist as coordinates, but they are now empty
and unusable; anything they held is gone.
That is why the appearance cluster's rule — "formatting never changes the value" — does not apply here. Merge is the exception that proves it. Everything below follows from taking that seriously: if merging rewrites the grid and erases values, then any code that later sorts, inserts, loops over, or does arithmetic on that grid has to cope with a shape that no longer matches the tidy rectangle it assumes.
The rule that matters most: only the top-left value survives
Say it once: Merge keeps the top-left cell's value and discards the rest. Excel shows a dialog
warning about this when you merge by hand; in VBA there is no dialog — it just happens.
ws.Range("A1").Value = "Q3"
ws.Range("B1").Value = "Region"
ws.Range("C1").Value = "Total"
ws.Range("A1:C1").Merge ' A1 keeps "Q3"; "Region" and "Total" are ERASED
Debug.Print ws.Range("B1").Value ' prints nothing - B1 is now empty
If you want no data loss, you must not merge across cells that hold values — merge only empty spans, or move the values out first. This is the reason a macro that "just tidies the header" can quietly delete two columns of labels: the merge looked like alignment, but it was a deletion.
There is no safety net to lean on here. Unlike the Ribbon's Merge button, VBA's .Merge raises no
warning at all — nothing stops you fusing over live data — so you have to do the checking yourself and
merge only spans you know are empty. Silencing alerts with Application.DisplayAlerts = False (common
in bulk macros) would only ever hide a warning, never the data loss: turning off the alarm does not
make the fire safe.
Merge, UnMerge, MergeCells and MergeArea
Four members cover everything you do with merges:
ws.Range("A1:C1").Merge ' fuse into one cell (top-left value wins)
ws.Range("A1:C3").Merge Across:=True ' merge each ROW separately - three 1x3 merges, not one block
ws.Range("A1").UnMerge ' split the merged block back into individual cells
Debug.Print ws.Range("B1").MergeCells ' True if B1 is part of any merged cell
Debug.Print ws.Range("B1").MergeArea.Address ' "$A$1:$C$1" - the full block B1 belongs to
Two are worth dwelling on. Merge Across:=True is the row-wise variant — it merges each row of the
range independently, which is what you want for repeated row titles and almost never obvious from the
name. And MergeArea is the property that saves you: given any cell inside a merged block, it
returns the whole block, so you can read or unmerge it without knowing its exact bounds.
How merged cells break your macros
This is the practical cost, and it is why experienced developers avoid merges in data ranges. Four things break:
- Sorting throws an error. Sort a range that contains merged cells and Excel raises "This operation requires the merged cells to be identically sized." A single merged header can stop VBA Sort dead.
Rangemath lies. A mergedA1:C1reports.MergeArea.Columns.Countof 3, but as a value it behaves like one cell atA1. Code that assumes one column per value miscounts.- Inserts and deletes are blocked. You cannot insert or delete a column that passes through the middle of a merged block — Excel refuses, so structural edits fail on layouts you thought were fine.
- Loops skip cells.
For Each c In Range("A1:C1")visitsA1(with the value) and thenB1,C1as empty cells — the merge did not make them one iteration, it made two of them blank.
None of these announce themselves as "the merge did it." They surface as a sort error, an off-by-two count, or a blank where you expected a label — hours later, far from the merge.
The look-alike that keeps cells independent: Center Across Selection
Here is the opinionated part, and it is the single most useful thing in this guide: when you only
need a title centred over several columns, do not merge — use Center Across Selection. It produces
the identical visual result, but every cell stays separate, so sorting, inserting, looping and Range
math all keep working:
' Looks exactly like a merged title spanning A1:C1 - but A1, B1, C1 stay independent.
ws.Range("A1").Value = "Quarterly Report"
ws.Range("A1:C1").HorizontalAlignment = xlCenterAcrossSelection
The text lives in the top-left cell and is drawn centred across the empty cells to its right, purely
as alignment. Nothing is erased, nothing is fused. Reserve real Merge for the rare case where you
genuinely need one physical cell — a single caption block over a printed form — and never for headers
over data you will sort or filter.
Finding and cleaning up merged cells
Inheriting a sheet full of merges? The safe cleanup is: find each merged block through its
MergeArea, record the value, unmerge, then re-apply Center Across Selection so the look survives:
Dim c As Range
For Each c In ws.UsedRange
If c.MergeCells Then
With c.MergeArea
.UnMerge
.HorizontalAlignment = xlCenterAcrossSelection ' keep the centred look, lose the merge
End With
End If
Next c
One caution on testing for merges: MergeCells returns True, False, or Null when a range
mixes merged and unmerged cells. Reading that Null into a Boolean variable raises a type error, so
test it on single cells (as above) or with If c.MergeCells = True Then, which handles Null safely.
That Null is the same "mixed state" idea you meet elsewhere in VBA — a property that describes a
whole range can only answer cleanly when the range is uniform.
How ExcelMaster helps
Merged cells are a trap precisely because they look harmless — a centred title, a tidy header — while
they erase values and disarm sorting, inserts, loops and Range math further down the macro. And the
fix (Center Across Selection) is one most people have never heard of, hidden behind an obvious-looking
Merge button.
ExcelMaster lets you say what you
want the layout to be. Ask it to "centre the title across the top three columns" and it uses
xlCenterAcrossSelection — the safe look-alike — instead of a data-destroying merge, and when you
hand it a sheet full of inherited merges it unmerges them, preserves the values, and keeps the centred
appearance. You keep the workbook and the code; you skip the afternoon spent tracing a blank label or
a "merged cells must be identically sized" error back to a merge you forgot was there.
Frequently asked questions
How do I merge cells in Excel VBA?
Use Range("A1:C1").Merge to fuse a range into a single cell. Only the top-left value survives — the
others are erased with no warning in code — so merge only empty spans or move values out first. To
merge each row of a block separately, use Range("A1:C3").Merge Across:=True.
Why did merging cells delete my data in VBA?
Because Merge keeps only the top-left cell's value and discards everything else in the range. Excel
shows a warning when you merge by hand, but VBA merges silently. If you need the look without losing
data, use Range("A1:C1").HorizontalAlignment = xlCenterAcrossSelection, which centres the title
across the columns while keeping every cell's value intact.
How do I unmerge cells in VBA?
Call UnMerge on any cell in the block: Range("A1").UnMerge. Because you may not know the exact
bounds, use MergeArea first — Range("B1").MergeArea.UnMerge splits the whole block that B1
belongs to. After unmerging, the original top-left value stays in the top-left cell; the other cells
are empty.
What is the difference between Merge and Center Across Selection?
Merge physically fuses cells into one, erasing all but the top-left value and breaking sorting,
inserts and loops. Center Across Selection (HorizontalAlignment = xlCenterAcrossSelection) only
draws the top-left value centred across the neighbouring cells — they stay independent, so formulas,
sorting and structural edits keep working. It looks identical and is almost always the better choice.
Why does sorting fail when a range has merged cells?
Excel cannot reorder rows when merged blocks would end up different sizes, so it raises "This operation requires the merged cells to be identically sized" and refuses to sort. A single merged header cell over a data range is enough to trigger it. Unmerge the range (and switch to Center Across Selection for any titles) before sorting.
Tested in
Tested in: Excel 365 (Windows 11), VBA 7.1 — last verified 2026-08-14.
Related guides: VBA Borders · VBA Column Width · VBA Range · VBA Sort · VBA Cell Color
