VBAで自動化 VBA一覧 セル・値の取得と貼り付け 取得

【VBA】数式の計算結果を取得する方法|Value・Value2で値を読み取る

Excel VBAでセルの値を取得するとき、対象セルに数式が入力されているケースは珍しくありません。

たとえば、セルC2に「=A2+B2」という数式が設定されていても、VBAで必要なのは数式そのものではなく、計算後の「1500」などの結果であることがあります。

このような場合は、ValueプロパティやValue2プロパティを使うことで、数式ではなく計算結果を取得できます。

ただし、Formulaプロパティとの違いや、再計算されていないセルを扱う場合など、数式セルならではの注意点もあります。

この記事では、VBAで数式の計算結果を取得する基本から、ValueとValue2の違い、実務で扱うときの考え方まで順番に解説します。

✅ VBAで数式の計算結果を取得する基本

VBAで数式が入力されたセルを扱うとき、最初に理解しておきたいのが「数式」と「計算結果」は別の情報であるという点です。ここを混同すると、取得した変数に「=A2+B2」が入ると思っていたのに数値が入ったり、反対に計算結果が欲しいのに数式を取得してしまったりします。特に既存ファイルをVBAで自動化するときは、セルに直接入力された値と数式によって算出された値が混在していることも少なくありません。

実務では、何を取得したいのかを先に決めてからプロパティを選ぶことが重要です。また、数式を取得する処理と計算結果を取得する処理では、その後の使い方も変わります。まずはこの違いを整理しておくと、後から処理を追加するときにも迷いにくくなります。

・数式ではなく計算後の値を取得する考え方

たとえば、セルA2に「100」、B2に「200」が入力され、C2に次の数式が設定されているとします。

=A2+B2

Excel上でC2に表示される計算結果は「300」です。

このC2には、大きく分けて次の2種類の情報があります。

  • 数式:=A2+B2
  • 計算結果:300

VBAでは、どちらを取得するかによって使用するプロパティが異なります。

取得したい内容主に使用するプロパティ
計算結果Value / Value2
セルに設定された数式Formula / FormulaR1C1
数式が設定されているかの判定HasFormula

今回の記事で扱うのは、ValueまたはValue2を使用して計算結果を取得する方法です。

数式そのものを書き換えたり取得したりするのではなく、「Excelが計算した結果をVBA側で利用したい」という場面を対象とします。

・Valueを使って数式の計算結果を取得する方法

最も基本的なのは、RangeオブジェクトのValueプロパティを使う方法です。

次のコードでは、「集計」シートのC2に入力されている数式の計算結果を取得します。

Sub GetFormulaResult()

    Dim ws As Worksheet
    Dim resultValue As Variant

    ' 取得対象のワークシートを明示する
    Set ws = ThisWorkbook.Worksheets("集計")

    ' C2の数式ではなく、計算後の値を取得する
    resultValue = ws.Range("C2").Value

    MsgBox "計算結果:" & resultValue

End Sub

この例でC2に「=A2+B2」が設定され、計算結果が300であれば、resultValueには数式文字列ではなく300が格納されます。

操作の流れとして整理すると、次のようになります。

  1. Worksheet型の変数wsを用意する
  2. ThisWorkbook.Worksheets("集計")で対象シートを明示する
  3. ws.Range("C2").Valueでセルの値を取得する
  4. 取得結果をresultValueへ格納する
  5. 必要な判定・転記・集計などに利用する

このコードでは、Range("C2").Valueだけで書くのではなく、対象となるWorkbookとWorksheetが分かる構成にしています。

短いマクロであれば省略しても動作する場合がありますが、実務では別のブックを開いたり、複数シートを処理したりすることがあります。対象を明示しておくことで、ActiveSheetが変わったことによる誤取得を防ぎやすくなります。

また、計算結果には数値だけでなく文字列などが入る可能性もあるため、基本例ではresultValueをVariant型にしています。


✅ VBAのValueとFormulaでは取得できる内容が異なる

数式セルをVBAで扱うときに誤解されやすいのが、ValueとFormulaの違いです。どちらもRangeオブジェクトから情報を取得するため、コードだけを見ると似ています。

しかし、Valueは計算された結果を取得するのに対し、Formulaはセルに設定されている数式を取得します。この違いを把握せずにプロパティを置き換えると、その後の条件判定や計算が正しく動かなくなることがあります。特に「セルに見えている内容を取得したい」という感覚だけでコードを書くと、表示値・内部値・数式を混同しがちです。数式を操作する処理と結果を利用する処理は役割を分けて考えるのが安全です。

・ValueとFormulaを比較して違いを確認する

違いを確認するために、同じセルからValueとFormulaの両方を取得してみます。

Sub CompareValueAndFormula()

    Dim ws As Worksheet
    Dim resultValue As Variant
    Dim formulaText As String

    Set ws = ThisWorkbook.Worksheets("集計")

    ' 計算後の値を取得
    resultValue = ws.Range("C2").Value

    ' セルに設定されている数式を取得
    formulaText = ws.Range("C2").Formula

    Debug.Print "計算結果:" & resultValue
    Debug.Print "数式:" & formulaText

End Sub

C2に「=A2+B2」が設定され、その計算結果が300の場合、取得する内容は次のように異なります。

計算結果:300
数式:=A2+B2

つまり、

ws.Range("C2").Value

数式をExcelで計算した結果を利用したい場合に向いています。

一方、

ws.Range("C2").Formula

どのような数式がセルに設定されているかを調べたり、その数式を別のセルへ設定したりする場合に使用します。

たとえば、計算結果が一定金額以上なら処理を実行するといったマクロでは、数式そのものではなくValueで取得した結果を使う必要があります。

ここでは計算結果と数式の違いを確認しましたが、VBAから数式そのものを設定する場合はFormulaR1C1を利用する方法もあります。特に、行ごとに参照位置が変わる数式をVBAから設定するときは、R1C1形式を理解しておくと処理を組み立てやすくなります。

👉 【VBA】FormulaR1C1の使い方|R1C1形式の絶対参照・相対参照と数式設定を解説では、数式を取得する側ではなく、VBAから数式を設定する方法を詳しく解説しています。

・数式セルと直接入力セルはValueなら同じように取得できる

Valueの便利な点は、セルが数式かどうかを毎回意識しなくても値を取得できることです。

たとえばA2に直接「100」が入力されている場合でも、

resultValue = ws.Range("A2").Value

とすれば100を取得できます。

C2に、

=A2*2

という数式があり、結果が200なら、

resultValue = ws.Range("C2").Value

によって200を取得できます。

つまりValueを利用する処理では、

直接入力された100 → 100を取得

数式によって計算された200 → 200を取得

というように、値が作られた過程にかかわらず結果を扱えます。

集計結果を別の処理へ渡したり、条件判定に利用したりするときには、この性質が非常に便利です。

ただし、「直接入力された値だけ処理したい」「数式セルだけ除外したい」という場合は話が変わります。その場合はValueだけでは判別できないため、HasFormulaなどを利用してセルの種類を確認する必要があります。

ValueやValue2では、直接入力された値と数式による計算結果のどちらも取得できます。一方、「数式が入力されているセルだけを処理したい」「直接入力された値と数式セルを区別したい」という場合は、HasFormulaプロパティによる判定が便利です。

👉 【VBA】セルが数式かどうか判定する方法|HasFormulaプロパティの使い方では、数式セルを判定して処理を分岐する方法を詳しく解説しています。


✅ VBAで数式結果を取得するValue2の使い方とValueとの違い

数式の計算結果を取得する方法を調べていると、ValueだけでなくValue2というプロパティを見かけることがあります。どちらを使っても数値や文字列を取得できるため、違いが分かりにくいポイントです。単純な数値だけを扱うコードでは結果が同じに見えることも多く、Value2を知らなくても処理自体は作成できます。

しかし、日付や通貨などを含むデータを扱うようになると、両者の違いを知っている方が処理の意図を明確にできます。特にセルから値を大量に読み込んでVBA内部で処理する場合は、どの形式で値を受け取るかを意識しておくことが重要です。実務でValueとValue2を使い分けられるよう、まず基本的な違いを確認しておきましょう。

・Value2で数式の計算結果を取得する方法

Value2を使う場合も、基本的な書き方はValueとほとんど変わりません。

Sub GetFormulaResultWithValue2()

    Dim ws As Worksheet
    Dim resultValue As Variant

    Set ws = ThisWorkbook.Worksheets("集計")

    ' C2の計算結果をValue2で取得する
    resultValue = ws.Range("C2").Value2

    MsgBox "計算結果:" & resultValue

End Sub

C2の数式の結果が300なら、resultValueには300が格納されます。

Value2はValueと異なり、Excelの通貨型や日付型として値を返す処理を行わず、基本的にセルが保持している値をそのまま取得します。

そのため、一般的な数値・文字列の取得だけでなく、セル範囲のデータをVBA側へ取り込んで処理するときにもよく利用できます。

一方で、「Value2の方が常に優れている」と考える必要はありません。

コードを作成するときは、取得した値をその後どのように利用するのかまで考えてプロパティを選択することが重要です。

・ValueとValue2は取得後の使い方を考えて選択する

ValueとValue2は、一般的な数値や文字列を取得するだけであれば、ほとんど同じように使用できます。

ただし、両者には日付や通貨などの扱いに違いがあります。

プロパティ特徴向いている場面
Valueセルの値を取得し、日付や通貨などを型として扱う場合があるExcel上の値を通常どおり扱いたい場合
Value2日付・通貨を特別な型として扱わず、基になる値を取得するVBA内部で値を処理する場合や配列へ取得する場合

たとえば、数式の結果を取得してそのまま条件判定や集計処理に使用するのであれば、Value2を選択する方法があります。

Dim resultValue As Variant

resultValue = ws.Range("C2").Value2

一方、既存コードがValueで統一されている場合に、理由なくすべてValue2へ変更する必要はありません。

実務では、単純に「どちらが優れているか」で決めるのではなく、取得した結果をその後どのように利用するのか、既存コードがどのような方針で作られているのかまで確認して選ぶことが大切です。


 

✅ VBAで複数セルの数式結果を配列へまとめて取得する

1セルだけならValueやValue2で簡単に取得できますが、実務では数百行、数千行の計算結果をまとめて処理することがあります。このとき、セルを1つずつ読み取るコードを安易に作ると、処理が長くなるだけでなく、データ量が増えたときに速度面でも不利になりやすくなります。

また、「配列に取得すると数式が入るのでは?」と誤解されることがありますが、Value2で範囲を取得すれば基本的には各セルの値を受け取れます。ExcelシートとVBAの間を何度も行き来するより、一度まとめて取得してVBA内部で処理する方が設計しやすいケースも多くあります。特に集計・判定・データ加工へつなげる場合は、この考え方を知っておくと処理の組み立て方が大きく変わります。大量データを扱う可能性がある場合は、1セルずつ取得する方法だけで終わらせず、一括取得も選択肢に入れておきましょう。

・複数セルの計算結果をValue2で一括取得する方法

たとえば、C2:C1000に数式が入力されており、その計算結果をVBAで処理するとします。

1セルずつ取得するのではなく、次のように範囲全体をVariant型の変数へ代入できます。

Sub GetFormulaResultsToArray()

    Dim ws As Worksheet
    Dim resultValues As Variant
    Dim rowIndex As Long

    Set ws = ThisWorkbook.Worksheets("集計")

    ' 数式の計算結果を配列へまとめて取得する
    resultValues = ws.Range("C2:C1000").Value2

    ' 取得した値をVBA内部で処理する
    For rowIndex = LBound(resultValues, 1) To UBound(resultValues, 1)

        If Not IsError(resultValues(rowIndex, 1)) Then
            Debug.Print resultValues(rowIndex, 1)
        End If

    Next rowIndex

End Sub

処理の流れは次のとおりです。

  1. 処理対象となる「集計」シートを取得する
  2. C2:C1000の値をresultValuesへ一括で読み込む
  3. 配列内をFor文で順番に確認する
  4. エラー値ではないデータを処理する

この書き方にしている理由は、Excelのセルを繰り返し参照する処理と、VBA内部でデータを処理する部分を分けるためです。

たとえば、次のようにセルを直接参照し続けることもできます。

For rowIndex = 2 To 1000
    Debug.Print ws.Cells(rowIndex, "C").Value2
Next rowIndex

少量のデータであれば、この方法でも問題になるとは限りません。

しかし、取得後に複数の判定や加工を行うのであれば、最初に対象範囲を配列へまとめて取得し、VBA内部で処理した方がExcelシートへのアクセス回数を減らせます。

また、resultValuesrowIndexのように役割が分かる変数名を使用しておくと、後から条件判定を追加するときにも処理内容を追いやすくなります。

・配列へ取得するときは二次元配列になる点に注意する

複数セルをValueやValue2でまとめて取得した場合、結果は基本的に二次元配列として扱います。

C2:C1000のように1列しか取得していなくても、

resultValues(rowIndex, 1)

のように行方向と列方向の2つの添字を指定します。

ここは実務でコードを修正するときに間違えやすいポイントです。

将来的に取得範囲を、

C2:E1000

へ広げる場合でも二次元配列の考え方は変わらないため、最初から行・列の位置を意識しておくと流用しやすくなります。

数式の計算結果を取得したあと、その値を別シートや別ブックへ残したいケースもあります。特に、元の数式を引き継がず「現在の計算結果だけを保存したい」という場合は、値として転記する方法を使い分けることが重要です。

👉 【VBA】値貼り付けでシート全体をコピーする方法|数式を値に変換して安全に転記では、数式を残さず計算結果だけをコピーする方法を実務目線で解説しています。


✅ VBAで数式結果がエラーの場合も安全に取得する

数式の結果を取得するときに見落としやすいのが、セルの計算結果が必ず正常な数値や文字列になるとは限らないことです。参照先の状態によっては「#N/A」「#DIV/0!」などのエラーが発生している場合があります。ValueやValue2を使ったからといって、これらのエラーが自動的に空白や0へ変換されるわけではありません。そのため、取得した値を文字列結合したり計算したりすると、想定外の実行時エラーにつながることがあります。

特に他部署が入力するファイルや外部データを参照するブックでは、常に正常な計算結果だけが存在する前提でコードを作るのは危険です。数式結果を自動処理へ利用するのであれば、取得方法だけでなくエラー値が存在する場合の扱いまで決めておくことが重要です。

・IsErrorで数式のエラー結果を判定する

計算結果にエラーが含まれる可能性がある場合は、IsError関数を利用して判定できます。

Sub GetFormulaResultSafely()

    Dim ws As Worksheet
    Dim resultValue As Variant

    Set ws = ThisWorkbook.Worksheets("集計")

    ' 数式の計算結果を取得する
    resultValue = ws.Range("C2").Value2

    ' エラー値かどうかを確認してから利用する
    If IsError(resultValue) Then
        MsgBox "C2の計算結果にエラーがあります。"
    Else
        MsgBox "計算結果:" & resultValue
    End If

End Sub

ここでresultValueをVariant型にしていることにも意味があります。

計算結果が数値だけとは限らず、文字列・空白・Excelのエラー値などが返る可能性があるためです。

実務ではエラーを検出した後に、

  • 処理対象から除外する
  • エラーが発生した行を記録する
  • 担当者へ確認を促す
  • 正常なデータだけ後続処理へ渡す

など、業務要件に応じて処理を分けます。

安易にすべて0や空文字へ置き換えてしまうと、本来確認すべきデータ異常を見逃す可能性があります。

「エラーだった場合に何をするか」まで決めておくことが、実務用マクロでは重要です。


✅ VBAで最新の数式結果を取得するときは再計算にも注意する

ValueやValue2を使えば数式の計算結果を取得できますが、「取得できた値=必ず最新の計算結果」と考えると問題になる場合があります。Excelでは計算方法の設定やマクロの処理内容によって、数式がまだ再計算されていないことがあるためです。

特に大量データを処理するマクロでは、処理速度を上げるために計算方法を手動へ切り替えているケースがあります。その状態で参照元を書き換え、すぐにValue2を取得すると、想定していた最新結果ではない可能性があります。ここでValueとValue2を変更しても、再計算そのものの問題は解決できません。計算結果を重要な判定に利用する場合は、「どのタイミングで計算された値なのか」まで意識しておく必要があります。

・計算結果を取得する前に更新状態を確認する

たとえば、マクロ内で数式の参照元となるセルを書き換え、その結果を利用する処理では、次のような流れになります。

Sub GetCalculatedResult()

    Dim ws As Worksheet
    Dim resultValue As Variant

    Set ws = ThisWorkbook.Worksheets("集計")

    ' 数式の参照元となる値を変更する
    ws.Range("A2").Value2 = 100
    ws.Range("B2").Value2 = 200

    ' 必要な範囲を再計算する
    ws.Range("C2").Calculate

    ' 再計算後の結果を取得する
    resultValue = ws.Range("C2").Value2

    MsgBox "計算結果:" & resultValue

End Sub

このコードでは、A2とB2を書き換えた後にC2を再計算し、その結果を取得しています。

重要なのは、Value2が再計算を実行するためのプロパティではないという点です。

Value2はあくまで値を取得するために使用し、再計算が必要かどうかは別に判断します。

すべてのマクロで毎回Calculateを実行する必要もありません。不要な再計算を繰り返せば、逆に処理時間が長くなる可能性があります。

数式の更新や再計算そのものを制御したい場合は、計算処理を担当するコードと、結果を取得するコードを分けて考えると保守しやすくなります。

ValueやValue2は計算結果を取得するためのものであり、数式の変更や再計算そのものを行う機能ではありません。参照元の変更後に数式を更新したい場合や、計算方法を含めて制御したい場合は、再計算の仕組みもあわせて理解しておくと安全です。

👉 【VBA】セルの計算式を更新する方法|数式変更・再計算を自動化する実務マクロでは、数式の変更から再計算までを実務向けに解説しています。


✅ VBAで数式の計算結果を取得するときの実務での使い分け

数式結果の取得はコード自体が短いため、ValueやValue2を指定すれば終わりと思われがちです。しかし実務では、「1セルなのか大量データなのか」「結果にエラーが含まれる可能性があるか」「取得前に再計算が必要か」によって適切な設計が変わります。

また、数式そのものが必要なのにValue2を使ったり、計算結果だけ欲しいのにFormulaを取得したりすると、後続処理が必要以上に複雑になります。セルから何を取得するのかを最初に明確にすることが、シンプルなコードを維持するポイントです。さらに大量データでは、セルを何度も読み取るより配列へまとめて取得した方が適しているケースがあります。処理の目的とデータ量を確認したうえで、必要以上に複雑にしない方法を選択しましょう。

・目的に応じて取得方法を選択する

今回の取得方法は、次のように整理できます。

やりたいこと選択肢
数式の計算結果を取得したいValue / Value2
VBA内部で値として処理したいValue2
数式そのものを取得したいFormula / FormulaR1C1
数式セルかどうか確認したいHasFormula
複数セルの結果を処理したいValue2で配列へ一括取得
エラー結果を安全に扱いたいIsErrorで判定
最新の計算結果が必要必要に応じて再計算してから取得

たとえば、「売上金額の計算列を取得して条件に合うデータだけ処理する」という用途なら、数式そのものを取得する必要はありません。

計算結果を配列へ取得し、VBA内部で判定する方が処理の目的を明確にできます。

一方で、「どのセルに数式が設定されているか調査する」のであれば、Value2では目的を満たせません。

数式を調べる処理と、数式から得られた結果を利用する処理は別物として考えることが大切です。

Excel上で繰り返し行っている集計結果の確認や転記が増えてきた場合は、値の取得だけでなく、VBA側で配列に取り込んで判定・加工・書き出しまで行う方法を覚えると、より大きな自動化にも発展させられます。

取得した計算結果は、条件判定や集計だけでなく、別のセルやシートへ書き込んで利用することもできます。「セルから値を取得する処理」と「取得した値を書き込む処理」を分けて理解しておくと、転記マクロやデータ加工にも応用しやすくなります。

👉 【VBA】代入した値をセルに書き込む方法|変数・文字列・数値・日付も一括解説では、変数へ格納した値をセルへ書き戻す基本から実務での使い方まで解説しています。


 

✅ まとめ:VBAで数式の計算結果を正しく取得しよう

VBAで数式の結果を取得する処理は一見単純ですが、数式そのものと計算結果の違い、ValueとValue2の特徴、エラー値や再計算まで理解しておくことで、より安全な処理を作成できます。

特に実務では、正常な数値だけが入っているとは限らないため、取得後の利用方法まで考えて設計することが重要です。大量の計算結果を扱う場合は、セルを1つずつ参照するだけでなく、配列への一括取得も有効な選択肢になります。反対に、小さな処理まで必要以上に複雑化する必要はありません。何を取得し、その値をどこで使うのかを基準に方法を選択すると、後から見ても理解しやすいコードになります。

  • 数式の計算結果はValueまたはValue2で取得できる
  • Formulaは計算結果ではなく数式そのものを取得する
  • Value2はVBA内部で値を扱う処理や配列への一括取得にも利用できる
  • 複数セルはValue2を使って配列へまとめて取得できる
  • 数式結果にはExcelのエラー値が含まれる可能性があるため、必要に応じてIsErrorで確認する
  • ValueやValue2は再計算を行う機能ではないため、最新結果が必要な場合は計算状態にも注意する
  • 数式の有無を調べたい場合はHasFormulaなど、目的に合った機能を使い分ける
  • 実務では「取得方法」だけでなく、取得後の判定・加工・転記まで見据えて設計する

まずは1セルの計算結果をValueまたはValue2で取得する基本を押さえ、データ量が増えてきたら配列への一括取得へ発展させるとよいでしょう。数式と計算結果を明確に区別できれば、既存のExcelファイルを利用した集計や判定処理も、より安全にVBAへ組み込めるようになります。

    -VBAで自動化, VBA一覧, セル・値の取得と貼り付け, 取得