🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA Cut in Excel — Range.Cut, Cut vs Copy, and the Two Ways to Drop What You Cut

|

VBA Cut in Excel — Range.Cut, Cut vs Copy, and the Two Ways to Drop What You Cut

TL;DRRange.Cut picks cells up onto the clipboard in cut mode. Then you put them down, and there are exactly two ways that do opposite things: rng.Cut Destination:=dest (a paste) lands the cells on top of dest and overwrites it, while rng.Cut then dest.Insert opens a gap and shifts cells aside so nothing is lost. Cut also moves — it empties the source — where Copy duplicates. Clear the clipboard with Application.CutCopyMode = False when you finish.

Sub CutBasics()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Data")
    ws.Range("A2:D2").Cut                       ' pick the row's cells up (marching ants)
    ws.Range("A10").Insert Shift:=xlDown         ' INSERT the cut cells - shifts, does not overwrite
    Application.CutCopyMode = False              ' put the clipboard state away
End Sub

Cut is the verb under moving rows and moving columns. Understand what it puts on the clipboard and the two ways to take it off, and every move built on it behaves predictably.

What you'll learn

  • Cut versus Copy — a move empties the source, a copy leaves it in place
  • The two consumers of a cut — Destination:= / paste overwrites, Insert shifts
  • Why Application.CutCopyMode = False matters, and what the marching ants really are
  • Why Cut refuses a multi-area (Union) range when Copy sometimes tolerates it
  • Why a formula pointing at cut cells follows them, unlike a delete that breaks it

Cut moves; Copy duplicates

The one-word difference is what the source looks like when you are done. Copy leaves the source exactly where it was — you now have two copies. Cut removes the source once the cells land somewhere — you have one, in a new place:

ws.Range("A2:D2").Copy ws.Range("A20")     ' A2:D2 STAYS, A20 gets a duplicate
ws.Range("A2:D2").Cut ws.Range("A20")      ' A2:D2 is EMPTIED, A20 gets the originals

So Cut is for moving and Copy is for duplicating. Reaching for Copy to move — copy, then delete the source by hand — is a classic source of half-done moves, where the copy lands but the delete is forgotten or deletes the wrong range. If the goal is a move, cut.

The two ways to drop what you cut

Once cells are on the clipboard in cut mode, how you put them down decides whether data survives. These two lines look similar and do opposite things:

ws.Range("A2:D2").Cut Destination:=ws.Range("A10")   ' PASTE - lands on A10:D10, overwrites it
ws.Range("A2:D2").Cut
ws.Range("A10").Insert Shift:=xlDown                  ' INSERT - opens a gap at A10, shifts down

Cut Destination:= (and a manual .Cut then .Paste) is a paste: the cut cells land on top of the destination and overwrite whatever was there. .Insert after a .Cut is an insert cut cells: the destination and everything past it shift aside to make room, and nothing is overwritten. Pick paste when the target is empty and you want the cells to land exactly there; pick insert when you are slotting cells between others — that is what a move is.

CutCopyMode and the marching ants

After Range.Cut (or Copy) with no destination, Excel is left in a special state — the source has a crawling dashed border, the "marching ants," and Excel is waiting for you to paste or insert. That state is Application.CutCopyMode, and leaving it hanging is untidy: the next thing the user does can trigger a stray paste, and pressing Escape or editing a cell cancels it in ways your macro did not plan for.

ws.Range("A2:D2").Cut
ws.Range("A10").Insert Shift:=xlDown
Application.CutCopyMode = False        ' cancel the marching ants, release the clipboard

Cut Destination:= and .Insert complete the operation and clear the mode for you, so the extra line is belt-and-braces there. But any time you .Cut or .Copy and then do other work before pasting, finish with Application.CutCopyMode = False so you never leave Excel mid-cut.

Cut refuses a multi-area range

Cut works on one contiguous block. Hand it a multi-area range — cells joined with Union, or a multi-select like Range("A2:D2, A8:D8") — and it raises a run-time error, because there is no sensible single place to drop two disconnected blocks:

Union(ws.Range("A2:D2"), ws.Range("A8:D8")).Cut   ' run-time error - Cut needs one block

Copy is sometimes more forgiving with multi-area ranges of matching shape, which is another reason cut and copy are not interchangeable. To move several scattered rows, cut and insert them one block at a time (bottom-up when they are stacked) rather than trying to cut them all at once — see moving rows.

Cut carries references; delete breaks them

Here is the property that makes cut a safe move. When you cut cells, Excel rewrites every formula that points at them so the references follow the cells to their new home: =Data!B2 still reads the same value after B2 is cut to B40. That is the exact opposite of deleting those cells, where a formula pointing into the deleted range collapses to =#REF! and stays broken.

The reason is what each verb means. A cut relocates data — the data still exists, so its references still have something to point at, and Excel updates them. A delete destroys data — there is nothing left to point at, so the references break. When you want the same numbers in a new place with every formula still working, Cut is the tool; when you want the numbers gone, expect the #REF!s and clean them up.

How ExcelMaster helps

Cut hides three forks that all fail silently — move or duplicate (cut versus copy), overwrite or shift (paste versus insert), and finished or mid-cut (CutCopyMode) — plus the multi-area range that errors outright. Choose wrong and you get lost source rows, an overwritten destination, or a workbook stuck in cut mode.

ExcelMaster lets you say the intent — "move these cells below the totals without overwriting anything" — and it cuts rather than copies, inserts rather than pastes, blocks the operation one contiguous range at a time, and clears CutCopyMode when it is done. You keep the workbook and the code.

Frequently asked questions

What does Range.Cut do in VBA?

Range.Cut places the range's cells on the clipboard in cut mode and shows the marching-ants border. On its own it does not move anything yet — you finish the move by pasting (Cut Destination:=, which overwrites the target) or by calling .Insert on the destination (which shifts cells aside and preserves them). Once the cells land, the source is emptied.

What is the difference between Cut and Copy in VBA?

Cut moves — the source is emptied after the cells land, so you end with one copy in a new place. Copy duplicates — the source stays and the destination gets a second copy. Use Cut to move, Copy to duplicate; do not use copy-then-delete as a move, which is easy to leave half done.

Why should I set Application.CutCopyMode = False?

To cancel the marching-ants clipboard state after a cut or copy. Leaving it on invites a stray paste from the next keystroke and leaves Excel waiting mid-operation. Cut Destination:= and .Insert clear it automatically, but set Application.CutCopyMode = False yourself whenever you .Cut or .Copy and do other work before pasting.

Why does VBA throw an error when I cut a Union range?

Because Cut only handles one contiguous block. A Union or multi-select is several disconnected blocks, and there is no single place to drop them, so Cut raises a run-time error. Cut and insert one block at a time instead. (Copy is sometimes more tolerant of matching-shape multi-area ranges.)

Do formula references break when I cut cells?

No — they follow. Excel rewrites formulas that reference cut cells to point at the cells' new location, so they keep reading the same data. That is the difference from deleting cells, which leaves references with nothing to point at and collapses them to #REF!.

Tested in

Tested in: Excel 365 (Windows 11), VBA 7.1 — last verified 2026-09-17.

Related guides: VBA Move Rows · VBA Move Columns · VBA Copy Paste · VBA PasteSpecial · VBA Delete Rows