
シート[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に取得したいのですが、
このイベントが書かれているシート名を取得する関数はあるのでしょうか。
(伝わりますでしょうか?)
No.3ベストアンサー
- 回答日時:
こんばんは。
>それでもSName = "Sheet1"とは書きたくなく、
理由付けがなく、感覚的な表現なので、意図する部分がいまひとつですが、
SName = Me.Name
に変えてみたらいかがでしょうか?
>SNameが「Sheet1」にならないことがあります。
「Sheet1」にならないのは、ActiveSheet だからです。
回答ありがとうございます。
返信が遅れて申し訳ありません。
>>それでもSName = "Sheet1"とは書きたくなく、
>理由付けがなく、感覚的な表現なので、意図する部分がいまひとつですが、
シート[Sheet1]に色々とコードを記述してSheet1上で動くマクロを作成し、
「そのシート[Sheet1]をコードごとコピーしてシート[Sheet1-1][Sheet1-2]を作成するマクロ」を組みたかったのです。
シート内に"Sheet1"と記述してしまうと、
シート[Sheet1]では動きますが、シート[Sheet1-1][Sheet1-2]では動かないので、
自分のシート名を取得する関数を知りたかったのですが、
伝わりましたでしょうか。
なお、挙げていただいたコードにて思ったように動きました。
変更部分も1箇所だけと理想的です。
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 というのが、シートのことです。
この回答への補足
回答ありがとうございます。
>そうすると、VBAでは、同じ繰り返しを避ける習慣というのがありますから、#2さんのようなコードにするか、ThisWorkbook モジュールに書くかどちらかになります。
「同じ繰り返しを避ける習慣」とはどのような意味でしょうか。
前回挙げて頂いたコードのように、
自分のシート名を記述したい場所に「Me.Name」を入れることで無事動作するようになりましたが、
今回やろうとしているマクロにおいて、この「Me.Name」では問題があるのでしょうか。
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
回答ありがとうございます。
返信が遅れて申し訳ありません。
>Parent プロパティーで"シートオブジェクト"を参照できます。
Targe.addressとか、Target.Valueとか、
Targetは(「Rangeは」かな)色々な値を引き出せて便利だと思っていましたが、
シート名も引き出せるんですね。
以降使ってみようと思います。
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
と表示されます。当たり前といえば当たり前ですが。
この回答への補足
回答ありがとうございます。
返信が遅れて申し訳ありません。
Sheet1をアクティブにせずともSheet1に書込みが出来ることは理解できましたが、
最終的にどのように提案していただいたのがちょっとわかりません。
Worksheets("Sheet1").Activateと入れてみる、ということでしょうか。
シートのコードに、自分のシート名を記述している部分があり、
このシートの名前を変更する場合、コード内の「自分のシート名」の部分も同じように変更しないといけないので、
「自分シート名を取得する関数」があるなら欲しかったのです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【マクロ】実行時エラー '424':...
-
Access-VBAでExcelファイ...
-
コンボボックスへ降順に表示す...
-
Excell VBA にて配列に定数を代...
-
Excel UserForm の表示位置
-
「段」と「行」の違いがよくわ...
-
Excel グラフのプロットからデ...
-
エクセルVBA 配列からセルに「...
-
B列の最終行までA列をオート...
-
Excel VBAでのWorksheet_Change...
-
罫線の斜線を自動で引くマクロ
-
VBAマクロ実行時エラーの修正に...
-
VBAを使って検索したセルをコピ...
-
EXCELで最後の行を固定
-
LEFT関数とIF関数の組み合わせ...
-
あああ..ああい..ああう とい...
-
エクセル マクロ等を利用した各...
-
DataGridの列の数、行の数
-
マクロ実行後に別シートの残像...
-
セルの一部分だけを太字にする方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【マクロ】実行時エラー '424':...
-
エクセルのVBAについて教えてく...
-
エクセルVBAでオブジェクトが必...
-
マクロのコマンドボタン《Activ...
-
エクセルで品番を入れると、そ...
-
excelのvbaでのシート指定が時...
-
Access-VBAでExcelファイ...
-
エクセルマクロ(超初心者)
-
コンボボックスへ降順に表示す...
-
エクセルを共有にすると、シー...
-
エクセルVBA 別シートの最終セ...
-
エクセルマクロで教えて下さい...
-
エクセル マクロについて、 Inp...
-
マクロのイベントトリガー
-
EXCELに関する質問
-
エクセルからメールを送るマク...
-
Excelマクロ 複数のシートそれ...
-
エクセルマクロ 変数をワーク...
-
Excell VBA にて配列に定数を代...
-
マクロ実行後、画面がちかちか...
おすすめ情報