英語の教材を作っていて、ワークシートを名前順に並べ替えたいな、と思って作成。
シート名が「〇〇大学▽△年□番」と取り扱った問題番号を示しているけれども、どの大学のどれを処理するかはそのつど目についたものにしているのであとから見るとゴチャゴチャしている。そこでソートを掛けてみた。
ポイントは、現在選択しているシートを一番左に持ってくること。(たとえば[サマリー]なんてシートを選択しておく。)ついでにこのマクロのあるブックを裏で立ち上げておけば、別のブックでシート並べ替え作業を行えること。
Sub ワークシートソート()
Dim arr_wsName() As String
Dim 基準シート As String
Dim シート数 As Long
Dim ws As Worksheet
Dim ct As Long
Dim t As Long
基準シート = ActiveSheet.Name
シート数 = ActiveWorkbook.Worksheets.Count
ReDim arr_wsName(1 To シート数)
ct = 1
For Each ws In Worksheets
If ws.Name = 基準シート Then
arr_wsName(1) = ws.Name
Else
ct = ct + 1
arr_wsName(ct) = ws.Name
End If
Next
Call QuickSort1(arr_wsName, 2, シート数)
Worksheets(基準シート).Move before:=Sheets(1)
For t = 1 To シート数
Worksheets(arr_wsName(t)).Move after:=ActiveSheet
Worksheets(arr_wsName(t)).Activate '・・・(1)
Next t
DoEvents
Worksheets(基準シート).Activate
End Sub
Sub QuickSort1(ByRef argAry As Variant, ByVal lngMin As Long, ByVal lngMax As Long)
Dim i As Long
Dim j As Long
Dim vBase As Variant
Dim vSwap As Variant
vBase = argAry(Int((lngMin + lngMax) / 2))
i = lngMin
j = lngMax
Do
Do While argAry(i) < vBase
i = i + 1
Loop
Do While argAry(j) > vBase
j = j - 1
Loop
If i >= j Then Exit Do
vSwap = argAry(i)
argAry(i) = argAry(j)
argAry(j) = vSwap
i = i + 1
j = j - 1
Loop
If (lngMin < i - 1) Then
Call QuickSort1(argAry, lngMin, i - 1)
End If
If (lngMax > j + 1) Then
Call QuickSort1(argAry, j + 1, lngMax)
End If
End Sub
配列ソートのサブルーチンは、こちらから頂いています。
「エクセルの真髄」
https://excel-ubara.com/excelvba5/EXCELVBA228.html
いつもお世話になってます。コードが見やすいのです。
(1)の部分は、Microsoft ExcelのVBAはバージョンアップの途中で
シートをコピーした後、そのシートがアクティブであると保証されない
という「仕様」になってしまったので、回避のためにつけたもの。
シート名を配列に持っているんだから直接指定すれば済むのですが、なぜかこっちのほうがきれいだと思ったので。