- ベストアンサー
エクセル:イベントが書かれたシート名を取得したい
シート[Sheet1]に値が入力された時、 (1)その入力された値(というか"Target") (2)Targetが入力されたシート名 を持って、SheetInputというプロシージャへ飛ぶ、というコードをSheet1に書きました。 (シートを右クリックして「コードの表示」を選択して出てくるところに) Private Sub Worksheet_Change(ByVal Target As Range) Dim SName As String SName = ActiveSheet.name SheetInput Target, SName '(1)Target、(2)SName End Sub 「シート[Sheet1]に値が入力された時」に動き出すイベントなのだから、 (2)は必ず「Sheet1」ですが、シート名が変わってもこのコードをそのまま使えるように、 SName = ActiveSheet.name と書いていました。 しかし、 別のマクロ上で「Sheet1に値を書き込む」と書いた結果としてこのSheet1のWorksheet_Changeイベントが動いた場合は、 SNameが「Sheet1」にならないことがあります。 それでもSName = "Sheet1"とは書きたくなく、 かつ、常に「このWorksheet_Changeイベントが書かれているシート名」を変数SNameに取得したいのですが、 このイベントが書かれているシート名を取得する関数はあるのでしょうか。 (伝わりますでしょうか?)
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 >それでもSName = "Sheet1"とは書きたくなく、 理由付けがなく、感覚的な表現なので、意図する部分がいまひとつですが、 SName = Me.Name に変えてみたらいかがでしょうか? >SNameが「Sheet1」にならないことがあります。 「Sheet1」にならないのは、ActiveSheet だからです。
その他の回答 (3)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 #3の回答者です。 >「そのシート[Sheet1]をコードごとコピーしてシート[Sheet1-1][Sheet1-2]を作成するマクロ」を組みたかったのです。 そうすると、VBAでは、同じ繰り返しを避ける習慣というのがありますから、#2さんのようなコードにするか、ThisWorkbook モジュールに書くかどちらかになります。 例: Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) If Sh.Name = "Sheet1" Or Sh.Name = "Sheet2" Then End If End Sub このSh というのが、シートのことです。
補足
回答ありがとうございます。 >そうすると、VBAでは、同じ繰り返しを避ける習慣というのがありますから、#2さんのようなコードにするか、ThisWorkbook モジュールに書くかどちらかになります。 「同じ繰り返しを避ける習慣」とはどのような意味でしょうか。 前回挙げて頂いたコードのように、 自分のシート名を記述したい場所に「Me.Name」を入れることで無事動作するようになりましたが、 今回やろうとしているマクロにおいて、この「Me.Name」では問題があるのでしょうか。
- KenKen_SP
- ベストアンサー率62% (785/1258)
SheetInput がどんな働きかわかりませんが、Target は Range ですから Parent プロパティーで"シートオブジェクト"を参照できます。 したがって、シート名を渡す必要はないかと。 ' // シートモジュール Private Sub Worksheet_Change(ByVal Target As Range) Call SheetInput(Target) End Sub ' // 標準モジュール Sub SheetInput(ByVal Target As Range) Dim Sh As Worksheet Set Sh = Target.Parent MsgBox "シート名は[" & Sh.Name & "]" MsgBox "Targetは[" & Target.Address & "]" Set Sh = Nothing End Sub
お礼
回答ありがとうございます。 返信が遅れて申し訳ありません。 >Parent プロパティーで"シートオブジェクト"を参照できます。 Targe.addressとか、Target.Valueとか、 Targetは(「Rangeは」かな)色々な値を引き出せて便利だと思っていましたが、 シート名も引き出せるんですね。 以降使ってみようと思います。
- imogasi
- ベストアンサー率27% (4737/17069)
>SNameが「Sheet1」にならないことがあります。 下記のようなことはいくらもあります。 Activateしてないシートに値の代入などできるから。 Sub test02() MsgBox ActiveSheet.Name Worksheets("Sheet1").Range("A8") = "WWW" MsgBox ActiveSheet.Name End Sub Sheet3をアクチブにして、実行すると Sheet3 Sheet3 とでます・ Sheet1のChangeイベントで Private Sub Worksheet_Change(ByVal Target As Range) MsgBox "aaa" MsgBox ActiveSheet.Name End Sub でSheet3とでます。 Sheet1のA6はWWWが入っています。 --- ですから Sub test01() MsgBox ActiveSheet.Name Worksheets("Sheet1").Activate ActiveSheet.Range("a3") = "WWW" MsgBox ActiveSheet.Name End Sub とすればどうですか。 >シート名が変わってもこの・・ でいうコードが、s明らかでないので正しいかどうか不安がありますが。 上記の場合Sheet3をアクチブにして実行しても Sheet3 Sheet1 Sheet1 と表示されます。当たり前といえば当たり前ですが。
補足
回答ありがとうございます。 返信が遅れて申し訳ありません。 Sheet1をアクティブにせずともSheet1に書込みが出来ることは理解できましたが、 最終的にどのように提案していただいたのがちょっとわかりません。 Worksheets("Sheet1").Activateと入れてみる、ということでしょうか。 シートのコードに、自分のシート名を記述している部分があり、 このシートの名前を変更する場合、コード内の「自分のシート名」の部分も同じように変更しないといけないので、 「自分シート名を取得する関数」があるなら欲しかったのです。
お礼
回答ありがとうございます。 返信が遅れて申し訳ありません。 >>それでもSName = "Sheet1"とは書きたくなく、 >理由付けがなく、感覚的な表現なので、意図する部分がいまひとつですが、 シート[Sheet1]に色々とコードを記述してSheet1上で動くマクロを作成し、 「そのシート[Sheet1]をコードごとコピーしてシート[Sheet1-1][Sheet1-2]を作成するマクロ」を組みたかったのです。 シート内に"Sheet1"と記述してしまうと、 シート[Sheet1]では動きますが、シート[Sheet1-1][Sheet1-2]では動かないので、 自分のシート名を取得する関数を知りたかったのですが、 伝わりましたでしょうか。 なお、挙げていただいたコードにて思ったように動きました。 変更部分も1箇所だけと理想的です。