ワークシートを移動する「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」に、
それぞれテキストを置換して作った手抜きページなので、読む必要はありません。
それぐらい双子のメソッドなんだという風に、覚えておいてください。