シートを名前で選ぶ。並び順で選ぶ。オブジェクト名で選ぶ。
Excelには、Sheetsプロパティなるものがある。↓こちらによれば、
「コレクションから単一のオブジェクトを返します。」
とある。
docs.microsoft.com
必ずではないが、Sheetsのように末尾に複数形の「s」がついているものは、複数のものの「集まり」であると、個人的に理解している。
Sheetsも同様、たくさんある「Sheet」の集まりなわけで、その中から単一のオブジェクトを返す方法も幾つかある。
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プロパティで取得可能だ。
従がって例えば、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
この方式であれば、シート名を変更されても、シートの並び順が変わっても、任意のシートを指定できる。
オブジェクト名の指定が非推奨の場合があるかもしれませんが、そのような場合を除いては、お勧めの方式と思います。
参考まで。