シートを名前で選ぶ。並び順で選ぶ。オブジェクト名で選ぶ。

Excelには、Sheetsプロパティなるものがある。↓こちらによれば、
「コレクションから単一のオブジェクトを返します。」
とある。
docs.microsoft.com

必ずではないが、Sheetsのように末尾に複数形の「s」がついているものは、複数のものの「集まり」であると、個人的に理解している。
Sheetsも同様、たくさんある「Sheet」の集まりなわけで、その中から単一のオブジェクトを返す方法も幾つかある。
f:id:Infoment:20190615123102p:plain

1. シートの名前で指定する。

例えば、Sheet1を選択したい場合、次の記述となる。

Sheets("Sheet1").Select

「Sheets」という「Sheetの集まり」の中から、「Sheet1」という名前のシートを選択させている。
この方法では、Sheet1という名前のシートが存在しない場合、エラーになるのが
難点だ。回避策として、思いつく中から二つ例示する。

① エラーを無視する
 On Error Resume Next で、エラーを無視して処理させる。然るのちに、エラーが起きたのであれば報告させる。

Sub SheetSelectTest_1()
    On Error Resume Next
    Sheets("Sheet1").Select

    If Err.Number <> 0 Then
        MsgBox "Sheet1は存在しません。"
    End If
End Sub

② 選べたら、その場で作業をやめる。
 全てのシートを巡回して、名前が「Sheet1」だったらそれを選択したうえで終了する。無ければ終了できないので、最後の「ありませんでした」という報告をすることになる。

Sub SheetSelectTest_2()
    Dim Sh As Worksheet
        For Each Sh In Worksheets
            If Sh.Name = "Sheet1" Then
                Sh.Select
                Exit Sub
            End If
        Next
        MsgBox "Sheet1は存在しません。"
End Sub

エラーを起こさせて検知するというのは、個人的にはあまり好みではないので、自分がやるとしたら②かなと思う。

ところでこの「シートの名前を選択する」という方式は、シートの名前を第三者に変更された瞬間に、成立しなくなる。変更に強いマクロにしたい場合、別の方式を推奨する。

2.シートの順番を指定する。

例えばこのように指定すると、左から2番目のシートを指定したことになる。

Sheets(2).select

ただし、この方式には次の欠点がある。
① 指定したシートが非表示の場合、エラーになる。
② 第三者が勝手に並び順を変えてしまった場合、成立しない。

あくまで「左から何番目」という位置のみで示しているため、変更に弱い気がする。変更に強いマクロにしたい場合、別の方式を推奨する。

オブジェクト名で指定する。

各シートを特定するには、

  • シート名
  • 左からの並び順

以外に、オブジェクト名で指定することも出来る。オブジェクト名は、普段マクロをさわらない人にとって不可知の情報であり、シート名や並び順に比べて変更され難いと考える。このオブジェクト名は、CodeNameプロパティで取得可能だ。
f:id:Infoment:20190615124838p:plain
従がって例えば、Sheet1というオブジェクト名のシート以外を削除したい場合、このような記述で実現できる。

Sub SheetDeleteTest()
    Dim Sh As Worksheet
    Application.DisplayAlerts = False
        For Each Sh In Worksheets
            If Sh.CodeName <> "Sheet1" Then
                Sh.Delete
            End If
        Next
    Application.DisplayAlerts = True
End Sub

この方式であれば、シート名を変更されても、シートの並び順が変わっても、任意のシートを指定できる。

オブジェクト名の指定が非推奨の場合があるかもしれませんが、そのような場合を除いては、お勧めの方式と思います。

参考まで。