- ベストアンサー
Excel VBAで関数の位置を取得する方法
- Excel VBAを使用して、関数の位置を取得する方法について教えてください。
- 関数内で「TypeName(Application.Caller)」を使用すると、「Double」や「Error」が返ってくるようです。
- 「No.720361 質問:Excel VBA でFunctionプロシジャがどのセルから呼び出されたか知る方法」という質問では、Application.Callerを使用して位置を取得しているようです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。maruru01です。 Testプロシージャを、以下のようにして、A2に、 「=Test()+A1」 としてみて下さい。 Function Test() As Double With Application.Caller Debug.Print .Row Debug.Print .Column Debug.Print .Address Debug.Print .Worksheet.Name End With Debug.Print TypeName(Application.Caller) Test = 2 End Function イミディエントウィンドウには、 2 1 $A$2 Sheet1(ここは実際のシート名) Range と出力されると思います。 Application.Callerプロパティは、Rangeオブジェクトを返します。 (だから、TypeName関数は「Range」を返すはずです。)
その他の回答 (1)
- maruru01
- ベストアンサー率51% (1179/2272)
>「Error」(私の実際の関数では「Double」)を返すのです。 私も確認しました。 ヘルプによると、Application.Callerプロパティは、呼び出された方法によって、セットされる値が違います。 で、プロシージャの実行中断時に、イミディエントウィンドウ上で呼び出されると、「Double」を返すようです。 ただし、何故「Double」かは分かりません。 また、実行中で無い時に、イミディエントウィンドウで呼び出すと、エラー(#REF!)を返すようです。 エラーはともかく、何故「Double」なんでしょうね。 他の方の回答をお待ち下さい。
お礼
なりました、ありがとうございました。 ですが、疑問が残りました。 というのは、上記関数内にブレイクポイントを設定し、 止まったときにイミディエイトウィンドウから、 「?TypeName(Application.Caller)」とすると 「Error」(私の実際の関数では「Double」)を返すのです。 私は、これで「Range」が返らない返らないと悩んでおりました。 イミディエイトウィンドウの「Double」は何なのでしょうか? また、どういった理由で違ったオブジェクトを返すのでしょうか? maruru01さま、あるいはどなたかよければ教えて下さい。よろしくお願いします。