「シート名を『売上』から『売上_2026』に変えたら、マクロが動かなくなった…」
こんな経験、ありませんか?私は何度もあります。経理の現場では、月や年度が変わるたびにシート名を変えることがよくあります。しかも、シート名を変えるのは自分ではなく、ファイルを使う他の人だったりします。
そこでおすすめなのが、シートを「オブジェクト名」で指定する方法です。オブジェクト名は、シートのタブに表示されている名前とは別に、VBAの中だけで使われる名前です。この記事では、文系経理の私が実際に使っている書き方を紹介します。
VBAでシートを指定する3つの方法
VBAでシートを指定する方法は、大きく分けて3つあります。
| 指定方法 | 書き方の例 | 動かなくなるとき |
|---|---|---|
| シート名 | Worksheets("売上").Range("A1") | シート名を変えたとき |
| インデックス番号 | Worksheets(1).Range("A1") | シートの並び順を変えたとき・シートを追加したとき |
| オブジェクト名 | 売上表.Range("A1") | VBEでオブジェクト名そのものを変えたときだけ |
シート名や並び順は、Excelの画面から誰でも変えられます。一方、オブジェクト名はVBE(VBAの編集画面)を開かないと変えられません。つまり、マクロを知らない人が普通に使っている限り、まず変わりません。これがオブジェクト名で指定するいちばんの理由です。
もう一つ、書くのが楽になるというメリットもあります。Worksheets("売上") と書かなくても、オブジェクト名をそのまま書けばシートを指定できます。入力中に入力候補(メンバーの一覧)も出るので、打ち間違いも減ります。
オブジェクト名の確認方法と変え方
- Alt+F11でVBEを開きます。
- 左側の「プロジェクトエクスプローラー」に、
Sheet1 (売上)のように表示されています。カッコの外がオブジェクト名、カッコの中がシート名です。 - 変えたいシートを選んで、下の「プロパティ」ウィンドウの「(オブジェクト名)」欄を書き換えます。プロパティウィンドウがないときはF4キーで表示できます。

初期値の「Sheet1」のままだと、何のシートか分かりません。「売上表」のように中身が分かる名前に変えておくのがおすすめです。日本語も使えます(先頭に数字や記号、スペースは使えません)。
今開いているシートのオブジェクト名は、次のマクロでも確認できます。CodeName がオブジェクト名のことです。
Sub アクティブシートのオブジェクト名を表示()
MsgBox "シート名:" & ActiveSheet.Name & vbCrLf & _
"オブジェクト名:" & ActiveSheet.CodeName
End Subオブジェクト名でシートを指定する
オブジェクト名を「売上表」に変えた場合の例です。
Sub オブジェクト名でシートを指定()
'シート名が「売上」でも「売上_2026」でも動く
売上表.Range("A1").Value = "テスト"
End Subこれだけです。タブのシート名を何に変えても、シートの並び順を入れ替えても、このマクロは同じシートに書き込みます。
ちなみに、私が試して「なるほど」と思ったのが次の動きです。
Sub 他のブックがアクティブでも大丈夫()
売上表.Range("A1").Value = "test1"
'別のブックをアクティブにする
Workbooks("他のブック名.xlsx").Activate
'それでもマクロを書いたブックの「売上表」に書き込まれる
売上表.Range("A2").Value = "test2"
End SubWorksheets("売上") と書くと、そのときアクティブなブックの「売上」シートを探しに行きます。別のブックに切り替わっていると、エラーになったり、同じ名前の別のシートに書き込んでしまったりします。オブジェクト名なら、必ずマクロを書いたブックのシートを指します。複数のブックを行き来する経理のマクロでは、これがかなり助かります。
注意:他のブックのシートはそのままでは指定できない
裏返すと、オブジェクト名をそのまま書けるのは、マクロを書いたブックのシートだけです。Workbooks("集計.xlsx").売上表 のような書き方はできません。
他のブックのシートをオブジェクト名で探したいときは、シートを順番に見て、CodeName が一致するものを探します。
Function オブジェクト名でシートを取得(wb As Workbook, objName As String) As Worksheet
Dim ws As Worksheet
For Each ws In wb.Worksheets
If ws.CodeName = objName Then
Set オブジェクト名でシートを取得 = ws
Exit Function
End If
Next ws
'見つからなければ Nothing が返る
End Function
Sub 他のブックのシートに書き込む()
Dim ws As Worksheet
Set ws = オブジェクト名でシートを取得(Workbooks("集計.xlsx"), "売上表")
If ws Is Nothing Then
MsgBox "オブジェクト名「売上表」のシートが見つかりません"
Exit Sub
End If
ws.Range("A1").Value = "test"
End Subこの方法は特別な設定をしなくても動きます。毎月届く同じ様式のファイルから値を集めるような場合に便利です。
もう一つ注意点として、他の人がオブジェクト名を変えてしまうと、やはりマクロは動きません。チームで使うファイルなら、「オブジェクト名は変えないでください」と一言伝えておくと安心です。
まとめ
- シート名や番号で指定すると、シート名の変更や並べ替えでマクロが動かなくなります。
- オブジェクト名はVBEでしか変えられないので、マクロが壊れにくくなります。
- オブジェクト名は「売上表」のような分かりやすい名前に変えておきましょう。
- そのまま書けるのはマクロを書いたブックのシートだけです。他のブックは
CodeNameで探します。
私も最初は Worksheets("シート名") ばかり使っていて、シート名が変わるたびにマクロを直していました。オブジェクト名を使うようになってからは、その手間がほとんどなくなりました。ちょっとした書き方の違いですが、長く使うマクロほど効いてきます。ぜひ試してみてください。


コメント