【VBA】エクセルブックに特定の名前のシートがあるかどうかを判定し、ない場合は追加する

串刺し集計をするとき、

  1. 様式を1つのブックにまとめる
  2. 集計シートをつくる
  3. 串刺し集計する

この手順を踏むことになります。

②の処理をするコードを紹介します。

Function CheckSheetExists(wb As Workbook, sheetName As String) As Boolean
'指定したシート名が存在するかどうかを判定する

    Dim ws As Worksheet
    Dim sheetExists As Boolean

    '初期値をFalseに設定
    sheetExists = False

    For Each ws In wb.Sheets
        If ws.Name = sheetName Then
            sheetExists = True
            Exit For
        End If
    Next ws

    If sheetExists Then
        CheckSheetExists = True
    Else
        CheckSheetExists = False
    End If

End Function

Function SelectExcelFile() As String
    Dim filePath As String
    
    ' ファイルの選択ダイアログを表示し、ファイルパスを取得
    filePath = Application.GetOpenFilename("Excelファイル (*.xls; *.xlsx), *.xls; *.xlsx")
    
    ' ダイアログがキャンセルされた場合は処理を終了
    If filePath = "False" Then
        Exit Function
    Else
        SelectExcelFile = filePath
    End If

End Function

Sub Test()

    Dim wb As Workbook
    Dim filePath As String

    ' ファイルを選択
    filePath = SelectExcelFile()

    Set wb = Workbooks.Open(filePath)

    ' 集計シートがあるかどうかを判定
    If CheckSheetExists(wb, "集計") Then
        MsgBox "集計シートあり"
    Else
        MsgBox "集計シートがないので追加します。"
        Worksheets.Add before:=Worksheets(1)
        ActiveSheet.Name = "集計"
    End If
    
End Sub

CheckSheetExists()はブックと文字列を引数にとり、ブック内のシート内に引数の文字列と一致するシートがある場合はTrueを返します。

完全一致ではなく、「特定の文字列を含む」とする場合はこちらの記事を参照してください。

記事リンク

このマクロは本当に必要なのか

現実には集計シートがなければ自分で追加する方が早いです。

  1. 様式を1つのブックにまとめる
  2. 集計シートをつくる
  3. 串刺し集計する

①と③は別々にマクロを組んで②は自分でやるというのが実践的に最速だと思います。

①~③を1つのマクロにまとめて連続処理にしても処理時間はそう変わらないでしょう。

①と③を汎用性の高いものに仕上げた場合や、串刺し集計を何十件もする必要がある場合はこのコードは有用なものとなります。

ChatGPTさんによる超詳細解説

このコードは、特定のワークブック内に特定のシートが存在するかどうかをチェックし、存在しない場合に新しいシートを追加するためのマクロです。それぞれの部分について説明します。

Function CheckSheetExists(wb As Workbook, sheetName As String) As Boolean

  1. Function CheckSheetExists(wb As Workbook, sheetName As String) As Boolean
    • 指定されたワークブック (wb) 内に特定のシート名 (sheetName) が存在するかどうかをチェックする関数です。戻り値として Boolean 型(真または偽)を返します。
  2. Dim ws As Worksheet
    • ワークシートを参照するための変数 ws を宣言します。
  3. Dim sheetExists As Boolean
    • シートが存在するかどうかの結果を格納するための Boolean 型の変数 sheetExists を宣言します。
  4. sheetExists = False
    • sheetExists の初期値を False(存在しない)に設定します。
  5. For Each ws In wb.Sheets
    • 指定されたワークブックの全てのシートに対してループを実行します。
  6. If ws.Name = sheetName Then
    • 現在のシートの名前が引数で指定された sheetName と一致するかどうかを確認します。
  7. sheetExists = True
    • シート名が一致する場合、sheetExists を True に設定します。
  8. Exit For
    • 一致するシートが見つかった場合、ループを直ちに終了します。
  9. Next ws
    • 次のシートに進みます。
  10. CheckSheetExists = sheetExists
    • CheckSheetExists 関数の戻り値を sheetExists の値に設定します。

Function SelectExcelFile() As String

この関数はファイル選択ダイアログを表示し、選択されたファイルのパスを返します。ユーザーがキャンセルした場合は処理を終了します。

Sub Test()

  1. Dim wb As Workbook
    • ワークブックを参照するための変数 wb を宣言します。
  2. Dim filePath As String
    • ファイルパスを格納するための変数 filePath を宣言します。
  3. filePath = SelectExcelFile()
    • SelectExcelFile 関数を呼び出して、選択されたExcelファイルのパスを filePath に格納します。
  4. Set wb = Workbooks.Open(filePath)
    • filePath で指定されたExcelファイルを開き、その参照を wb に設定します。
  5. If CheckSheetExists(wb, “集計”) Then
    • CheckSheetExists 関数を使用して、ワークブック wb 内に “集計” という名前のシートが存在するかどうかをチェックします。
  6. MsgBox “集計シートあり”
    • シートが存在する場合は、メッセージボックスを表示してユーザーに通知します。
  7. Else
    • シートが存在しない場合の処理です。
  8. Worksheets.Add before:=Worksheets(1)
    • 新しいワークシートを追加し、最初の位置に配置します。
  9. ActiveSheet.Name = “集計”
    • 新しく追加されたシートの名前を “集計” に設定します

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA