• ベストアンサー

エクセル:イベントが書かれたシート名を取得したい

シート[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に取得したいのですが、 このイベントが書かれているシート名を取得する関数はあるのでしょうか。 (伝わりますでしょうか?)

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんばんは。 >それでもSName = "Sheet1"とは書きたくなく、 理由付けがなく、感覚的な表現なので、意図する部分がいまひとつですが、  SName = Me.Name に変えてみたらいかがでしょうか? >SNameが「Sheet1」にならないことがあります。 「Sheet1」にならないのは、ActiveSheet だからです。

tktk1228
質問者

お礼

回答ありがとうございます。 返信が遅れて申し訳ありません。 >>それでもSName = "Sheet1"とは書きたくなく、 >理由付けがなく、感覚的な表現なので、意図する部分がいまひとつですが、 シート[Sheet1]に色々とコードを記述してSheet1上で動くマクロを作成し、 「そのシート[Sheet1]をコードごとコピーしてシート[Sheet1-1][Sheet1-2]を作成するマクロ」を組みたかったのです。 シート内に"Sheet1"と記述してしまうと、 シート[Sheet1]では動きますが、シート[Sheet1-1][Sheet1-2]では動かないので、 自分のシート名を取得する関数を知りたかったのですが、 伝わりましたでしょうか。 なお、挙げていただいたコードにて思ったように動きました。 変更部分も1箇所だけと理想的です。

その他の回答 (3)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんにちは。 #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 というのが、シートのことです。

tktk1228
質問者

補足

回答ありがとうございます。 >そうすると、VBAでは、同じ繰り返しを避ける習慣というのがありますから、#2さんのようなコードにするか、ThisWorkbook モジュールに書くかどちらかになります。 「同じ繰り返しを避ける習慣」とはどのような意味でしょうか。 前回挙げて頂いたコードのように、 自分のシート名を記述したい場所に「Me.Name」を入れることで無事動作するようになりましたが、 今回やろうとしているマクロにおいて、この「Me.Name」では問題があるのでしょうか。

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.2

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

tktk1228
質問者

お礼

回答ありがとうございます。 返信が遅れて申し訳ありません。 >Parent プロパティーで"シートオブジェクト"を参照できます。 Targe.addressとか、Target.Valueとか、 Targetは(「Rangeは」かな)色々な値を引き出せて便利だと思っていましたが、 シート名も引き出せるんですね。 以降使ってみようと思います。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.1

>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 と表示されます。当たり前といえば当たり前ですが。

tktk1228
質問者

補足

回答ありがとうございます。 返信が遅れて申し訳ありません。 Sheet1をアクティブにせずともSheet1に書込みが出来ることは理解できましたが、 最終的にどのように提案していただいたのがちょっとわかりません。 Worksheets("Sheet1").Activateと入れてみる、ということでしょうか。 シートのコードに、自分のシート名を記述している部分があり、 このシートの名前を変更する場合、コード内の「自分のシート名」の部分も同じように変更しないといけないので、 「自分シート名を取得する関数」があるなら欲しかったのです。

関連するQ&A

  • セルの値をワークシート名にする(エクセル2013)

    インストラクターのネタ帳さんより http://www.relief.jp/itnote/archives/003382.php 下記「セルの値をワークシート名にする?Worksheet_Change」 を拝借し利用させていただこうと思いましたが ---------------------- Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) On Error GoTo ERR_HANDLER If Target.Address(False, False) = "H1" Then ActiveSheet.Name = Range("H1").Value End If Exit Sub ERR_HANDLER: MsgBox "現在のH1セルの値はシート名にできません。" End Sub ---------------------- はそのまま出来るのですが、 H1セルにデータの入力規則:リストを指定しますと エラーとなりシート名が変わりません sheet1のリストA1:A50をsheet2のH1セルにリスト表示させ その表示名をそのままシート名に出来ませんでしょうか? ---------------------- Sub copy Range("H1").Copy Range("P1") End Sub ---------------------- Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) On Error GoTo ERR_HANDLER If Target.Address(False, False) = "P1" Then ActiveSheet.Name = Range("P1").Value End If Exit Sub ERR_HANDLER: MsgBox "現在のP41セルの値はシート名にできません。" End Sub ---------------------- としてH1のセルをP1にコピーしたものを指定して試しましたがやはりエラーとなり うまくいきませんでした。 全くの素人で恐縮ですがよろしくお願いいたします

  • Excel2010 イベントプロシージャが動かない

    VBAはほとんどいじったことのない初心者です。 イベントプロシージャをインターネットから探してきて、コピペして使おうとしてます。 Private Sub Worksheet_Change(ByVal Target As Range) On Error GoTo ERR_HANDLER If Target.Address(False, False) = "E2" Then ActiveSheet.Name = Range("E2").Value End If Exit Sub ERR_HANDLER: MsgBox "現在のE2セルの値はシート名にできません。" End Sub やりたいのは、セルE2の値に変更があったら、そのセルの値をシート名にしたいということです。 初心者には難しいでしょうか? ご教示いただけると幸いです。 よろしくお願いします。

  • Excel VBA イベントプロシージャを2つ記述する(基本です)

    基本的な事なのですが、Excelのイベントプロシージャで2つプログラムを作るにはどうやって記述すればよいのでしょうか? 具体的には、worksheetのchangeイベントで、セルC5の値を変えた時と、セルG7の値を変えた時の2通りのマクロを作成したいのです。 Private Sub Worksheet_Change(ByVal Target As Range) C5を変えた時の処理 End Sub Private Sub Worksheet_Change(ByVal Target As Range) G7を変えた時の処理 End Sub このように書けばよいのでしょうか?そうするとTargetがかぶっておかしくなる気がします。。 お願いします。

  • セルの値をファイル名にするには

    現在下記のマクロを入力しています。 Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$C$10" Then Target.Offset(-6, 2).Value = Date End If End Sub この時 ファイル名を SHEET1のA1 セルの値を利用してファイル名にするために下記の内容を入れてブックを保存したいと考えています。 上記のマクロが入っていないときは上手く行くのですが下記を追加するにはどうすればいいかご指導いただけませんでしょうか。 宜しく御願いします。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Row = 1 And Target.Column = 1 Then ActiveSheet.Name = Target.Value ThisWorkbook.SaveAs ThisWorkbook.Path & "\" & Target.Value End If End Sub

  • エクセルでマクロを使って新規シートを作成する方法を教えてください!(条件あります)

    初めて質問するのですが、エクセルで原紙シートのマクロまで全てをコピーして新規のシートを作成させるにはどうしたらいいですか? 新規のシートの特定のセルに入力した時に新規シートが作成されるようにできますか? 原紙は Private Sub Worksheet_Change(ByVal Target As Range) On Error Resume Next If Target.Address = "$A$1" Then ActiveSheet.Name = Target.Value End If End Sub のマクロが現在できあがってます。これを残しつつできますか?よろしくお願いします!

  • シート名の取得について

    お世話になります。 以下の様な記述で、追加したシート名を 取得したいのですが、 元々「sheet1」しかない所に追加しており、 追加されたシートは「sheet2」で、 アクティブにもなっているのですが、 コードネームを取得すると、何度やっても 「sheet1」になってしまいます。 どこがおかしいのか分からなく、 ご教示お願い致します。 Sub MACRO() Dim newsheet As Worksheet Dim mysheet As String Dim myrngf As Range Workbooks.Open Filename:="C:\使用量.xls" Set newsheet = Worksheets.Add mysheet = ActiveSheet.CodeName Set myrngf = Workbooks("使用量.xls").Sheets(mysheet).Range("a:a") ~処理内容~ Range("a:b").Columns.AutoFit End Sub

  • エクセルVBA/シートのチェンジイベントを発生させない方法?

    Private Sub Worksheet_Change(ByVal Target As Range) MsgBox "イベント発生" End Sub このワークシートがアクティヴになってるときに手入力された場合以外、チェンジイベントを発生させなくするにはどのような方法があるでしょうか? 標準モジュール記載の他のマクロでセルが変更された場合を無視したいのです。 よろしくお願いします。

  • エクセルVBAのイベントについて教えてください。

    エクセルVBA初学者のです。 "C9"にいれるとchangeイベントが発生するコードなんですが、 "C9"のほかに"D1"においてもchangeイベントを発生させたいのですが 下記のコードに続けて書いてもイベントが発生しないのですが どのように書けばよいのでしょうか? private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("C9")) Is Nothing Then Exit Sub Range("H14:H56").Interior.ColorIndex = 2 If Intersect(Target, Range("D1")) Is Nothing Then Exit Sub Range("G14:G56").Interior.ColorIndex = 2 End Sub よろしくお願いします。

  • Excelでシート名と最終更新日を自動表示したい

    Excelを使って (1)セルA1に入れた名目をシート名にし (2)セルH1には、最終更新日を自動で入れたいです。 調べた結果、 シート名を右クリックして「コードの表示」から (1)は Private Sub Worksheet_Change(ByVal Target As Range) Sheets(1).Name = Range("B1") End Sub を入れてうまくいきましたが、 (2)は Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)  If ThisWorkbook.Saved = False Then   Worksheets("Sheet1").Range("H1").Value = Date  End If End Sub を入れてみましたが(←調べましたもの) うまくいきませんでした。 単純に、 Private Sub Worksheet_Change(ByVal Target As Range) Sheets(1).Name = Range("B1") End Sub Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)  If ThisWorkbook.Saved = False Then   Worksheets("Sheet1").Range("H1").Value = Date  End If End Sub とつなげて入れるのではだめなんでしょうか? それとも、(2)の何かが間違っていますか? ご教授願います。

  • ブック内のシート名を右から取得したい

    Sub Sample() Dim s As Worksheet For Each s In Worksheets Debug.Print s.Name Next End Sub このコードを実行すると、左からシート名をひとつずつ取得しますが 右から取得して書き出すにはどうすればいいでしょうか?

専門家に質問してみよう