Home » エクセルマクロ・Excel VBAの使い方 » マクロのサンプル » 選択されたシートを逆順に並び替えるExcelマクロ

選択されたシートを逆順に並び替えるExcelマクロ

対象:Excel2003, Excel2007, Excel2010

シートの順番を逆転させるマクロコード」という記事で、Excelファイルの全シートの順番を、逆の順序に並び替えするVBA(Visual Basic for Applications)マクロが紹介されています。

こちらのマクロでは、全シートを並び替えているわけですが、一部のシートだけを並び替えたいという要望も実務では出てくるな、と感じたのでそんなマクロを作ってみました。

[スポンサードリンク]

選択されたシートを逆順に並び替えるサンプルマクロ

基本的な考え方は、全シートを並び変える場合と同じなのですが、全部ではなく一部のシートとなると、やるべきことはどうしても増えます。

Sub 選択された連続したシートを逆順に並び替える()
 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

 For i = 1 To cnt - 1
  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マクロ

「マクロのサンプル」の記事一覧

検索


Copyright © インストラクターのネタ帳 All Rights Reserved.

.