和風スパゲティのレシピ

日本語でコーディングするExcelVBA

15本目:シートの並べ替え

Excel&VBA解説サイト「エクセルの神髄」様出題の問題集、
VBA100本ノック」に対する私の回答と解説のページです。

100本ノックの出題リストはこちらから
excel-ubara.com

出題:シートの並べ替え

#VBA100本ノック 15本目
「2020年04月」から「2021年03月」のシートがあります。
しかし、シートの順番が狂ってしまっています。
「2020年04月」から昇順に並べ替えてください。
・上記以外のシートは存在しません。
・シート名は「yyyy年mm月」これで統一されています。

シートのソート

◇ 出題ページはこちら

ソースコード

メインモジュール

Option Explicit

' 100本ノック015:シートの並べ替え
Sub アクティブブックのシートを並び替える()
    
    Dim wb対象ブック As Workbook
    Set wb対象ブック = ActiveWorkbook
    
    ' 新規シートにシートリストを書き出し
    Dim wsシートリスト As Worksheet
    Set wsシートリスト = Workbooks.Add.Worksheets(1)
    wsシートリスト.Columns(1).NumberFormatLocal = "@"
    
    Dim シート番号 As Long
    For シート番号 = 1 To wb対象ブック.Worksheets.Count
        wsシートリスト.Cells(シート番号, 1) _
            = wb対象ブック.Worksheets(シート番号).Name
    Next
    
    ' シート上でソート
    wsシートリスト.UsedRange.Sort wsシートリスト.Cells(1, 1)
    
    ' ソート順にシートを並び替え
    For シート番号 = 1 To wb対象ブック.Worksheets.Count
        wb対象ブック.Worksheets(wsシートリスト.Cells(シート番号, 1).Value).Move _
            before:=wb対象ブック.Worksheets(シート番号)
    Next
    
    wsシートリスト.Parent.Close False
    
End Sub

解説

シートの並び替えを行う問題でした。

シート.Moveでソートアルゴリズムを作る方法もありますが、
本解答ではシート名を作業シートに書き出してソートしています。


ワークシートのソートは優秀なので、
配列やシートなどの並び替えは基本ワークシートを使っておけばOKです。


この手の作業シートは、

'    wsシートリスト.Parent.Close False

このようにコメントアウトすることでログとしても機能します。

この手法も便利なので合わせて覚えておいてください。