アプリ版:「スタンプのみでお礼する」機能のリリースについて

ExcelのVBAのご質問です。
マクロの自動記録にて、オートシェイプに他セル参照を入れ込みました
(つまり、オートシェイプを選択状態で数式バーに=A1などと入れ込んだ)。
すると、おそらくその部分に
ExecuteExcel4Macro "FORMULA(""=R1C1"")"
というプログラムが出て来るのですが、
・・・これはどう理解したら良いのでしょうか。

調べてみたのですが、ExecuteExcel4Macroというものの理解が
今いちできないのと(他シートのマクロを実行させる時に
使ったりするらしいという事しかわかりませんでした)

"FORMULA(""=R1C1"")"
についても、FORMULAというのはR1C1形式でなくA1形式の時に
使うものじゃなかったっけ? なぜ"が2つ?
などと混乱しています。
(=A1だからR1C1なので、A2ならR2C1だな、という事だけはわかる)

私の頭では、断片的な情報の統合ができず理解に苦しんでいます。
助けてくださる方いらしたらお願いいたします。

A 回答 (4件)

こんにちは、KenKen_SP です。



長文ですみません。できるだけわかり易く書こうと思ったのですが...
ご参考になれば。

> ・・・これはどう理解したら良いのでしょうか。

ご質問にあるシェープにリンクの数式を設定することは、現在の VBA にはそ
のメソッドが存在しないため不可能です。しかし、Excel 4.0 マクロにはその
命令が存在しました。それが FORMULA マクロ関数です。

  MS サポートオンライン [マクロを使おう - FORMULA 関数]
  http://support.microsoft.com/default.aspx?scid=k …

Excel 4.0 マクロは以前の Excel で使われていた、今で言う VBA に相当する
機能ですが、現在の VBA とは

  「考え方も記述方法も完全に”別物”」

です。ここで、

  Excel の幾つかのコマンドは、同等のコマンドが VBA 側で用意
  されていないため、ExecuteExcel4Macro メソッドを使って記録
  されることがある

と MSDN で見かけましたことがあります。正確な情報ソースを失念してしまっ
たのですが、

  ・VBA では実現できない
  ・Excel 4.0 マクロ関数の FORMULA なら実現可能
  ・では、FORMULA 関数を使おう

となって、 ExecuteExcel4Macro が記録されたのだと思います。

ExecuteExcel4Macro メソッドは、VBA ではない Excel 4.0 マクロのコマンド
を実行するためのメソッドです。

余談ですが、Excel 4.0 マクロは互換性のため現在の Excel にも搭載されて
おりますが、VBA が主流となり、MS も既に正式サポートしておりません。ず
いぶん前の話です。今となっては情報量が極端に少なく、また、いつまで使え
るのかも不透明なため、新たに覚える必要はないと思います。

しかし、ご質問の例のように現行 VBA で実現できないことが、Excel 4.0 マ
クロでは実現できたりして完全にニーズが消え去ったわけではないです^^;


> FORMULAというのはR1C1形式でなくA1形式の時に使うものじゃなかったっ
> け? なぜ"が2つ?

上述のように FORMULA は VBA の Formula プロパティーとは完全に別物です。
ここで、ExecuteExcel4Macro メソッドのヘルプを見てみます。

  ▼ [Excel2002 VBA Help - ExecuteExcel4Macro メソッド 引用]
  Excel 4.0 マクロ関数を実行し、関数の結果を返します。値の取得
  および設定が可能です。取得する型の種類は、対象の関数によって
  異なります。

  expression.ExecuteExcel4Macro(String)

  (略)

  String 必ず指定します。文字列型 (String) の値を使用します。
  Excel 4.0マクロ言語関数を等号 (=) なしで指定します。
  参照はすべて R1C1の文字列として指定する必要があります。
  また、引数 String 内で二重引用符 (") を使うときは、二重引用符
  を続けて記述してください。

  [引用終わり]

簡単に解説すると、実行する Excel 4.0 マクロ関数を「文字列」で指定しな
いといけないのです。これは VBA の ExecuteExcel4Macro メソッドの仕様で
すね。

あとは FORMULA 関数の仕様で、参照式もまた文字列で指定しないといけない
のですが、そうなると、文字列中に二重引用符 (")を使わなければなりません。

ここからは、VBA の記述方法の話になりますが、文字列中に”(二重引用符)
を使うときは、””と2つ続けます。これをエスケープする...と言います。
例えば、MsgBox で "aaa と表示したいとき、どうコーディングしたら良いで
しょうか?

MsgBox "aaa

ではコンパイルエラーですね...

MsgBox "aaa"

なら、エラーにはなりませんが、 aaa と表示されてしまいます。

MsgBox """aaa"

とすると表示できます。”はプログラムで使われる特別な記号なので、このよ
うな処理が必要なのです。
    • good
    • 0
この回答へのお礼

大変ありがとうございました。

よくわかりました。

4.0のマクロで、の意味だったとは・・・。
よく見るとヘルプにもそう書いてあるのに、
読んでも意味がわかりませんでした。
現在のVBAとまったく違うものだったという事も知りませんでした。
現在のVBAしか知らない(というかそれもあまり知らない)私が
FORMURAで悩んでもわからない訳ですね。

こんなに丁寧に説明していただけるとは思いませんでした。
重ねてお礼申し上げます。

お礼日時:2006/09/24 10:31

ueno88さん、横からの便乗質問失礼いたしまし。


ueno88さんの質問はKenKen_SPさんの回答で解決しているとは思いましたが、
オブジェクトにないプロパティが実行されるのがちょっと府に落ちませんでしたので
この場を借りて質問させていただきました。

KenKen_SPさんの仰るように、またueno88さんの感じているように
VBAが気を利かせて実行しているのだろうと思います。

今回は面白いことが分かりました。
興味ある質問をして下さったueno88さん、回答を下さったKenKen_SPさん、ありがとうございました。

これからも宜しくお願いいたします。
 
    • good
    • 0
この回答へのお礼

こちらこそ、よろしくお願いいたします。
締め切ります。

お礼日時:2006/09/24 23:49

> これでは拙いのでしょうか。



いえ、そんなことはありません。#2 でご提示いただいたコードで確かに
リンクを設定できるのですか。

実は、Selection というのは私はほとんど使いませんので、その実態と
いうか、「どんな風に使えるのか?」を良く分かってないのです。
勉強になりました。ありがとうございます。

少しコメントさせていただきます。

まず、Shape オブジェクトには Formula プロパティーがありません。
これはオブジェクトブラウザで確認しました。

ここからは推測になるのですが、VBA で用意されていないメソッドやプロ
パティーが実行されるはずもなく、

  Selection.Formula = "=B5"

というのは、VBA の実行過程で Excel 4.0 マクロをコールしている様な気
がします。これは、マクロの記録で同様の操作が、

  ExecuteExcel4Macro "FORMULA(""=R1C1"")"

と記録されることから推測したことです。この仮説が正しいのかどうかを
証明する術は、残念ながら私にはありません。
    • good
    • 0
この回答へのお礼

なるほど、ありがとうございます。
などと、すでに横合いから口を出しているような
かたちの質問者なのですが。大変興味深く拝見しています。

存在しないプロパティが実行される不思議。
不便だろうと思ってマイクロソフトがSelection.Formula = "=B5"
でも実行できるようにしてくれたんでしょうか。

でもこれじゃ、ヘルプから調べてSelectionにFormulaプロパティを
設定する事を思いつく事はできませんね。

お礼日時:2006/09/24 16:36

KenKen_SPさんの回答はいつも懇切丁寧、かつ的確ですのでとても参考になります。



今回の回答にちょっと気になるところがありましたので便乗質問させてください。

>シェープにリンクの数式を設定することは、
>現在の VBA にはそのメソッドが存在しないため不可能です

Sub Test()
 ActiveSheet.Shapes(1).Select
 Selection.Formula = "=B5"
End Sub

これでは拙いのでしょうか。
尚、回答の意図を読み違えていましたら平にご容赦願います。
 
 
    • good
    • 0
この回答へのお礼

ありがとうございました。

試してみました、・・・それでも実際動作は十分いけますね。
なぜわざわざExecuteExcel4Macroを使うかエクセル。
何か理由があるのかも知れませんが・・・もちろん私にはわかる訳もなく。

あ、ちなみに、私がここでひっかかっていた理由は、
R1C1形式でなくA1形式をとりたかった、という理由もあったのです。
そんな訳で、実際の問題解決のためにはそのものズバリの回答を
いただいた事になります。

今回の質問では、大変勉強になりました。ありがたいことです。

お礼日時:2006/09/24 14:40

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!