適材適所

PowerShellやVBAなどプログラミング系の話多めで

【Excel VBA】シートを並び替える

Excelを使っていると、いつの間にか大量のシートが・・・。なんてことありませんか?

え?ちゃんと管理しているから大丈夫?

そ、そうですか。

じゃ、じゃあ、他の人が作って、しかもそれが脈々と受け継がれ来て、

コピーされたシートがいっぱいになっている。

なんてことはないでしょうか?

それなら、あるかもしれない?

ですよね!

シートがたくさんあり過ぎて、扱いづらいExcel。

そのシートを簡単に並び替えたい。

そんなときに活躍するVBAコードの紹介です。

コード

コードはこちら。

 
'シートの一覧を書き出す
Sub WriteSheet()
   Dim sh As Worksheet
   Dim shWriteTo As Worksheet: Set shWriteTo = Sheet1
   shWriteTo.Cells.ClearContents 'シートをまっさらにする
   Dim i As Long: i = 2 '1行目は項目名
   shWriteTo.Cells(1, 1).Value = "シート名"
   For Each sh In Worksheets
      shWriteTo.Cells(i, 1).Value = sh.Name
      i = i + 1
   Next sh
End Sub
 
'Sheet1のA列に書かれたシート名の
'順番にシートを並び替える
Sub sortSheet()
   Dim sh As Worksheet
   'ソートするシート名が書かれたシート
   Dim shWriteTo As Worksheet: Set shWriteTo = Sheet1
   '最終行の取得
   Dim lastRow As Long: lastRow = shWriteTo.Cells(Rows.Count, 1).End(xlUp).Row
   Dim i As Long
   Dim aftershName As String
   Dim beforeShName As String
   For i = 2 To lastRow - 1
      beforeShName = shWriteTo.Cells(i, 1).Value
      aftershName = shWriteTo.Cells(i + 1, 1).Value
      'シートを入れ替える
      Worksheets(aftershName).Move after:=Worksheets(beforeShName)
   Next i
End Sub

どんな動きをするコードか

シートが5枚あるとします。

f:id:shinmai_papa:20210310002257p:plain

まずWriteSheetサブプロシージャを実行して、シート名をSheet1に書き出します。

f:id:shinmai_papa:20210310002253p:plain

手動(ここ重要)で任意の順に適当に並び替えて・・・

ここでフィルタを使えば昇順、降順もできます。

そのため、手動としております。

f:id:shinmai_papa:20210310002247p:plain

並び替えが完了した後で、

sortSheetサブプロシージャを実行すれば・・・

シートが並び替えられました。

f:id:shinmai_papa:20210310002250p:plain

実用性は?

あんまりないかも・・・?

そもそもシートを大量に作ってしまうと可読性も悪くなりますし、

ブックも重くなってしまいます。

逆にあんまりシート数がないと

このコードを実行するより手動で並び替えてしまった方が早いですね。

なんとも言えないところですが。

どちらかというと、シートの並び替えのところは、

アルゴリズム的な感じで頭の体操になりますね。

そっちの実用性はあります。

(ちょっと何言っているかわからないですね)

終わりに

ついついブックに大量のシートを作ってしまった際や、

他人が作って脈々と受け継がれてきてシートが大量になってしまった

Excelを整理するときに使えそうなコードの紹介でした。

実用性的にはどうかと思いますが、

ここに記しておけばまだ見ぬどなたかの

役に立つかもしれませんので記しておこうと思います。

ここまでお読みいただき、ありがとうございました。

関連がありそうな記事

www.tekizai.net

www.tekizai.net

www.tekizai.net