各市町村の様式をエクセルブックに集めたとします。
県庁所在地の市を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 SubTest()でSortSheets()を呼び出すとき、第2引数を1としたので、1番左のシートである「集計シート」がソートから除外されています。
第2引数を省略すればすべてのシートを対象にしてソートします。
使用頻度はそう高くないですが、集計した後の整形処理の1つとして、このプロシージャを1行加えることがたまにあります。
ChatGPTさんによる超詳細解説
Sub SortSheets(wb As Workbook, Optional jogaiSheetNum As Long = 0)
- Sub SortSheets(wb As Workbook, Optional jogaiSheetNum As Long = 0)
SortSheetsというサブプロシージャは、指定されたワークブック (wb) 内のワークシートを名前順に並べ替えるために使用されます。jogaiSheetNumは省略可能な引数で、並べ替えから除外されるシートの数を指定します。
- Dim wsCount As Long
- ワークシートの総数を格納するための変数
wsCountを宣言します。
- ワークシートの総数を格納するための変数
- wsCount = wb.Worksheets.Count
- 指定されたワークブック内のワークシートの総数を
wsCountに代入します。
- 指定されたワークブック内のワークシートの総数を
- Dim wsList() As Worksheet
- ワークシートオブジェクトを格納するための配列
wsListを宣言します。
- ワークシートオブジェクトを格納するための配列
- ReDim wsList(1 To wsCount)
wsList配列のサイズをワークシートの総数に合わせて設定します。
- Dim i As Long, Dim j As Long, Dim swap As Worksheet
- ループカウンタ
iとj、そしてワークシートオブジェクトを一時的に格納するswapを宣言します。
- ループカウンタ
- For i = 1 To wsCount
wsList配列に各ワークシートを代入するためのループを開始します。
- Set wsList(i) = wb.Worksheets(i)
- 各
i番目のワークシートをwsList配列に代入します。
- 各
- Next i
- ループの次のイテレーションに進みます。
- For i = jogaiSheetNum + 1 To wsCount – 1
- ワークシートを名前順に並べ替えるためのネストされたループを開始します。最初の
jogaiSheetNum個のシートは並べ替えから除外されます。
- ワークシートを名前順に並べ替えるためのネストされたループを開始します。最初の
- For j = i + 1 To wsCount
- 内部ループで、
i番目のワークシートとそれ以降のワークシートを比較します。
- 内部ループで、
- If wsList(i).Name > wsList(j).Name Then
- ワークシート名をアルファベット順に比較し、必要に応じて交換します。
- Set swap = wsList(i)
- 現在の
i番目のワークシートを一時的にswapに保存します。
- 現在の
- Set wsList(i) = wsList(j)
j番目のワークシートをi番目の位置に移動します。
- Set wsList(j) = swap
swapに保存されたワークシートをj番目の位置に移動します。
- Next j, Next i
- 内部ループと外部ループの両方の次のイテレーションに進みます。
- For i = jogaiSheetNum + 1 To wsCount
- ワークシートを並べ替えた順序に基づいて、それらを移動するための新しいループを開始します。
- wsList(i).Move After:=wb.Sheets(wb.Sheets.Count)
- 各ワークシートをワークブック
の最後に移動します。これにより、並べ替えられた順序が反映されます。
- Next i
- ループの次のイテレーションに進みます。
- End Sub
SortSheetsサブプロシージャの終了を示します。
Function SelectExcelFile() As String
この関数はファイル選択ダイアログを表示し、選択されたファイルのパスを返します。
Sub Test()
- Dim filePath As String
filePathという名前の変数を宣言します。これはファイルパスを保存するために使われます。
- filePath = SelectExcelFile()
SelectExcelFile関数を呼び出して、選択されたExcelファイルのパスをfilePathに格納します。
- Dim wb As Workbook
wbという名前のWorkbook型の変数を宣言します。
- Set wb = Workbooks.Open(filePath)
filePathで指定されたExcelファイルを開き、その参照をwbに設定します。
- Call SortSheets(wb, 1)
SortSheetsプロシージャを呼び出して、ワークシートを名前順に並べ替えます。ここで、最初のシート(インデックス1)は並べ替えから除外されます。
- wb.Save
- 変更を加えたワークブックを保存します。
- End Sub
Testサブプロシージャの終了を示します。
このコードは、ユーザーが選択したExcelファイルを開き、ワークシートを特定の順序に並べ替えた後、ファイルを保存するプロセスを自動化します。並べ替えの際、指定された数のシートは並べ替えから除外されます。










コメントを残す