• ベストアンサー

エクセルのユーザー定義関数で(VBA)

エクセルのVBAで、セルに「=SheetName」と書き込めば、その関数を書き込んだセルが属するシート名をセルに代入さるようなユーザー定義関数を作りたいと考えています。 で、標準モジュールに Public Function SheetName(test) SheetName = ????? End Function と、書き込んでふと止まりました。 ユーザー定義関数を書き込んだシートの名前ってどうやって取得すればいいのでしょうか?VBでいうSenderみたいなのってあるんでしょうか? どなたか?詳しい方教えて頂けないでしょうか? 宜しくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • izmlz
  • ベストアンサー率55% (67/120)
回答No.4

 「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」になっています。

Excel_VBA
質問者

お礼

ご指導有り難うございます。 私の目的は、この書き込みで解決しました。 本当に有り難うございます。 Avtivesheet.Nameでは、上手くいかないのでふと止まったので、今一度F2を押して、勉強しなきゃと思いました。 izmlzさんは、どのように勉強されてきたのですか?市販のVBA辞典では、勉強に限りがありますよね?

その他の回答 (11)

  • suz83238
  • ベストアンサー率30% (197/656)
回答No.1

Public Function SheetName() As String SheetName = ActiveSheet.Name End Function でセルに =SheetName() と入れればシート名は取得できます。

関連するQ&A