1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【ExcelVBA】Formulaプロパティの罠

Posted at

はじめに

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

image.png

テスト用プログラム

  • Formulaプロパティの挙動を確認するためのテストには、以下のコードを使用しました。
Formulaプロパティのテストコード
Sub Test_CopyFormula()
    With ThisWorkbook.Worksheets("Sheet1")
        .Range("B2:B3").Formula = .Range("A2:A3").Formula
    End With
End Sub

テスト結果

  • コピー先のセルには、数式(=3000*2)だけでなく値(6000)までコピーされてしまいました。

image.png

考察

  • APIリファレンスには「数式を取得または設定します」という趣旨の説明が書かれていましたが...
  • その下の「注釈」欄には、「セルに定数が入力されているときは、 Formula プロパティはその定数を返します。 セルが空のときは、空の文字列を返します。 セルに数式が含まれている場合、 formula プロパティは、数式バーに表示されるのと同じ形式 (等号 (=) を含む) の文字列として数式を返します。」と書かれていました。
  • つまり、Formulaプロパティの正しい挙動は、**「セルに数式が設定されていれば数式を返すが、セルに定数が設定されている時は定数を返す」**ということです。

まとめ

  • Formulaプロパティのバグではありませんでしたが、プロパティ名から想像できない動きをしていたのには驚きました。
  • セルに数式が設定されていない時は、空文字を返すものだと思っていました...
  • ちょっとした事が思わぬ不具合を生むので、手間を惜しまずに公式の情報を確認するのは大切だと実感させられました。
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?