Excel VBA 逆引き集 | 数式を値に変換

Excel VBA
スポンサーリンク

数式を値に変換

共有前に「式を消して計算結果だけ残したい」「再計算を止めて軽くしたい」——そんな場面で使う“値貼り”の定番パターンを、初心者向けにわかりやすくまとめました。基本は「範囲.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を使う場合は用途に応じて貼り付け種別を選ぶ。
タイトルとURLをコピーしました