VBA練習問題
VBA100本ノック 15本目:シートの並べ替え

VBAを100本の練習問題で鍛えます
公開日:2020-11-03 最終更新日:2021-02-22

VBA100本ノック 15本目:シートの並べ替え


シートを名前順に並べ替えする問題です。
シート名が「yyyy年mm月」となっている1年分のシートを並べ替えします。


ツイッター連動企画です。
ツイートでの見やすさを考慮して、ブック・シート指定等を適宜省略しています。

VBAテスト用のサンプルデータは、VBA100本ノックの目次ページ からもダウンロードできます。
マクロVBAを初心者向けの基本から上級者向けの高度な内容までサンプルコードを掲載し解説しています。エクセル関数・機能・基本操作の入門解説からマクロVBAまでエクセル全般を網羅しています。


出題

出題ツイートへのリンク

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

マクロ VBA 100本ノック


サンプルファイルです。
https://excel-ubara.com/vba100sample/VBA100_15.xlsm
https://excel-ubara.com/vba100sample/VBA100_15.zip


VBA作成タイム

この下に頂いた回答へのリンクと解説を掲載しています。
途中まででも良いので、できるだけ自分でVBAを書いてみましょう。


他の人の回答および解説を見て、書いたVBAを見直してみましょう。


頂いた回答

解説

#VBA100本ノック 15本目 解答
方法は大きく分けて3通り
・シート名が年月限定として、4月から順に並べる
・シート名の大小比較して直接シートを並べ替える
・シート名を新規シートに出力してソートし、その順に並べる
今回の問題の条件限定なら最初の方法が最も簡単でしょう。

Sub VBA100_15_01()
  Const startYM As Date = #4/1/2020#
  Dim i As Long
  On Error Resume Next '万一のシート抜け対応
  For i = 1 To 12
    Sheets(Format(DateAdd("m", i - 1, startYM), "yyyy年mm月")).Move After:=Sheets(Sheets.Count)
  Next
  Sheets(1).Select
End Sub


2番目の方法はいわゆるバブルソートをシートで行えばよいでしょう。
3番目の方法はエクセルの機能を活用した方法になります。
3番目と考え方は同じですが、配列にシート名を入れて配列を並べ替える方法もあります。
ただし、VBAでは標準で配列の並べ替えがサポートされていません。

Sub VBA100_15_02()
  Dim i As Long
  Dim j As Long
  For i = 12 To 1 Step -1
    For j = 1 To i - 1
      If Sheets(j).Name > Sheets(j + 1).Name Then
        Sheets(j).Move After:=Sheets(j + 1)
      End If
    Next
  Next
  Sheets(1).Select
End Sub


最新のMicrosoft 365ならシートのSort関数が使えます。
これが使えるようになると、VBAでの配列ソートが簡単におこなえるようになりますね。
3番目以降のVBAサンプルは記事補足に掲載しました。


補足

シート名が年月限定として、4月から順に並べる
先のVBAは小さい月から順に一番後ろに移動していくことで、最終的に並べ替わるようにしています。
12回ループさせて、
1回目、4月をシートの最後に移動
2回目、5月をシートの最後に移動、この時点で最後の2シートは4月,5月になる
3回目、5月をシートの最後に移動、この時点で最後の3シートは4月,5月,6月になる
・・・
12回目、3月をシートの最後に移動

逆順にやることもできます。

  For i = 12 To 1 Step -1
    Sheets(Format(DateAdd("m", i - 1, startYM), "yyyy年mm月")).Move Before:=Sheets(1)
  Next

後ろの月から先頭に順次移動していくことで並べ替えできます。

シート名の大小比較して直接シートを並べ替える
先のVBAはいわゆるバブルソートになりますが、ソートアルゴリズム自体は何を使っても良いでしょう。
シート名で12ヶ月限定なので、どんなソートでも良いと思います。
ただし、シート移動に伴って、他のシート位置がずれる点に注意してください。


シート名を新規シートに出力してソート、その順に並べる
Sub VBA100_15_03()
  Dim ws As Worksheet
  Dim i As Long
  
  Set ws = Worksheets.Add(After:=Sheets(Sheets.Count))
  ws.Columns(1).NumberFormat = "@"
  For i = 1 To Sheets.Count - 1
    ws.Cells(i, 1) = Sheets(i).Name
  Next
  
  ws.Range("A1").Sort key1:=ws.Range("A1"), order1:=xlAscending, _
            Header:=xlNo
            
  For i = 1 To Sheets.Count - 1
    Sheets(ws.Cells(i, 1).Value).Move Before:=ws
  Next
  
  Application.DisplayAlerts = False
  ws.Delete
  Sheets(1).Select
End Sub

一番後ろに新規シートを追加して、その直前に順次移動していくことで並べ替えしています。
新規シートを先頭に追加する書き方もあります。

配列に入れる方法の場合、配列の並べ替えを自力で行う必要があり、これが面倒です。
それなら2番目の方法で良い事になりますので、別途ソートが作成済の場合になると思います。

最新のMicrosoft 365ならシートのSort関数が使えますので、これなら簡単に実装できます。

Sub VBA100_15_04()
  Dim i, s, ary
  ReDim ary(1 To Sheets.Count)
  
  For i = 1 To Sheets.Count
    ary(i) = Sheets(i).Name
  Next
  
  For Each s In WorksheetFunction.Sort(ary, , 1, 1)
    Sheets(s).Move After:=Sheets(Sheets.Count)
  Next
  
  Sheets(1).Select
End Sub


サイト内関連ページ

第65回.シートの挿入、名前の変更(Add,Name)|VBA入門
・シートの挿入 ・シートの名前変更 ・シート挿入、名前変更の実践例
第66回.シートのコピー・移動・削除Copy,Move,Delete)|VBA入門
・シートのコピー・移動 ・シートの削除 ・シートのコピー・移動・削除の関連記事
第88回.並べ替え(Sort)|VBA入門
・Range.Sortメソッド・・・Excel2003までのソート ・2007以降の並べ替え ・Excel2003までのSortとExcel2007以降のSortの使い分け
SORT関数、SORTBY関数(範囲を並べ替え)|エクセル入門
・SORT関数の書式 ・SORTBY関数の書式 ・SORT関数、SORTBY関数と、ワークシートの並べ替えの違い ・最も単純な並べ替え ・複数キーでの並べ替え ・列方向(横方向)で並べ替え ・並べ替え範囲(配列)以外の基準で並べ替える ・列全体を範囲指定する場合 ・スピルによって新しく追加された関数
1次元配列の並べ替え(バブルソート,挿入ソート、クイックソート)|VBA技術解説
・検証方法 ・バブルソート ・挿入ソート ・クイックソート ・最後に




同じテーマ「VBA100本ノック」の記事

12本目:セル結合を解除
13本目:文字列の部分フォント
14本目:社外秘シート削除
15本目:シートの並べ替え
16本目:無駄な改行を削除
17本目:重複削除(ユニーク化)
18本目:名前定義の削除
19本目:図形のコピー
20本目:ブックのバックアップ
21本目:バックアップファイルの削除
22本目:FizzBuzz発展問題


新着記事NEW ・・・新着記事一覧を見る

AIは便利なはずなのに…「AI疲れ」が次の社会問題になる|生成AI活用研究(2026-02-16)
カンマ区切りデータの行展開|エクセル練習問題(2026-01-28)
開いている「Excel/Word/PowerPoint」ファイルのパスを調べる方法|エクセル雑感(2026-01-27)
IMPORTCSV関数(CSVファイルのインポート)|エクセル入門(2026-01-19)
IMPORTTEXT関数(テキストファイルのインポート)|エクセル入門(2026-01-19)
料金表(マトリックス)から金額で商品を特定する|エクセル練習問題(2026-01-14)
「緩衝材」としてのVBAとRPA|その終焉とAIの台頭|エクセル雑感(2026-01-13)
シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
8.マクロとは?VBAとは?VBAでできること|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.メッセージボックス(MsgBox関数)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
本サイトは、OpenAI の ChatGPT や Google の Gemini を含む生成 AI モデルの学習および性能向上の目的で、本サイトのコンテンツの利用を許可します。
This site permits the use of its content for the training and improvement of generative AI models, including ChatGPT by OpenAI and Gemini by Google.



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ