重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

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

A 回答 (4件)

こんばんは。



>それでもSName = "Sheet1"とは書きたくなく、
理由付けがなく、感覚的な表現なので、意図する部分がいまひとつですが、

 SName = Me.Name

に変えてみたらいかがでしょうか?

>SNameが「Sheet1」にならないことがあります。
「Sheet1」にならないのは、ActiveSheet だからです。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
返信が遅れて申し訳ありません。

>>それでもSName = "Sheet1"とは書きたくなく、
>理由付けがなく、感覚的な表現なので、意図する部分がいまひとつですが、

シート[Sheet1]に色々とコードを記述してSheet1上で動くマクロを作成し、
「そのシート[Sheet1]をコードごとコピーしてシート[Sheet1-1][Sheet1-2]を作成するマクロ」を組みたかったのです。
シート内に"Sheet1"と記述してしまうと、
シート[Sheet1]では動きますが、シート[Sheet1-1][Sheet1-2]では動かないので、
自分のシート名を取得する関数を知りたかったのですが、
伝わりましたでしょうか。

なお、挙げていただいたコードにて思ったように動きました。
変更部分も1箇所だけと理想的です。

お礼日時:2007/11/05 10:43

こんにちは。


#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」では問題があるのでしょうか。

補足日時:2007/11/05 11:30
    • good
    • 0

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
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
返信が遅れて申し訳ありません。

>Parent プロパティーで"シートオブジェクト"を参照できます。

Targe.addressとか、Target.Valueとか、
Targetは(「Rangeは」かな)色々な値を引き出せて便利だと思っていましたが、
シート名も引き出せるんですね。
以降使ってみようと思います。

お礼日時:2007/11/05 10:35

>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と入れてみる、ということでしょうか。

シートのコードに、自分のシート名を記述している部分があり、
このシートの名前を変更する場合、コード内の「自分のシート名」の部分も同じように変更しないといけないので、
「自分シート名を取得する関数」があるなら欲しかったのです。

補足日時:2007/11/05 11:18
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!