VBAで複数のシートにまたがる処理を行う際には、まず「どのシートを操作するのか」を明確に指定する必要があります。これは、ユーザーが手作業でシートタブをクリックする操作に相当します。
VBAでシートを選択(アクティブ化)するには、主に**インデックス番号(左からの順番)**で指定する方法と、シート名で指定する方法があります。この記事では、それぞれの方法と、どちらを使うべきかという指針、そしてWorksheets
とSheets
の重要な違いを解説します。
方法1:インデックス番号(左からの順番)でシートを選択する
Excelのシートタブの、左からの順番を「インデックス番号」としてシートを指定する方法です。一番左のシートが1
、次が2
となります。
コードと解説
Sub SelectSheetByIndex()
' 1番目(一番左)のワークシートを選択します
ThisWorkbook.Worksheets(1).Select
' 選択したシートの名前を確認
MsgBox "1番目のワークシート「" & ActiveSheet.Name & "」を選択しました。"
End Sub
Worksheets(1)
: 1番目のワークシートを指します。.Select
: 指定したシートを選択(アクティブに)します。
✓ 注意点: この方法は、ユーザーがシートの順番をドラッグ&ドロップで入れ替えると、Worksheets(1)
が指すシートも変わってしまいます。そのため、意図しないシートを操作してしまう危険性があり、通常この方法の使用は推奨されません。
方法2:シート名でシートを選択する(推奨)
シートタブに表示されている名前を直接指定する方法です。シートの順番に影響されないため、最も安全で確実な方法です。
コードと解説
Sub SelectSheetByName()
Dim sheetToSelect As String
sheetToSelect = "売上データ" ' 例: 操作したいシート名を指定
On Error Resume Next ' シートが存在しない場合のエラーを回避
' 指定した名前のワークシートを選択します
ThisWorkbook.Worksheets(sheetToSelect).Select
' エラーが発生した場合(シート名が間違っているなど)の処理
If Err.Number <> 0 Then
MsgBox "「" & sheetToSelect & "」という名前のシートは見つかりませんでした。", vbCritical
Else
MsgBox "「" & sheetToSelect & "」シートを選択しました。"
End If
On Error GoTo 0 ' エラー処理を元に戻す
End Sub
Worksheets("売上データ")
: 「売上データ」という名前のワークシートを正確に指します。
この方法であれば、ユーザーがシートの順番を自由に入れ替えても、マクロは常に正しいシートを選択できます。
Worksheets と Sheets の違い
VBAには、シートの集まりを指すオブジェクトとしてWorksheets
とSheets
の2種類があります。
Worksheets
: ワークシート(セルがある通常のシート)のみを含みます。Sheets
: すべての種類のシート(ワークシート、グラフシート、古いマクロシートなど)を含みます。
通常は、セルを操作することがほとんどなのでWorksheets
を使えば問題ありません。しかし、グラフシートをアクティブにしたい場合など、ワークシート以外のシートも操作対象に含めたい場合は、Sheets
を使う必要があります。
Sub SelectAnySheet()
' ブック内の3番目の「シート」(種類を問わない)を選択
ThisWorkbook.Sheets(3).Select
' 選択したシートの種類を調べる
MsgBox "3番目のシート「" & ActiveSheet.Name & "」を選択しました。" & vbCrLf & _
"このシートの種類は " & TypeName(ActiveSheet) & " です。"
End Sub
まとめ
VBAでシートを選択する方法にはいくつかありますが、以下の指針で使い分けるのがベストです。
方法 | 構文 | 特徴 |
インデックス番号 | Worksheets(1) | 簡単だが、シートの順番が変わると誤動作するリスクがあるため非推奨。 |
シート名 | Worksheets("シート名") | 確実で、シートの順番に依存しないため強く推奨。 |
Sheets コレクション | Sheets(1) or Sheets("シート名") | グラフシートなど、ワークシート以外のシートも対象にしたい場合に必須。 |
Google スプレッドシートにエクスポート
結論として、マクロの安定性を保つために、原則としてシート名でシートを選択するように心がけましょう。