📊 Excel VBA Top100
📋

MoveSheet

シート管理

シートをブック内の別の位置に移動する

ワークシートを指定の位置に移動するVBAマクロです。Worksheet.Moveメソッドを使ってシートの順序を変更でき、Before/After引数でどのシートの前後に移動するかを指定します。複数シートの並び順を自動で整理するソート処理や、特定の命名規則に基づいた配置変更に活用できます。新しいブックへの移動も同じメソッドで対応可能です。内部ではWorksheet.MoveメソッドのBefore/After引数でシートの新しい位置を指定しており、Copyメソッドと形が似ているためコードの使い回しがしやすい点が特徴です。SortSheetsByNameが全シートを自動で並べ替えるのに対し、本マクロは1枚を狙った位置に動かす用途に向いており、両者は粒度の異なるツールとして併用されます。タブをドラッグする操作をコード化することで、決まった位置への移動を確実に再現できます。

MoveSheet デモ

📖 使い方

  1. VBAエディタを開く(Alt + F11)
  2. モジュールを挿入(挿入 > モジュール)
  3. 下記VBAコードをコピー&ペースト
  4. ブック上で実行(Alt + F8 でマクロ選択)
💡 実行例: 実行するとシート名と移動先位置を入力するダイアログが表示される

🎯 活用シーン

  • ✓月別シートを日付順に自動並べ替えして整理
  • ✓完了したタスクシートをアーカイブセクション(末尾)に移動
  • ✓新規追加シートをアルファベット順の適切な位置に自動配置
  • ✓完了した案件シートを一覧の末尾(アーカイブ領域)へ定期的に移動して整理したいとき
  • ✓優先度の高い案件シートを常に先頭に配置し直し、見やすい並び順を維持したいとき

💡 実装のヒント

  • ▸Move Before:=Sheets(1)で先頭に移動できます
  • ▸複数シートを名前順に並べ替えるにはバブルソートなどのアルゴリズムを使います
  • ▸MoveはCopyと異なり元の場所からシートが消えます
  • ▸複数シートを連続して移動する場合、移動のたびにインデックス番号がずれるため、処理順序を後ろから前へにすると意図した並びになりやすいです。
  • ▸別ブックへ移動する場合はコピー元のシートが消える点に注意し、必要であれば事前にCopySheetでバックアップを取ってください。

💻 VBAコード

' MoveSheet
' -----------------
' Macro Name: MoveSheet
' Description: シートをブック内の別の位置に移動する
' Parameters: なし
' Returns: なし
' Usage: 実行するとシート名と移動先位置を入力するダイアログが表示される
' -----------------

Sub MoveSheet()
    Dim ws As Worksheet
    Dim targetWs As Worksheet
    Dim sheetName As String
    Dim position As String
    Dim newIndex As Long
    Dim i As Long

    On Error GoTo ErrorHandler

    sheetName = InputBox("移動するシート名を入力:", "シート移動", ActiveSheet.Name)

    If sheetName = "" Then
        Exit Sub
    End If

    On Error Resume Next
    Set ws = Worksheets(sheetName)
    On Error GoTo ErrorHandler

    If ws Is Nothing Then
        MsgBox "「" & sheetName & "」は存在しません。", vbExclamation
        Exit Sub
    End If

    position = InputBox("移動先を入力:" & vbCrLf & "  先頭: 1" & vbCrLf & "  末尾: " & Worksheets.Count & vbCrLf & "  シート名: シート名を指定", "シート移動")

    If position = "" Then
        Exit Sub
    End If

    If IsNumeric(position) Then
        newIndex = CLng(position)
        If newIndex < 1 Then newIndex = 1
        If newIndex > Worksheets.Count Then newIndex = Worksheets.Count
        ws.Move Before:=Worksheets(newIndex)
    Else
        On Error Resume Next
        Set targetWs = Worksheets(position)
        On Error GoTo ErrorHandler
        If targetWs Is Nothing Then
            MsgBox "「" & position & "」は存在しません。", vbExclamation
            Exit Sub
        End If
        ws.Move After:=targetWs
    End If

    MsgBox "「" & sheetName & "」を移動しました。", vbInformation
    Exit Sub

ErrorHandler:
    MsgBox "エラーが発生しました: " & Err.Description, vbCritical
End Sub