はじめに
ExcelVBAには、Range
オブジェクトにFormula
というプロパティがあります。
その名前の通り、セル(あるいは範囲)に設定されている数式を取得、もしくは数式を設定する時に使われます。
MicrosoftのAPIリファレンスには以下のように書かれていましたが、ある時にFormula
プロパティの挙動が不自然なことに気が付いたので、その挙動を確認してみることにしました。
オブジェクトの暗黙的に交差する数式を A1 形式の表記で表すバリアント型 (Variant ) の値を取得、または設定します。
Formulaプロパティのテスト
テストに利用した環境
- OS
- Windows 10 Home
- Excel
- Microsoft Office Personal 2013
テスト用データ
- テストに利用したデータは、以下のようにごく単純なものです。
- A2セルとA3セルには同じ値(式)が埋め込まれているように見えますが、実際に入っている値(式)は異なっています。
- A2セル:
=3000*2
- A3セル:
6000
テスト用プログラム
- Formulaプロパティの挙動を確認するためのテストには、以下のコードを使用しました。
Formulaプロパティのテストコード
Sub Test_CopyFormula()
With ThisWorkbook.Worksheets("Sheet1")
.Range("B2:B3").Formula = .Range("A2:A3").Formula
End With
End Sub
テスト結果
- コピー先のセルには、数式(
=3000*2
)だけでなく値(6000
)までコピーされてしまいました。
考察
- APIリファレンスには「数式を取得または設定します」という趣旨の説明が書かれていましたが...
- その下の「注釈」欄には、「セルに定数が入力されているときは、 Formula プロパティはその定数を返します。 セルが空のときは、空の文字列を返します。 セルに数式が含まれている場合、 formula プロパティは、数式バーに表示されるのと同じ形式 (等号 (=) を含む) の文字列として数式を返します。」と書かれていました。
- つまり、Formulaプロパティの正しい挙動は、**「セルに数式が設定されていれば数式を返すが、セルに定数が設定されている時は定数を返す」**ということです。
まとめ
-
Formula
プロパティのバグではありませんでしたが、プロパティ名から想像できない動きをしていたのには驚きました。 - セルに数式が設定されていない時は、空文字を返すものだと思っていました...
- ちょっとした事が思わぬ不具合を生むので、手間を惜しまずに公式の情報を確認するのは大切だと実感させられました。