2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ワークシートを名前順に並べ替える

Posted at

英語の教材を作っていて、ワークシートを名前順に並べ替えたいな、と思って作成。
シート名が「〇〇大学▽△年□番」と取り扱った問題番号を示しているけれども、どの大学のどれを処理するかはそのつど目についたものにしているのであとから見るとゴチャゴチャしている。そこでソートを掛けてみた。
ポイントは、現在選択しているシートを一番左に持ってくること。(たとえば[サマリー]なんてシートを選択しておく。)ついでにこのマクロのあるブックを裏で立ち上げておけば、別のブックでシート並べ替え作業を行えること。

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はバージョンアップの途中で
シートをコピーした後、そのシートがアクティブであると保証されない
という「仕様」になってしまったので、回避のためにつけたもの。
 シート名を配列に持っているんだから直接指定すれば済むのですが、なぜかこっちのほうがきれいだと思ったので。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?