VBAでシートの移動を行う

Worksheet.Move、Chart.Move、DialogSheet.Move、Worksheets.Moveメソッド

シートの移動を行うにはMoveメソッドを使います。

移動を行うとその移動先でそのシートがアクティブになります。

同じブックだけでなく別のブックや新規ブックに移動させることも可能です。その際も別ブックや新規ブックがアクティブになり、移動したシートもアクティブになります。

別ブックに移動させる場合はそのブックが開いていなければなりません。

Array関数を使うと複数のシートを一度にまとめて移動させることが可能です。

構文

Sub Worksheet.Move([Before As Worksheet], [After As Worksheet])
Sub Chart.Move([Before As Worksheet], [After As Worksheet])
Sub DialogSheet.Move([Before As Worksheet], [After As Worksheet])
Sub Worksheets.Move([Before As Worksheet], [After As Worksheet])

BeforeとAfterの型は実際には未定義によるVariant型ですが、わかりやすいようにWorksheet型としています。

Worksheet、Chart、DialogSheet、Worksheets 親オブジェクトとしてWorksheetオブジェクト、Chartオブジェクト、DialogSheetオブジェクト、Worksheetsコレクションのいずれかを指定します。

グラフシート用のChartオブジェクトやダイアログシート用のDialogSheetオブジェクトを使うことはまずないと思います。

Worksheetsコレクションを指定する場合にワークシートしかない場合は全シートを移動させることになるためエラーになります。Worksheetsコレクション対象外であるグラフシート等がある場合はエラーになりません。

Before 省略可。Beforeでシートを指定すると、その左に対象シートが移動します。

BeforeとAfterを同時に設定することは出来ません。設定した場合はエラーになります。

After 省略可。Afterでシートを指定すると、その右に対象シートが移動します。

BeforeとAfterを同時に設定することは出来ません。設定した場合はエラーになります。

BeforeとAfterの両方を省略した場合は、対象シートを新規ブックに移動します。

移動先に同じ名前のシートがある場合

別ブックにシートを移動する場合に、同じ名前のシートが存在することがあります。

その場合はエラーにはならず、移動したシートのシート名が「元のシート名」+「半角スペース」+「(連番)」になります。連番は2から始まります。

「Sheet1」が重複する場合は「Sheet1」と「Sheet1 (2)」になり、さらに「Sheet1」が移動すると「Sheet1」と「Sheet1 (2)」と「Sheet1 (3)」になります。

不正な構文

上の構文には書いていませんが、実はMoveメソッドには以下も存在します。

Sub Sheets.Move([Before As Worksheet], [After As Worksheet])

また、上の構文にはありますが、こちらも注意が必要です。

Sub Worksheets.Move([Before As Worksheet], [After As Worksheet])

SheetsコレクションとWorksheetsコレクションが親オブジェクトになっている構文で、実際に定義として存在します。

しかしこれらはエラーになります。

Sheetsコレクションは全シートが対象になり、Worksheetsコレクションはワークシートが対象になります。

ほとんどのブックはワークシートのみで構成されており、マクロシートやグラフシートやダイアログシートはまず無いと思います。

そのため、多くの場合はWorksheetsコレクションも全シートが対象になります。

その全シートをMoveメソッドで移動させると移動元のブックにはシートが存在しなくなってしまい、移動元のブックにシートが無くなってしまうことからエラーになります。

Sheets.Moveの構文は考慮漏れによるバグと思われます。コーディングとしては間違っていないため構文エラーにはならず、以下のようなコードもOKですが全シート移動は無理なため実行時エラーになります。

サンプルコード

新規ブックに移動

Moveメソッドの引数を省略しているため、新規ブックにシートを移動します。

開いている別ブックに移動

未保存のBook7というブックにシートを移動させるサンプルです。引数BeforeによりBook7の左から2番目のシートの左に移動します。

開いていない別ブックに移動

開いていない別ブックに移動させるサンプルです。開いていないブックにはシートの移動はできないため一度開きます。

その後、シートの移動を行います。

ブックのOpenメソッドを実行するとアクティブブックが開いたブックに変更されるため、事前にコピー元のアクティブブックとコピー先の開くブックのWorkbookオブジェクトを保持しています。

12行目のMoveメソッドでは、コピー元のWorkbookオブジェクトとコピー先のWorkbookオブジェクト+シートを指定しています。

ブックが開いているかどうか不明の場合

ブックが開いているかどうか不明な場合は「ブックが開かれているかチェックする」のサンプルコードをご参照ください。

ブックが開いているかどうかの分岐の条件文をそのまま使えます。

あとはIfとElseの処理以降にシート移動の処理を書くだけです。

IsBookOpened関数とGetFileName関数は上記リンク先をご参照ください。

複数のシートを一度に移動させる場合

複数のシートを一度に移動させる場合はWorksheetsコレクションやSheetsコレクションの引数にArray関数で移動したいシートを全て指定して、Moveメソッドを行います。

Array関数の引数にはシート名を指定します。

関連記事

サブコンテンツ

このページの先頭へ