数式を値に変換
共有前に「式を消して計算結果だけ残したい」「再計算を止めて軽くしたい」——そんな場面で使う“値貼り”の定番パターンを、初心者向けにわかりやすくまとめました。基本は「範囲.Value = 範囲.Value」で、式を計算結果の値で上書きします。
基本:1行で数式を値に変換(最短)
Sub ConvertFormulaToValues_Basic()
With Range("E3:E12")
.Value = .Value '数式→計算結果の値で上書き
End With
End Sub
VB- ポイント:
- 一発置換: .Value を自分自身の .Value に代入すると、式が消えて値だけ残ります。
- 見た目は維持: 書式(表示形式・色・太字など)はそのままです。
選択範囲を値に変換(作業グループ対応)
Sub ConvertSelectionFormulas()
If TypeName(Selection) = "Range" Then
Selection.Value = Selection.Value
Else
MsgBox "セル範囲を選択してから実行してください。"
End If
End Sub
VB- ポイント:
- 手早い: 事前にユーザーが選んだ範囲をそのまま値化できます。
- 安全確認: Range以外(図形など)が選ばれている場合は中止。
貼り付け版:PasteSpecial で値に変換
Sub ConvertUsingPasteSpecial()
Dim rg As Range
Set rg = Range("E3:E12")
rg.Copy
rg.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
End Sub
VB- ポイント:
- 同じ効果: クリップボード経由で「値貼り」。
- 利点: 非連続選択や別範囲へ「値で貼る」に応用しやすい。
シート全体/ブック全体の数式を値化
Sub ConvertAllFormulasInSheet()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("売上")
ws.UsedRange.Value = ws.UsedRange.Value
End Sub
Sub ConvertAllFormulasInWorkbook()
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
ws.UsedRange.Value = ws.UsedRange.Value
Next
End Sub
VB- ポイント:
- UsedRange: データがある範囲に限定できて安全。
- 全体処理: 提出前に一括で式を消す用途に便利。
“数式セルだけ”を値に変換(絞り込み)
Sub ConvertOnlyFormulaCells()
Dim rg As Range, f As Range, area As Range
Set rg = Range("B3:E100") '対象範囲
On Error Resume Next
Set f = rg.SpecialCells(xlCellTypeFormulas) '数式セルのみ抽出
On Error GoTo 0
If Not f Is Nothing Then
For Each area In f.Areas
area.Value = area.Value
Next
End If
End Sub
VB- ポイント:
- 部分変換: 文字や固定値を残し、式だけ値化。
- エリア分割: 非連続の数式セルをまとめて安全に処理。
変換前後をセットで扱う(式を書いて→値固定)
Sub WriteFormulaThenFreeze()
With Range("E3:E12")
.FormulaR1C1 = "=RC[-2]*RC[-1]" '数量×単価
.Value = .Value '結果を値に固定
End With
Range("E3:E12").NumberFormatLocal = "#,##0"
End Sub
VB- ポイント:
- 安定: 計算後に値固定すると再計算しない分、動作が軽くなります。
- 見た目整形: 表示形式は別途設定。
応用:別範囲へ「値でコピー」する
Sub CopyAsValuesToAnotherRange()
Dim src As Range, dst As Range
Set src = Range("C3:D12")
Set dst = Range("H3").Resize(src.Rows.Count, src.Columns.Count)
'値だけ移す(式は移さない)
dst.Value = src.Value
End Sub
VB- ポイント:
- 複製: 元の式は残しつつ、結果だけ別の場所に出力。
高速・安全テンプレート
Sub ConvertFastSafe()
Dim rg As Range
Set rg = Range("A1").CurrentRegion '表全体
Application.ScreenUpdating = False
rg.Value = rg.Value
Application.ScreenUpdating = True
End Sub
VB- ポイント:
- 高速: 画面更新オフでちらつき減、体感速度アップ。
- 範囲選定: CurrentRegion なら見出し付きの表に相性が良い。
例題で練習
例題1:売上金額(E列)だけ値に変換
Sub Example_FreezeAmounts()
Dim last As Long
last = Cells(Rows.Count, "E").End(xlUp).Row
Range("E3:E" & last).Value = Range("E3:E" & last).Value
MsgBox "E列の金額を値に固定しました。"
End Sub
VB例題2:シート全体の数式を値にして軽量化
Sub Example_FreezeSheet()
With ActiveSheet.UsedRange
.Value = .Value
End With
MsgBox "このシートの数式をすべて値に変換しました。"
End Sub
VB例題3:“数式セルだけ”選んで値に変換
Sub Example_FreezeOnlyFormulaCells()
Dim tgt As Range, f As Range
Set tgt = Range("B3:H200")
On Error Resume Next
Set f = tgt.SpecialCells(xlCellTypeFormulas)
On Error GoTo 0
If Not f Is Nothing Then f.Value = f.Value
End Sub
VB実務の落とし穴と対策
- 元に戻せない:
- 対策: 変換前にバックアップを取るか、元式の生成マクロを残す。
- 再計算が必要な表で値化すると困る:
- 対策: “提出用コピー”に対して値化する。元データは式を維持。
- 範囲が広すぎて上書き事故:
- 対策: UsedRange/CurrentRegion/明示範囲で対象を絞る。選択依存は慎重。
- 非連続範囲の扱い:
- 対策: SpecialCells(xlCellTypeFormulas)のAreasをループ処理。
- 貼り付けで書式が変わる:
- 対策: .Value = .Value は書式を維持。PasteSpecialを使う場合は用途に応じて貼り付け種別を選ぶ。
