- ベストアンサー
エクセルのユーザー定義関数で(VBA)
エクセルのVBAで、セルに「=SheetName」と書き込めば、その関数を書き込んだセルが属するシート名をセルに代入さるようなユーザー定義関数を作りたいと考えています。 で、標準モジュールに Public Function SheetName(test) SheetName = ????? End Function と、書き込んでふと止まりました。 ユーザー定義関数を書き込んだシートの名前ってどうやって取得すればいいのでしょうか?VBでいうSenderみたいなのってあるんでしょうか? どなたか?詳しい方教えて頂けないでしょうか? 宜しくお願いいたします。
- みんなの回答 (12)
- 専門家の回答
質問者が選んだベストアンサー
「Avtivesheet.Name」で「ユーザー定義関数を書き込んだシートの名前」を表示させるのは、一見うまくいきそうですが、実際にはうまくいきません。以下を試してみてください。 標準モジュールに↓を入力してから、 Function SheetName() As String Application.Volatile SheetName = Application.Caller.Parent.Name End Function Function SheetName2() As String Application.Volatile SheetName2 = ActiveSheet.Name End Function Sheet1、Sheet2、Sheet3に↓をそれぞれ入力。 =SheetName() =SheetName2() Sheet1、Sheet2、Sheet3に↑をそれぞれ入力した直後は、どちらも正しく「ユーザー定義関数を書き込んだシートの名前」を表示しています。 でも、その状態から、Sheet1、Sheet2を見てみてください。 「=SheetName()」、すなわち、Application.Caller.Parent.Nameを使っている方は、正しく「ユーザー定義関数を書き込んだシートの名前」を表示しています。 一方、「=SheetName2()」、すなわち、ActiveSheet.Nameを使っている方は、Sheet1、Sheet2にもかかわらず、「Sheet3」と表示されてしまいます。 そのまま、Sheet1がアクティブな状態で、F9キーを押す(再計算させる)と、ActiveSheet.Nameを使っている方も正しくSheet1と表示されます。しかし、そうしてからSheet2、Sheet3を見ると、結果が「Sheet1」になっています。
お礼
ご指導有り難うございます。 私の目的は、この書き込みで解決しました。 本当に有り難うございます。 Avtivesheet.Nameでは、上手くいかないのでふと止まったので、今一度F2を押して、勉強しなきゃと思いました。 izmlzさんは、どのように勉強されてきたのですか?市販のVBA辞典では、勉強に限りがありますよね?