TL;DR — 値 を貼り付けると、生きた数式がそのとき表示していた数値に置き換わります。その数値は もう自立していて、参照していたセルを削除してもブックは再計算しなくなり、外部リンクも静かになりま す。クリップボードでの手順は
.CopyのあとPasteSpecial Paste:=xlPasteValuesですが、素のxlPasteValuesは数値書式を落とすので、日付は45000のようなシリアル値として戻ってきます。見た 目が重要ならxlPasteValuesAndNumberFormatsを、クリップボードにまったく触れないシンプルな固定に はdst.Value = src.Valueを使いましょう。
' 数式の範囲を計算結果へ固定し、見た目も保つ:
src.Copy
src.PasteSpecial Paste:=xlPasteValuesAndNumberFormats
Application.CutCopyMode = False
' クリップボードなしの、値だけの同等コード(数値書式は失われる):
dst.Value = src.Value
数式とは 再計算の約束 です。=Sheet2!A1*1.1 は数値ではなく、Sheet2!A1 が変わるたびに再実行され
る指示です。たいていはそれこそが望みですが、ときには 答え が約束であることをやめて事実になってほ
しい場面があります——アーカイブする月次データ、メールで送るスナップショット、空回りを止めたい揮発性
の数式。それが値貼り付けの役目です。PasteSpecial の中でも最も検索される
話題であり、使う前に知っておくべき罠が一つあります。
この記事で学べること
- 考え方の軸——値貼り付けは 再計算の約束 を普通の数値に変える
- データを守る唯一のルール——固定するのはソースを削除する 前、後ではない
- 書式の罠——
xlPasteValuesは数値書式を剥ぎ取り、日付はシリアル値になる - 実際にある三つの用途——結果のアーカイブ、揮発性の停止、外部リンクの切断
- クリップボードを使わない近道——
dst.Value = src.Value - 固定 しない ほうがよい場面——数式が仕事をしているとき
考え方の軸:リンクではなくスナップショット
数式はセルをその入力値にリンクします。値を貼り付けるとその リンクを断ち切り、その瞬間に表示され
ていた数値だけを残します——スナップショットです。見た目のピクセルはまったく同じでも、振る舞いはまる
で違います。以前は =A1+A2 というセルで、永遠に A1 と A2 を追いかけていました。以後はリテラルな
350 になり、A1 と A2 が変わっても、移動しても、消えても気づきません。
リンク か スナップショット か——この一つの区別がすべての判断です。「この数値はまだ入力を追いか ける必要があるか」と問えば、数式を残すべきか固定すべきかの答えが出ます。値を貼り付けるとは、「いい え、この結果はもう確定です」と答えることです。
最も大事なルール:ソースを削除する前に固定する
データを壊す典型的な失敗がこれです。raw-data シートを参照する数式でレポートを作り、ファイルを軽く
しようと raw-data シートを削除する——すると数式はすべて #REF! に崩れます。参照先のセルが消えてし
まったからです。
dst.Formula = "=RawData!A1 * 1.1" ' 別シートへの生きたリンク
Worksheets("RawData").Delete ' 参照元が消える……
' dst は #REF! を表示——数値は失われた
直し方は順序です。先に結果を値へ固定し、それからソースを削除する。 dst.PasteSpecial Paste:=xlPasteValues
が実行されたあとは、そのセルは RawData に何も依存しない本物の数値を保持しているので、シートを削除
しても安全です。このルールは一般化できます。数式が依存しているセルを削除・上書き・移動しようとする
ときは、必ず 先に 値を貼り付けてください。ファイルを保存して閉じたあとの #REF! は元に戻せません。
書式の罠:値だけの貼り付けは数値書式を剥ぎ取る
これが人を検索に走らせる驚きです。xlPasteValues がコピーするのは 値 で、Excel における値とは裸
の数値です。日付は 1900 年からの日数を表すシリアル値として、通貨は普通の数値として、パーセントは小
数として格納されています。それらを 2026-03-15、$1,200、35% のように見せていたのは数式の 数値
書式 です。値だけを貼り付けると、その書式は置き去りになります。
src.Copy
src.PasteSpecial Paste:=xlPasteValues ' 2026-03-15 が 46091 になる
src.PasteSpecial Paste:=xlPasteValuesAndNumberFormats ' 2026-03-15 のまま
だから、人が読むものには xlPasteValuesAndNumberFormats を正直な既定にしましょう。表示書式も一緒に
数値へ運んでくれます。素の xlPasteValues を使うのは、計算に使う、書式をどうせ作り直すシステムへ書
き出すなど、生の数値そのものが本当に欲しいときだけにします。
値貼り付けが本当に果たす三つの仕事
数式を固定するのは一つの作業ではなく三つあり、名前を付けると「いつやるべきか」が見えてきます。
- 結果をアーカイブする。 今月のデータから計算した月次サマリーは、来月のデータが入っても変わるべ きではありません。固定すれば、その数値は永久にその月のものになります。
- 揮発性の数式を止める。
NOW()、RAND()、TODAY()、OFFSET()は編集のたびに再計算されます。 欲しい値を得たあとはただのノイズです。値貼り付けはそれをその場に留めます。 - 外部リンクを切る。
=[Budget.xlsx]Sheet1!A1のような数式だらけのブックは、開くたびに受け取っ た相手を更新の催促で煩わせます。そのセルを固定すれば、ファイルは追いかけるリンクを持たずに数値だ けを運びます。
三つとも意図が違うだけで同じ操作であり、三つとも 先に ソースを削除してから行うのは危険です——固定 してから、消す。
クリップボードを使わない近道:dst.Value = src.Value
欲しいのが値だけ——書式も、演算も、転置もなし——なら、クリップボードはまったく必要ありません。ある範
囲の .Value を別の範囲に代入すれば、数値がそのまま書き込まれます。
dst.Value = src.Value ' 値だけ、一瞬、クリップボードには一切触れない
これはその場で固定する最速の方法です——rng.Value = rng.Value は一行で、範囲の数式をその結果で上書
きします——そして PasteSpecial にまつわるあらゆるクリップボードの失敗モ
ードを回避します。唯一の制約は、値だけ しか動かせないことです。数値書式は付いてこないので、見た目
を残す必要があるなら PasteSpecial Paste:=xlPasteValuesAndNumberFormats を使い、クリップボードを使わ
ないコピーの全体像は VBA Copy Destination を参照してください。
固定しないほうがよいとき
固定するのは破壊的な操作です——数式を一つ捨てることになります。入力を追い続ける べき 数値には行わ ないでください。累計、リンクされたサマリー、前提が変われば再計算されることこそが存在意義のモデルな どです。それらを固定してしまうと、次に読む人が入力を編集しても「合計」は静かに動かなくなります。こ れはどんな再計算の遅れよりも厄介です。確定した結果 を固定し、まだ働いている数式 は残しましょう。 迷ったら、スナップショット用のシートにコピーを固定し、元の生きた数式はそのままにしておきます。
ExcelMaster の活用
値貼り付けは一行で説明できる考え方ですが、データを失う道は二つあります。ソースを削除したあとに固定
すると #REF! になり、日付に素の xlPasteValues を使うと 45000 の列をメールで送ることになります。
どちらもコンパイルは通り、実行もでき、手遅れになるまで問題なく見えます。
ExcelMaster には、やりたいこ
とをそのまま伝えられます——「今月の数値を固定して」「これらの数式を値に変換するけど日付はそのまま残
して」「送る前にリンクを切って」——すると手順を安全な順序(先に固定、あとで削除)で組み立て、人が読
む結果には xlPasteValuesAndNumberFormats を選び、クリップボードが不要なら dst.Value = src.Value
を使います。ブックとコードはあなたの手元に残ります。
よくある質問
VBA で数式を値に変換するには?
その場で固定します。rng.Value = rng.Value は、いま計算している数値で各数式を一行かつクリップボー
ドなしで上書きします。日付や通貨の表示書式を残す必要があるなら、クリップボードを使う方法を使いまし
ょう——rng.Copy してから rng.PasteSpecial Paste:=xlPasteValuesAndNumberFormats、続けて
Application.CutCopyMode = False です。
値を貼り付けたら日付が数値に変わったのはなぜ?
xlPasteValues が数値書式を付けずに値を貼り付け、日付の実体は 45000 のようなシリアル値だからです。
それを日付として見せていたのは書式でした。xlPasteValuesAndNumberFormats を使えば表示書式も一緒に渡
るので、日付は日付のままになります。
数式を削除せずに再計算を止めるには?
結果で置き換えます——値貼り付けです。セルをコピーして PasteSpecial Paste:=xlPasteValuesAndNumberFormats
するか、rng.Value = rng.Value を使います。NOW()、RAND()、OFFSET() のような、編集のたびに値が
変わり続ける揮発性の数式に対する定番の対処法です。固定してしまえば数値は動かなくなります。
参照元シートを削除すると数式は壊れますか?値の貼り付けは防げますか?
先に 固定していれば防げます。数式が別シートを参照していて、そのシートを削除すると数式は #REF!
になり数値は失われます。削除する前に値を貼り付けておけば、セルはソースにもう依存しない本物の数値を
保持します。
固定するときの .Value と .Value2 の違いは?
.Value は日付や通貨をそれぞれの型として返し、.Value2 は下地にある生の数値(日付ならシリアル値)
を返します。普通に固定するだけなら rng.Value = rng.Value で十分です。生のシリアル値がどうしても欲
しく、通貨や日付の型付けが不要なときだけ .Value2 を使ってください——詳しくは
VBA Value2 を参照してください。
検証環境
検証環境: Excel 365 (Windows 11), VBA 7.1 — 最終確認 2026-09-09。
関連ガイド: VBA PasteSpecial · VBA Copy Destination · VBA Copy Paste · VBA Formula · VBA Value2
