和風スパゲティのレシピ

日本語でコーディングするExcelVBA

シートを移動する - Moveメソッドの使い方

ワークシートを移動する「Moveメソッド」の使い方を解説します。

基本構文

ワークシートを移動する場合、以下のどちらかのコードを実行します。

[移動するシート].Move Before:=[ここで指定したシートの1つ前に移動]

[移動するシート].Move After:=[ここで指定したシートの1つ後ろに移動]

実行例

Sub 第1シートを移動して第2シートの後ろに移動する
    Worksheets(1).Move After:= Worksheets(2)
End Sub

このコードを実行すると、アクティブブックの第1シートを第2シートの次のシートに移動します。
第2シートだったシートが第1シートになりますので、
移動したシートは第2シートになるということですね。

移動後のシートを編集するとき

移動したシートを移動後に編集するときは、Moveメソッドの特徴である
移動したシートがアクティブになっている」ことを活用します。

' 移動したシートの名称変更やセル値の編集を行う
Worksheets(1).Move After:= Worksheets(2)

ActiveSheet.Name = "変更するシート名"
Range("A1") = 1

 
変数に格納する場合はこのように書きます。

' 移動した直後にActiveSheetを変数にSetして、その変数へ処理を実行する
Worksheets(1).Move After:= Worksheets(2)
Dim 編集シート As Worksheet
Set 編集シート = ActiveSheet

編集シート.Name = "変更するシート名"
編集シート.Range("A1") = 1

シートを移動する処理が入るようなマクロには、
他にもActiveSheetが変わる処理が書かれる可能性が高いです。

なるべく下の例のように、移動直後に変数にSetして扱うようにしましょう。

サンプルコード集

いろいろな場面での実行例を記載します。

いずれの場合も、移動後のシートを編集する場合は、
上記のようにActiveSheetを編集してください。

移動元・行先のシート名を指定して移動

Worksheets("○○").Move After:= Worksheets("△△")

ブックの先頭に移動

Worksheets("○○").Move Before:= Worksheets(1)

ブックの末尾に移動

Worksheets("○○").Move After:= Worksheets(Worksheets.Count)

[シートの数]番目のシート = 末尾のシートです。

別のブックの先頭に移動

ThisWorkbook.Worksheets("○○").Move Before:= Workbooks("△△.xlsx").Worksheets(1)

After、Beforeには別のブックのシートも指定可能です。
移動先のブックは開いている必要があります。


ブック間でやり取りをする場合は、この例の「Thisworkbook」のように、
Worksheetsの親ブックを明示しておきましょう。

省略した場合はActiveWorkbookを親としてしまうため、
選択中のブックが変わるとバグになってしまいます。

別のブックの末尾に移動

ThisWorkbook.Worksheets("○○").Move After:= Workbooks("△△.xlsx").Worksheets(Workbooks("△△.xlsx").Worksheets.Count)

別のブックの末尾へ移動する場合は、Workbooks("△△.xlsx")という指定を2回書く必要がある点に注意してください。

移動先のブックのWorksheetの数を数えなければいけませんからね。


かなり見づらいコードになってしまいますが、

ThisWorkbook.Worksheets("○○").Move _
    After:= Workbooks("△△.xlsx").Worksheets _
                    (Workbooks("△△.xlsx").Worksheets.Count)

このように、_を使って改行をすると、多少は見やすくなります。


または、きっちりと変数に入れておいても見やすくなります。

Dim 移動するシート As Worksheet
Set 移動するシート = ThisWorkbook.Worksheets("○○")

Dim 移動先ブック As Workbook
Set 移動先ブック = Workbooks("△△.xlsx")

移動するシート.Move After:=移動先ブック.Worksheets(移動先ブック.Worksheets.Count)

このようにコードを整理するのも、マクロ作成の大事なポイントですね。

新しいブックに移動

Worksheets("○○").Move

After、Beforeともに指定しない場合は、移動したシート1枚からなる新しいブックが出力されます。

とても簡単な記述なので、是非とも覚えておきましょう。



以上が実行例となります。
目的のマクロにあったサンプルコードをお持ち帰りください。

補足:Moveメソッドの正確な引数の構造について

一応補足しておきますと、

[移動するシート].Move Before:=[ここで指定したシートの1つ前に移動]
[移動するシート].Move After:=[ここで指定したシートの1つ後ろに移動]

と、基本構文を記載してきましたが、Moveメソッドの引数構造は、

[移動するシート].Move(Before, After)

これが正確な記述です。


このため、

Worksheets(1).Move Before:= Worksheets(2)
' ⇅同じ意味
Worksheets(1).Move Worksheets(2) ' 第1引数に渡す
Worksheets(1).Move After:= Worksheets(2)
' ⇅同じ意味
Worksheets(1).Move ,Worksheets(2) ' ←第1引数を省略して第2引数に渡す

こういった書き方をすることもできます。

After:=で使っている「:=」は、
引数を渡す順番に関係なく、指定した名前の引数に渡す機能です。


特にBeforeは1番目の引数であるため、
Before:=とわざわざ書く必要は、機械目線ではありません。


しかし、このAfterとBeforeは「同時に指定してはいけない」引数なため、
どうせ(○○, △△)のような指定はできないのです。

それならば、実際に使う場合は、

Worksheets(1).Move Before:= Worksheets(2)
Worksheets(1).Move After:= Worksheets(2)

このように、引数名を記載した方が、人間目線では間違いなくわかりやすいです。


ということで、結論はこの2文だけ覚えておけばいいと思います。

Move(Before, After)という構造と、「:=」の意味については、
知識として心の片隅にでも置いておいてください。

シートをコピーするCopyメソッドについて

シートをコピーするにはCopyメソッドを使いますが、

[コピーするシート].Copy Before:=[ここで指定したシートの1つ前に挿入]
[コピーするシート].Copy After:=[ここで指定したシートの1つ後ろに挿入]

と、Moveメソッドと全く同じ記述をすることになります。
せっかくなので併せて覚えてしましましょう。

Copyメソッドについては以下の記事で解説しておりますが、
本ページの「移動」を「コピー」に、「Move」を「Copy」に、
それぞれテキストを置換して作った手抜きページなので、読む必要はありません。

それぐらい双子のメソッドなんだという風に、覚えておいてください。

www.limecode.jp