「シートの順番を逆転させるマクロコード」という記事で、Excelファイルの全シートの順番を、逆の順序に並び替えするVBA(Visual Basic for Applications)マクロが紹介されています。
こちらのマクロでは、全シートを並び替えているわけですが、一部のシートだけを並び替えたいという要望も実務では出てくるな、と感じたのでそんなマクロを作ってみました。
選択されたシートを逆順に並び替えるサンプルマクロ
基本的な考え方は、全シートを並び変える場合と同じなのですが、全部ではなく一部のシートとなると、やるべきことはどうしても増えます。
Dim sh As Object ' WorksheetまたはChart
Dim sh_id() As Long
Dim cnt As Long
Dim i As Long
With ActiveWindow
cnt = .SelectedSheets.Count
If cnt < 2 Then Exit Sub
ReDim sh_id(1 To cnt)
i = 1
For Each sh In .SelectedSheets
sh_id(i) = sh.Index
i = i + 1
Next
End With ' ActiveWindow
For i = 1 To cnt - 1
If sh_id(i + 1) - sh_id(i) <> 1 Then
MsgBox "連続したシートを選択してください。"
Exit Sub
End If
Next i
Sheets(sh_id(1)).Move _
After:=Sheets(sh_id(cnt) - i + 1)
Next i
Sheets(sh_id).Select
End Sub
サンプルマクロの解説
最初の
cnt = .SelectedSheets.Count
If cnt < 2 Then Exit Sub
ReDim sh_id(1 To cnt)
で、選択されているシートの枚数を変数・cntに格納して、シートが1枚しか選ばれていなければマクロを終了し、2枚以上ならば配列・sh_id()のサイズを決めています。
つづく最初のループ処理
i = 1
For Each sh In .SelectedSheets
sh_id(i) = sh.Index
i = i + 1
Next
で、配列・sh_id()に、選択されているシートのインデックス番号を格納していきます。
このマクロは、連続したシートだけを並び替える仕様としたので、2つ目のループ処理の中で、
For i = 1 To cnt - 1
もし連続していないシートが選ばれていたら、メッセージを表示してマクロを終了します。
If sh_id(i + 1) - sh_id(i) <> 1 Then
MsgBox "連続したシートを選択してください。"
Exit Sub
3つ目のループ処理
For i = 1 To cnt - 1
Sheets(sh_id(1)).Move _
After:=Sheets(sh_id(cnt) - i + 1)
Next i
で実際にシートを並び替えています。
連続しているシートがどんどん移動されていくので、動かす元は常に「Sheets(sh_id(1))」のままで、動かす先が「After:=Sheets(sh_id(cnt) - i + 1)」と変化していきます。
最後に、どのシートを並び替えたのかがわかるように、選択されていたシートを
Sheets(sh_id).Select
選び直しています。
Home » エクセルマクロ・Excel VBAの使い方 » マクロのサンプル » 選択されたシートを逆順に並び替えるExcelマクロ