VBAでシートの参照

投稿日: 2024年6月13日

VBAでワークシートの追加や削除、コピー、移動などの操作を行う場合は、Worksheetオブジェクトで対象となるワークシートを参照します。

ワークシートを参照する構文

オブジェクト.Worksheets(Index)
又は
オブジェクト.Worksheets(“シート名”)

ワークシートのインデックス番号は、常に左のワークシートから1、2、3………の順位なります。

シートをインデックス番号で参照する方法

Excelでは、ワークシートをその順序に基づいてインデックス番号で参照することができます。インデックス番号は1から始まり、ワークブックに追加された順に増加します。

実際の例
Sub ReferSheetByIndex()
    ' 1番目のシートを参照
    Dim ws1 As Worksheet
    Set ws1 = ThisWorkbook.Sheets(1)
    ws1.Range("A1").Value = "これは最初のシートです"

    ' 2番目のシートを参照
    Dim ws2 As Worksheet
    Set ws2 = ThisWorkbook.Sheets(2)
    ws2.Range("A1").Value = "これは2番目のシートです"
End Sub
シートの数を確認して参照する
Sub ReferSheetByIndexWithCheck()
    Dim ws As Worksheet
    Dim sheetIndex As Integer
    sheetIndex = 3 ' 例えば3番目のシートを参照したい場合
    
    ' シート数の確認
    If sheetIndex > 0 And sheetIndex <= ThisWorkbook.Sheets.Count Then
        Set ws = ThisWorkbook.Sheets(sheetIndex)
        ws.Range("A1").Value = "3番目のシートです。"
    Else
        MsgBox "シートのインデックス値が範囲外です。"
    End If
End Sub

シートの数が3個以上あれば3番目のシートのA1セルに「3番目のシートです。」となり3未満の場合はメッセージボックスに「シートのインデックス値が範囲外です。」とでます。

複数のシートをループで操作する

全てのシートを順番に操作する場合、ループを使ってインデックス番号でシートを参照することができます。

Sub LoopThroughSheetsByIndex()
    Dim i As Integer
    Dim ws As Worksheet
    
    ' 全てのシートを順番に参照
    For i = 1 To ThisWorkbook.Sheets.Count
        Set ws = ThisWorkbook.Sheets(i)
        ' 各シートのA1セルにそのシートのインデックス番号を入力
        ws.Range("A1").Value = "Sheet Index: " & i
    Next i
End Sub

シートをインデックスで参照するメリットと注意点

メリット

  • シート名が変更された場合でも、インデックス番号を使うことでコードが動作し続けます。

注意点
シートの順序が変更された場合、参照するシートが変わってしまう可能性があります。
インデックス番号は1から始まるため、存在しないインデックスを参照しないように注意が必要です。

このように、シートをインデックス番号で参照する方法は非常に便利ですが、適切に使用するためにはシートの順序や存在を確認することが重要です。

シート名でシートを参照する方法

シート名を使って特定のシートを参照する場合、Sheetsコレクションにシート名を指定します。これにより、シートの順序やインデックス番号に依存せずにシートを操作できます。

実際の例
Sub ReferSheetByName()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("Sheet1")
    
    ' シートのA1セルにデータを書き込む
    ws.Range("A1").Value = "Hello, Sheet1!"
End Sub

シート名での参照を使った操作の例

以下に、シート名を使ったさまざまな操作の例を示します。

シート名でデータを書き込む
Sub WriteDataToSheetByName()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("Sheet1")
    
    ' セルA1にデータを書き込む
    ws.Range("A1").Value = "Hello, World!"
    
    ' セルB1にデータを書き込む
    ws.Cells(1, 2).Value = "Welcome to VBA!"
End Sub
シート名でデータを読み込む
Sub ReadDataFromSheetByName()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("Sheet1")
    
    ' セルA1からデータを読み込む
    Dim data As String
    data = ws.Range("A1").Value
    
    ' 読み込んだデータを表示する
    MsgBox "The value in A1 is: " & data
End Sub
シート名を使ったエラーハンドリング

シート名が存在しない場合にエラーを回避する方法も重要です。以下に、シート名が存在しない場合のエラーハンドリングを含む例を示します。

Sub ReferSheetByNameWithErrorHandling()
    Dim ws As Worksheet
    Dim sheetName As String
    sheetName = "Sheet1"
    
    On Error Resume Next
    Set ws = ThisWorkbook.Sheets(sheetName)
    On Error GoTo 0
    
    If ws Is Nothing Then
        MsgBox "Sheet " & sheetName & " 存在しない。"
    Else
        ' シートが存在する場合の操作
        ws.Range("A1").Value = "シートが存在します!"
    End If
End Sub

シート名を使うメリットと注意点

メリット

  • シート名が明確であるため、コードの可読性が向上します。
  • シートの順序やインデックス番号が変更されても、シート名で正確に参照できます。

注意点
シート名を変更すると、そのシートを参照するコードも更新する必要があります。
シート名のスペルミスに注意が必要です。スペルミスがあるとエラーが発生します。

これらの例を参考にして、シート名を使ったVBAコードを作成することができます。

高度なシート参照の方法

シート名を変数で管理

シート名を変数に格納し、必要に応じて変更することができるようにします。これにより、複数のシートを簡単に操作できます。

Sub ReferSheetByVariable()
    Dim ws As Worksheet
    Dim sheetName As String
    sheetName = "Sheet1"
    
    Set ws = ThisWorkbook.Sheets(sheetName)
    ws.Range("A1").Value = "Hello, " & sheetName & "!"
End Sub
ループを使ったシート操作

複数のシートに対して同じ操作を行う場合、ループを使用します。

Sub LoopThroughSheets()
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Sheets
        ws.Range("A1").Value = "Sheet name: " & ws.Name
    Next ws
End Sub
ディクショナリを使ったシート管理

VBAのディクショナリを使ってシートを管理することで、シート名をキーにしてシートオブジェクトを効率的に参照できます。

Sub UseDictionaryForSheetManagement()
    Dim ws As Worksheet
    Dim sheetDict As Object
    Set sheetDict = CreateObject("Scripting.Dictionary")
    
    ' シートをディクショナリに追加
    For Each ws In ThisWorkbook.Sheets
        sheetDict.Add ws.Name, ws
    Next ws
    
    ' シート名で参照
    Dim sheetName As String
    sheetName = "Sheet1"
    
    If sheetDict.Exists(sheetName) Then
        Set ws = sheetDict(sheetName)
        ws.Range("A1").Value = "Hello, " & sheetName & "!"
    Else
        MsgBox "Sheet " & sheetName & " ディクショナリに存在しません。"
    End If
End Sub

これらの方法を組み合わせることで、より柔軟で効率的なVBAコードを作成することができます。特定の状況に応じた最適な方法を選択してください。

記事