ExcelのVBAでのちょっとしたことを備忘的に残していきます。今回はシートをシート名ではなくオブジェクト名で指定する話です。
sheetをシート名ではなくオブジェクト名で指定
マクロのコードの中で、処理対象のシートをシート名で指定するのが一般的かと思います。
しかし、シート名を変更するとマクロが動かなくなってしまいます。そこで、シート名ではなくオブジェクト名で指定することでシート名を変更しても該当のシートを指定できます。
シートのオブジェクト名を取得する
「シートオブジェクト.CodeName」でオブジェクト名を取得できます。
Sub Activesheetのオブジェクト名を取得()
Dim targetSheetName As String
'アクティブシートのブジェクト名を取得する
targetSheetName = ActiveSheet.CodeName
MsgBox targetSheetName
End Sub
シートのオブジェクト名を調べる
VBAの画面でシートのプロパティからオブジェクト名を確認することができます。
プロパティが表示されていないときは「表示」⇒「プロパティ ウィンドウ」で表示できます。
黄色マーカー部分がオブジェクト名、青マーカ―部分がシート名です。

このオブジェクト名はこのプロパティウィンドウで変更することが可能です。
なお、このオブジェクト名はシート名を変更しても変わることはありません。
シートをオブジェクト名で指定する
そのまま、「オブジェクト名.」でシートを指定することができます。
オブジェクト名での指定は常にVBAを書いたxlsmファイルのものが指定されます。
なので他のブックをactivateしてそのブックに同じオブジェクト名のものがあってもVBAの書いているブックのものが指定されます。
Sub オブジェクトでシートを指定()
オブジェクト名.Range("A1") = "test"
Workbooks("他のブック名.xlsx").Activate
オブジェクト名.Range("A2") = "test2"
End Sub
他のブックのシートをオブジェクト名で処理する
「Workbooks(“他のブック名.xlsx”).オブジェクト名」という指定はできずエラーになります。
他のブックのシートをオブジェクト名で指定するには少し工夫がいります。
一旦、オブジェクト名を使ってシート名を取得してから、そのシート名を使って処理をかけるというのが一つの方法です。
Sub 他のブックのオブジェクト名でシートを指定()
Dim tempSheetName As String
'他のオブジェクト名に対応するシート名を取得する
tempSheetName = Workbooks("他のブック名.xlsx").VBProject.VBComponents("オブジェクト名").Properties("name")
'取得したシート名を使って処理する
Workbooks("他のブック名.xlsx").Sheets(tempSheetName).Range("A1") = "test"
End Sub
一時的なシートを「temp」やパラメータを「パラメータ」という名前のシートにして、マクロを組んだ後で人に渡すときに「削除不可temp」などのようにシートを変更するとシート名でマクロを組んでいるとコード内のシート名を直す必要がでてきます
あらかじめ、シート名でシートを指定するのではなくオブジェクト名で指定しておくと、このような場合でもコードの修正が不要なので便利です。
コメント