更新日:、 作成日:

VBA セルの関数や数式を取得する (Range.Formula)

はじめに

Excel VBA マクロでセルの関数や数式を取得する方法を紹介します。

Range("B1").Formula または Cells(1, 2).Formula プロパティから、セル「B1」の関数や数式を取得できます。関数や数式が入力されていないときは、セルの値を取得します。

HasFormula メソッドから、セルに関数や数式が入力されているか判定できます。

関数や数式を入力するには「セルに関数や数式を入力する」をご覧ください。
セルを範囲指定するすべての方法は「セルを範囲指定して取得する」をご覧ください。

セルの関数や数式を取得する

Range の引数にセル名を指定すると、そのセルの関数や数式を取得できます。

セル「A1」の関数や数式を取得するには Range("A1").Formula を入力します。

Dim s As String
s = Range("A1").Formula
Debug.Print(s)

Cells の引数にセルの行と列の番号を指定すると、そのセルの関数や数式を取得できます。

行「2」、列「A」の関数や数式を取得するには Cells(2, 1).Formula を入力します。

Dim s As String
s = Cells(1, 1).Formula ' A1
s = Cells(2, 1).Formula ' A2
s = Cells(1, 2).Formula ' B1
s = Cells(2, 2).Formula ' B2
Debug.Print(s)

取得される値は、Excel の数式と同じ =数式 形式で取得されます。

1

ただし数式が設定されていないときは Value2 と同じ値を取得します。

Dim s As String
s = Range("A1").Value
s = Range("A1").Value2
s = Range("A1").Formula ' 数式が設定されていないときは Value2 と同じ値
Debug.Print(s)
Value と Value2 について詳しくは「セルの値を取得する」をご覧ください。

セルの範囲の関数や数式を取得する

セルの範囲「A3」~「B4」の関数や数式を取得するには Range("A3:B4").Formula または Range("A3", "B4").Formula を入力します。

値は (行, 列) の二次元配列が取得されます。最小インデックスは 1 からスタートします。受け取る変数の型を Variant 型にします。

Dim v As Variant
v = Range("A1:B2").Formula
v = Range("A1", "B2").Formula
Debug.Print(v(1, 1)) ' A1
Debug.Print(v(2, 1)) ' A2
Debug.Print(v(1, 2)) ' B1
Debug.Print(v(2, 2)) ' B2
2

数式が設定されていないセルは値が取得されます。

セルの範囲の値をまとめて取得または設定すると高速に操作できます。

詳しくは「高速化」をご覧ください。

セルに関数や数式が入力されているか

HasFormula から、そのセルに関数や数式が入力されているか判定できます。

セルに関数や数式が入力されているときは True を返します。それ以外のときは False を返します。

Dim v As Variant
v = Range("A1").HasFormula
Debug.Print(v)

セルの範囲を指定したときは、そのすべてのセルに関数や数式が入力されているときは True を返します。すべてに入力されていないときは False を返します。一部に入力されているときは Null を返します。

Dim v As Variant
v = Range("A1:B1").HasFormula
Debug.Print(v)

別シートの関数や数式を取得する

シートを指定するには Worksheets の引数にシート名またはインデックスを指定します。

Sheet1 を指定するには Worksheets("Sheet1") または Worksheets(1) を入力します。

sheet1
Dim s As String
' Sheet1 のセル「A1」の関数や数式を取得
s = Worksheets("Sheet1").Range("A1").Formula
s = Worksheets(1).Range("A1").Formula
Debug.Print(s)

' Sheet2 のセル「A1」の関数や数式を取得
s = Worksheets("Sheet2").Range("A1").Formula
s = Worksheets(2).Range("A1").Formula
Debug.Print(s)

Sheet1 に Range や Cells を入力すると、自身のシートのセルになります。自身を表す Me. が省略されています。

' どちらも同じコード
Range("A1").Value = "Sheet1"
Me.Range("A1").Value = "Sheet1"

標準モジュールに Range や Cells を入力すると、開いているシートのセルになります。アクティブシートを表す ActiveSheet. が省略されています。

' どちらも同じコード
Range("A1").Value = "アクティブ"
ActiveSheet.Range("A1").Value = "アクティブ"