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ですが全シート移動は無理なため実行時エラーになります。
1 2 3 |
Sub SheetsMoveTest() Call Sheets.Move End Sub |
サンプルコード
新規ブックに移動
Moveメソッドの引数を省略しているため、新規ブックにシートを移動します。
1 2 3 |
Sub SheetMoveNewBookTest() Call Sheets(1).Move End Sub |
開いている別ブックに移動
未保存のBook7というブックにシートを移動させるサンプルです。引数BeforeによりBook7の左から2番目のシートの左に移動します。
1 2 3 |
Sub SheetMoveTest1() Call Sheets(1).Move(before:=Workbooks("Book7").Worksheets(2)) End Sub |
開いていない別ブックに移動
開いていない別ブックに移動させるサンプルです。開いていないブックにはシートの移動はできないため一度開きます。
その後、シートの移動を行います。
ブックのOpenメソッドを実行するとアクティブブックが開いたブックに変更されるため、事前にコピー元のアクティブブックとコピー先の開くブックのWorkbookオブジェクトを保持しています。
12行目のMoveメソッドでは、コピー元のWorkbookオブジェクトとコピー先のWorkbookオブジェクト+シートを指定しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Sub SheetMoveTest2() Dim wbActive As Workbook '// アクティブブック用 Dim wbOpen As Workbook '// 移動先ブック用 '// アクティブブックを保持 Set wbActive = ActiveWorkbook '// ブックを開く Set wbOpen = Workbooks.Open("C:\web\Book4.xlsx") '// 開いたブックの一番左のシートの右に移動 Call wbActive.Sheets(1).Move(After:=wbOpen.Worksheets(1)) End Sub |
ブックが開いているかどうか不明の場合
ブックが開いているかどうか不明な場合は「ブックが開かれているかチェックする」のサンプルコードをご参照ください。
ブックが開いているかどうかの分岐の条件文をそのまま使えます。
あとはIfとElseの処理以降にシート移動の処理を書くだけです。
IsBookOpened関数とGetFileName関数は上記リンク先をご参照ください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
Sub SheetMoveOtherTest() Dim bOpened As Boolean '// 移動先ブックの状態判定フラグ Dim wbActive As Workbook '// アクティブブック用 Dim wbOpen As Workbook '// 移動先ブック用 Dim sFilePath '// ファイルパス Dim sFileName '// ファイル名 '// アクティブブックを保持 Set wbActive = ActiveWorkbook '// 指定ファイルパスが開いているか確認 sFilePath = "C:\web\Book4.xlsx" bOpened = IsBookOpened(sFilePath) '// ブックが開いている場合 If (bOpened = True) Then '// 開いているブックのWorkbookオブジェクトを取得 Call GetFileName(sFilePath, sFileName) Set wbOpen = Workbooks(sFileName) '// ブックが開いていない場合 Else '// 開いていないブックを開きWorkbookオブジェクトを取得 Set wbOpen = Workbooks.Open(sFilePath) End If '// シート移動 Call wbActive.Sheets(1).Move(After:=wbOpen.Sheets(1)) End Sub |
複数のシートを一度に移動させる場合
複数のシートを一度に移動させる場合はWorksheetsコレクションやSheetsコレクションの引数にArray関数で移動したいシートを全て指定して、Moveメソッドを行います。
Array関数の引数にはシート名を指定します。
1 2 3 4 5 6 7 |
Sub SheetsMoveTest() '// Nameプロパティを利用 Call Sheets(Array(Sheets(1).Name, Sheets(2).Name)).Move '// シート名を利用 Call Sheets(Array("Sheet1", "Sheet2")).Move End Sub |