« 暗号化属性の一括解除 | トップページ | 毛利元就 全五巻 読破! »

[エクセル] RangeオブジェクトのFormula/Value/Textプロパティ

ExcelVBAのRangeオブジェクトのよく似たプロパティ3つの違い。メモ。

・プロパティ
.Formula
.FormulaR1C1
.Value
.Value2
.Text

・結果1 (数式/数値)
=SUM(A10:A11)
=SUM(R[-2]C:R[-1]C)
10000
10000
10,000

・結果2 (日付)
38113.7673611111
38113.7673611111
2004/05/06 18:25:00
38113.7673611111
2004/5/6


●数式系 Formula/FormaulaR1C1
 基本的に、数式をそのまま設定/取得のためのプロパティ。値の設定も可能。
 A1形式/R1C1形式。
 FormulaLocal/FormulaR1C1Local は、インターナショナルな人の為のプロパティ。

●値系 Value/Value2
 数値や文字をそのまま設定/取得の為のプロパティ。
 Value2の使い道は、セルの書式設定が日付/通貨の時のみ、意味あり。
 この場合、Value2はDouble(倍制度浮動小数点)型で値を返してくる。

●文字列 Text
 Excelの表示書式にしたがって、文字列として返してくるプロパティ。読み取り専用。設定不可。


※プログラム中で値を設定する場合は、型宣言した変数に格納した値を .Value に入れてやるのが無難?

関連リンク:VBAestに学べ ExcelVBA上級テクニック モーグスキルアップ講座

|

« 暗号化属性の一括解除 | トップページ | 毛利元就 全五巻 読破! »

「VBA」カテゴリの記事

「エクセル」カテゴリの記事

「パソコン・インターネット」カテゴリの記事

コメント

古い記事に恐縮ですが、

>  FormulaLocal/FormulaR1C1Local は、インターナショナルな人の為のプロパティ。

これは逆ではないでしょうか?
Fomulaはベースとなっている"英語版"専用で、FomulaLocalは"各国語版"専用です。
後者はどの言語版Excelで実行しているかにより結果が異なりますが、前者はすべての言語版Excelで共通(英語表記)です。

日本語版Excelを利用している場合、Excel上でユーザーが目にしたり記述しているものは、FomulaLocalのものです。

FomulaLocalが受け付ける記述方法はExcelのローカライズ(言語)によって変化します。
例えば日本語版Excelでは色設定を [赤] と日本語で記述しますが、その他の言語版Excelには通用しません。
英語版では [Red] と記述し、逆にこの [Red] の記述は日本語版では通用しません。

一方Formulaは常に英語版の表記法を受け付けます。
日本語版でもFormulaであれば [Red] の 表記を受け付けます。逆に [赤] の表記を受け付けません。
このように、どの言語版でも同一の文字列(英語表記)を指定できるのがFormulaのメリットですが、
日本人にとって馴染みのある表記法を受け付けないのが問題です。

通常、VBAコードから利用する場合はFomulaではなくFomulaLocalのほうを使うべきです。
例えばユーザーに直接文字列を書かせると、それはFormulaLocal用の記述になるだろうということです。
またVBA制作者にとってもすんなりと書いたり読んだり出来るのは日本語版の表記法であり、
英語版の表記法では可読性の低下やスペル間違い、単語の勘違いなど等でよけいな問題を引き起こします。

複数の各国語版Excelで同様に動作する事を求められる場合は、Fomulaを英語表記で利用することになります。
つまり、インターナショナルなVBAコードを要求されたときに必要なのは、むしろFormulaのほうだと言えるのではないかと。

投稿: h7 | 2011年1月15日 (土) 午後 07時07分

確かにおっしゃる通りかもしれません。

ヘルプを参考に見てみましたが、
・Formula = コード記述時の言語で設定
・FormulaLocal = コード実行時の言語で設定
となっていて、僕の理解では、
・Formula = 開発環境=日本語
・FormulaLocal = 実行環境=日本語や英語やいろいろ
と思ってました。

実際にやってないので、きっと、実行されてるだろうh7さんの正しそうです。後で検証してみます。

投稿: SHIGE | 2011年1月17日 (月) 午後 07時51分

申し訳ないです、勘違いでNumberFormatについて説明してました。
Formulaの場合でも意図する事は同じですが、例をいくつか挙げ直しておきます。

Sub test()
  Range("B1").Formula = "=JIS(""hankaku#$%&"")"
  Range("B2").FormulaLocal = "=JIS(""hankaku#$%&"")"
  Range("C1").Formula = "平成23年1月18日"
  Range("C2").FormulaLocal = "平成23年1月18日"
End Sub

例えばJISというワークシート関数があります。これはいわゆる半角を全角に変換するものですが日本固有の関数のひとつです。
この関数はFormulaへ入力すると関数が見つからないというエラー(#NAME?)になります。
またFormulaには先頭に=を付けない事でValueと同じように値を直接入力することが出来ますが、文字列"平成23年1月18日"をFormulaへ入力すると単なる文字列のままですが、FormulaLocalに入力すると(Excelの実際の挙動がそうであるように)文字列ではなくDate型の数値へ自動変換されるとともに表示形式"G/標準"によって「平成○年○月○日」の表示設定が適用されます。
(ValueにはValueLocalが存在しませんが、動作としてはValueLocal相当と思われます。インターナショナルなVBAコードを書くなら場合によってはValueを禁止しその代用としてFormulaを使う必要が出てくるかもしれません)

ほかにも英語版各国語版ともに同じ関数が存在しても、その値の解釈方法が異なる場合があるようです。
つまるところ、Formulaはまさに英語版の数式そのものです。逆にFormulaLocalはまさしく日本語版の数式そのものの挙動を示しています。
他の○○Localが存在する関数でも、Excel自身が内部的に呼び出しているのはLocal側であると考えられます。
意図的に使おうとするのでなければ、とりあえず○○Localを使うべきだ、という事ですね。

> ヘルプを参考に見てみましたが

MSDNの解説やヘルプなどMS公式文書でも混乱するような説明がたまにあるのですが、大元の文書は英語で書かれており、それを日本語に翻訳した際に奇妙な言い回しに変化している場合があります。今回のもこれに当たるのではと。
特に私も○○と○○Localの差異の説明は難解で、しかも詳細には触れず簡潔に済まされていることが多く困った経験が多々あります。
(おそらく英語版ではどちらもまったく同じ動作ですので、英語圏の人はこの問題の重要さについて正しく認識してないでしょう。たとえMS本社内であっても)

この場合の「コード記述時の言語で設定」という言い回しは、SHIGEさんのような解釈が一般的にも正しいと思いますが、実際の挙動はそうではありません。当初私も「なるほど使用者の母国語を基準に考えてくれてるのかな、やるなMS。じゃあとりあえずFormulaを使えばいいのね」と考えていたところ間逆の動作をして慌てました。そもそも「記述時」と「実行時」とは一体いつを指しているのか甚だ不明ですが、実際MSは「英語が当たり前と考えており他国語は全部Local」と考えているという点は間違いありません。

この食い違いは、原文が「読み手が英語圏であることを大前提」に記述されているせいだと思われます。
VBAコードがそもそも英語ベースである事と執筆者の母国語が英語である事に依存した文書になっていた原文を、さらに日本語訳する際に誤訳した(または意訳時に勘違いした)のではないかと思っています。
実際の挙動と○○/○○Localというネーミングセンスからしてもスタンスとして「母国語(=英語)と他国語」という考え方が見て取れます。

元の説明は英語圏向け(あるいは社内向け・米国内向け)で「実行環境がなんであろうと、コードを記述する時に使ってるのと同じ言語(=母国語=英語)で設定しますよ」という意図だったのではないかと思っています。もしかしたらここで言う「コード記述時」とはVBAのことではなくてExcel開発時のことを指していたのかもしれません。それは当然ベースとなっている英語という事になりますね。本来この記述はMS社内向けの走り書きのようなものだったのかもしれません。

長々と失礼しました。

投稿: h7 | 2011年1月18日 (火) 午前 01時44分

丁寧なコメントありがとうございます。今度、記事書き換えときます。。。ヽ(´▽`)/

投稿: SHIGE | 2011年1月19日 (水) 午後 08時46分

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/44406/1157263

この記事へのトラックバック一覧です: [エクセル] RangeオブジェクトのFormula/Value/Textプロパティ:

« 暗号化属性の一括解除 | トップページ | 毛利元就 全五巻 読破! »