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

Excel VBA の Paste Values — 数式を計算結果へ正しく固定する方法

|

Excel VBA の Paste Values — 数式を計算結果へ正しく固定する方法

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,20035% のように見せていたのは数式の 数値 書式 です。値だけを貼り付けると、その書式は置き去りになります。

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