【VBA】エクセルシートを名前順にソートする(集計シートはソートから除外する)

各市町村の様式をエクセルブックに集めたとします。

県庁所在地の市を1番として、順番にソートしたくなる時があるときに使います。

様式を集めたエクセルブックを

ソートします。

Sub SortSheets(wb As Workbook, Optional jogaiSheetNum As Long = 0)
    
    Dim wsCount As Long
    wsCount = wb.Worksheets.Count

    Dim wsList() As Worksheet
    ReDim wsList(1 To wsCount)

    Dim i As Long
    Dim j As Long
    Dim swap As Worksheet
    
    For i = 1 To wsCount
        Set wsList(i) = wb.Worksheets(i)
    Next i
    
    'ワークシートを名前順に移動
    For i = jogaiSheetNum + 1 To wsCount - 1
        For j = i + 1 To wsCount
            If wsList(i).Name > wsList(j).Name Then
                Set swap = wsList(i)
                Set wsList(i) = wsList(j)
                Set wsList(j) = swap
            End If
        Next j
    Next i
    
    '並べ替え
    For i = jogaiSheetNum + 1 To wsCount
        wsList(i).Move After:=wb.Sheets(wb.Sheets.Count)
    Next i
    
End Sub

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 filePath As String
    filePath = SelectExcelFile()

    Dim wb As Workbook
    Set wb = Workbooks.Open(filePath)

    ' ワークシートを並べ替え
    ' 1番目のシートは並べ替え対象外
    Call SortSheets(wb, 1)

    ' ファイルを保存
    wb.Save

End Sub

Test()でSortSheets()を呼び出すとき、第2引数を1としたので、1番左のシートである「集計シート」がソートから除外されています。

第2引数を省略すればすべてのシートを対象にしてソートします。

使用頻度はそう高くないですが、集計した後の整形処理の1つとして、このプロシージャを1行加えることがたまにあります。

ChatGPTさんによる超詳細解説

Sub SortSheets(wb As Workbook, Optional jogaiSheetNum As Long = 0)

  1. Sub SortSheets(wb As Workbook, Optional jogaiSheetNum As Long = 0)
    • SortSheets というサブプロシージャは、指定されたワークブック (wb) 内のワークシートを名前順に並べ替えるために使用されます。jogaiSheetNum は省略可能な引数で、並べ替えから除外されるシートの数を指定します。
  2. Dim wsCount As Long
    • ワークシートの総数を格納するための変数 wsCount を宣言します。
  3. wsCount = wb.Worksheets.Count
    • 指定されたワークブック内のワークシートの総数を wsCount に代入します。
  4. Dim wsList() As Worksheet
    • ワークシートオブジェクトを格納するための配列 wsList を宣言します。
  5. ReDim wsList(1 To wsCount)
    • wsList 配列のサイズをワークシートの総数に合わせて設定します。
  6. Dim i As Long, Dim j As Long, Dim swap As Worksheet
    • ループカウンタ ij、そしてワークシートオブジェクトを一時的に格納する swap を宣言します。
  7. For i = 1 To wsCount
    • wsList 配列に各ワークシートを代入するためのループを開始します。
  8. Set wsList(i) = wb.Worksheets(i)
    • i 番目のワークシートを wsList 配列に代入します。
  9. Next i
    • ループの次のイテレーションに進みます。
  10. For i = jogaiSheetNum + 1 To wsCount – 1
    • ワークシートを名前順に並べ替えるためのネストされたループを開始します。最初の jogaiSheetNum 個のシートは並べ替えから除外されます。
  11. For j = i + 1 To wsCount
    • 内部ループで、i 番目のワークシートとそれ以降のワークシートを比較します。
  12. If wsList(i).Name > wsList(j).Name Then
    • ワークシート名をアルファベット順に比較し、必要に応じて交換します。
  13. Set swap = wsList(i)
    • 現在の i 番目のワークシートを一時的に swap に保存します。
  14. Set wsList(i) = wsList(j)
    • j 番目のワークシートを i 番目の位置に移動します。
  15. Set wsList(j) = swap
    • swap に保存されたワークシートを j 番目の位置に移動します。
  16. Next j, Next i
    • 内部ループと外部ループの両方の次のイテレーションに進みます。
  17. For i = jogaiSheetNum + 1 To wsCount
    • ワークシートを並べ替えた順序に基づいて、それらを移動するための新しいループを開始します。
  18. wsList(i).Move After:=wb.Sheets(wb.Sheets.Count)
    • 各ワークシートをワークブック

の最後に移動します。これにより、並べ替えられた順序が反映されます。

  1. Next i
    • ループの次のイテレーションに進みます。
  2. End Sub
    • SortSheets サブプロシージャの終了を示します。

Function SelectExcelFile() As String

この関数はファイル選択ダイアログを表示し、選択されたファイルのパスを返します。

Sub Test()

  1. Dim filePath As String
    • filePath という名前の変数を宣言します。これはファイルパスを保存するために使われます。
  2. filePath = SelectExcelFile()
    • SelectExcelFile 関数を呼び出して、選択されたExcelファイルのパスを filePath に格納します。
  3. Dim wb As Workbook
    • wb という名前のWorkbook型の変数を宣言します。
  4. Set wb = Workbooks.Open(filePath)
    • filePath で指定されたExcelファイルを開き、その参照を wb に設定します。
  5. Call SortSheets(wb, 1)
    • SortSheets プロシージャを呼び出して、ワークシートを名前順に並べ替えます。ここで、最初のシート(インデックス1)は並べ替えから除外されます。
  6. wb.Save
    • 変更を加えたワークブックを保存します。
  7. End Sub
    • Test サブプロシージャの終了を示します。

このコードは、ユーザーが選択したExcelファイルを開き、ワークシートを特定の順序に並べ替えた後、ファイルを保存するプロセスを自動化します。並べ替えの際、指定された数のシートは並べ替えから除外されます。

コメントを残す

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

CAPTCHA