9/29/2018

Excel。マクロ35。連続した規則性のあるシートを並び替えてみよう【SORT】

Excel。マクロ35。連続した規則性のあるシートを並び替えてみよう

<Excel VBA:シートの並び替え>

シートが多くなってくると、
あるカテゴリー別に並び替えたりすることがでてきますが、
大量のシートを並び替えようとすると、結構面倒なことに気が付きます。

その原因は、データの並び替えはあるけど、
シートの並び替えが無いことなんですね。

昇順や降順ボタンがあれば、ポチッで済むのですが、それができない。

このような面倒な処理となれば、
Excel VBAでマクロを作るというのが基本的な流れになるわけですね。

何か難しそうなイメージがするかもしれませんが、
それほど厄介なプログラム文ではありませんので、知っておくと便利ですよ。

では、次のような状態でシートが並んでいます。


今回は、規則性のある連続したシートの並び替えを紹介しますので、
単純に4月~9月を並び替えていきます。

それ以外のシートは並び替えの対象外とします。

プログラムに詳しい人は、
配列を使って…という方法が処理も早いしとかあるとは思いますが、
一般事務職というか、プログラムには詳しくないけど、
作業効率を改善したい人は山のようにいらっしゃいますので、
今回は、配列を使わない方法で挑戦していきます。

流れとしては、新しいシートを挿入して、各シート名を拾ってきて、
並び替えをして、その順番にシートを移動させたあと、
挿入したシートは作業用シートなので、削除するという流れがいいかと思います。

まず、完成したプログラム文です。
Sub シート並び替え連続()
    Dim i As Long
   
    With Sheets.Add
        For i = 5 To Sheets.Count
            .Cells(i - 4, 1) = Sheets(i).Name
        Next i
       
        .Range("a1").CurrentRegion.Sort .Range("a1")

        Sheets(.Cells(1, 1).Value).Move before:=Sheets(5)       
        For i = 6 To Sheets.Count
            Sheets(.Cells(i - 4, 1).Value).Move after:=Sheets(i - 1)
        Next i
       
        Application.DisplayAlerts = False
        .Delete
        Application.DisplayAlerts = True
    End With
End Sub

実際に動かしながら説明をしていきます。

Dim i As Long
これは、お馴染みの変数を宣言しているところです。
大外を、
With Sheets.Add~End With
でWith文で囲っています。
新しく追加したシートを省略しているわけですね。

【追加したシートにシート名を回収する】

For i = 5 To Sheets.Count
   .Cells(i - 4, 1) = Sheets(i).Name
Next i
ここまでを実行してみましょう。

新しいシートが挿入されて、A1からシート名を拾ってきて入力されています。

なお、新しいシートは、
アクティブにしてあるシートの左側に挿入されます。

For i = 5 To Sheets.Count
シートの5番目からシートの最後までという意味ですね。

シートが挿入されるので、”+1”するのがポイントですね。

Cells(i - 4, 1) = Sheets(i).Name
A1に、5番目のシート名をいれます。

この新しく挿入したシートに作ったシート名の一覧を使って次の作業をします。

【並び替える順番を準備する】

.Range("a1").CurrentRegion.Sort .Range("a1")

シート名の一覧ができましたが、
今回は4月~9月と規則性のある並び替えをします。

.Range("a1").CurrentRegion.Sort .Range("a1")
A1の表を選択して並び替えをするという意味ですね。

【シートを並び替える】

Sheets(.Cells(1, 1).Value).Move before:=Sheets(5)       
For i = 6 To Sheets.Count
    Sheets(.Cells(i - 4, 1).Value).Move after:=Sheets(i - 1)
Next i
ここで、実際にシートの並び替えをしています。

Sheets(.Cells(1, 1).Value).Move before:=Sheets(5)     

新しく挿入したシートの右側(before:=Sheets(5))に、
最初のシートを移動します。

その移動したシートの右側にシートを移動させて、
シートの並び替えをしていきます。

これで完成しているのですが、作業用に追加したシートが不要になります。

【不要になった作業用シートを削除】

Application.DisplayAlerts = False
.Delete
Application.DisplayAlerts = True
削除しますか?というメッセージを表示してから削除許可をするのは、
面倒なので、メッセージを表示させないでそのまま、
不要になった作業用シートを削除させているのが、この3行です。

Application.DisplayAlerts = False
でメッセージを表示させなくして、そのままだと、
通常のExcelの処理もメッセージが表示されなくなってしまうので、最後に、

Application.DisplayAlerts = True
で元に戻して終了ですね。

このようなExcel VBAで簡単にシートの並び替えをすることができます。