Excelシートを使っていると、すでに使っているシートをコピーして作業を加えたいことってありますよね。
別々のシートをコピーして、1つのブックにまとめるなんてこともありませんか?たくさんのシートを1つずつコピーして、1つのブックにまとめるのも結構面倒ですよね。
そんなときこそ、VBAを使って自動化しましょう!この記事ではシートのコピーについて
といった基本的な内容から、
といった応用的な内容まで解説します。
この記事を読み終えるころには、VBAで効率的なシート操作ができるようになっていますよ!
シート全体をコピーする方法
シートそのものをコピーする方法を解説します。
シートをコピーするには、Copyメソッドを使います。
[書式]
Worksheets("シート名またはインデックス").Copy Before(またはAfter):=”基準となるシート名”
引数Beforeで指定をすると、指定したシート名の前にシートがコピーされます。
引数Afterで指定すると、指定したシートの次にシートがコピーされます。引数BeforeとAfterは一緒に指定することはできません。
サンプルコードで確認しましょう。
[使用例]
Sub SheetCopy1() Worksheets("フォーム").Copy Before:=Worksheets("フォーム") End Sub
[実行結果]
「Before := Worksheets(“フォーム”)」として、「フォーム」というシートの前にコピーしたものを置いています。
コピー後にシートの名前を変更
ここでコピー後にシートの名前を変更する方法についてお伝えします。
シートをコピーするとシート名が”Sheet (2)”のように自動で付けられます。これを変更した方が扱いやすい場合が多いです。シート名を変更するにはWorksheetオブジェクトのNameプロパティの値を変更します。
サンプルコードで確認しましょう。
[使用例]
Sub SheetCopy1() Worksheets("フォーム").Copy Before:=Worksheets("フォーム") ActiveSheet.Name = "田中" End Sub
[実行結果]
シートをコピーすると、新しくコピーされたシートがActiveSheetになりますので、ActiveSheet.Nameプロパティを変更しています。
シートの先頭にコピーする方法
先頭にシートをコピーしたい場合があります。
コピー位置の基準となるシート名を先頭シートにし、Beforeを使うことで先頭にシートをコピーすることができます。
サンプルコードで確認しましょう。
[使用例]
Sub SheetCopy2() Worksheets("フォーム").Copy Before:=Worksheets(1) End Sub
[実行結果]
シートの末尾にコピーする方法
新しいシートをコピーして追加する場合は、末尾に追加するケースも多いですよね。コピー位置の基準となるシート名を末尾のシートにし、Afterを使うことで末尾にシートをコピーすることができます。
サンプルコードで確認しましょう。
[使用例]
Sub SheetCopy3() Worksheets("田中").Copy After:=Worksheets(Worksheets.Count) End Sub
[実行結果]
Worksheets.Countにてシート数を取得して末尾を指定しています。
複数のシートを一度にコピーする方法
複数のシートをまとめて一度にコピーしたい場合があります。そんな場合はArray関数を使って以下のように記述します。
[書式]
Worksheets(Array(“シート名1”, “シート名2”, ・・・)).Copy Before(またはAfter):=”基準となるシート名”
サンプルコードで確認しましょう。
[使用例]
Sub SheetCopy4() Worksheets(Array("佐藤", "田中")).Copy Before:=Worksheets("フォーム") End Sub
[実行結果]
シートを別のブックにコピーする方法
今度は、シートを別のブックにコピーする方法を解説します。
書式は以下の通りで「コピー元シート.Copy コピー先ブック」が基本です。
[書式]
Worksheets(インデックス).Copy After(またはBefore):=Workbooks("ブック名").Worksheets("シート名")
コピー先のシートの前にブック名を指定します。なお、あらかじめブックは開いておく必要があります。
サンプルコードで確認しましょう。
例えば、各個人が作ったシートを1つのブックにする、という業務を考えてみましょう。表紙というシートだけがある「提出用」というブックに、各個人が自分のシートをコピーする、といった感じでしょうか。
提出用ブックのイメージです。
[実行前]
そして、各個人のブックです。各個人名のブックは1シートのみで、ファイルも同じフォルダに存在しているという前提です。
各個人のブックで、以下のVBAを実行します。
[使用例]
Sub SheetCopy5() Worksheets(1).Copy After:=Workbooks("提出用").Worksheets("表紙") End Sub
[実行結果]
これを各個人のブックで実行すれば、どんどん後ろにシートが追加されます。
ただし、実行した人の順番になるので注意してください。
セルの値のみをコピーする方法
シート間で、セルの値のみをコピーしましょう。セルの書式や数式を無視して値のみをコピーする時は、RangeオブジェクトのValueプロパティを使います。
最初からコピー元とコピー先が存在している想定です。
A1からE6を取得したいのですが、ここでは範囲を固定せず、動的に終わりのセルをとらえます。
A1にカーソルがある状態で、「Ctrl + Shift + End」キーを押すと、以下のようになります。
この範囲を「使用中のセル範囲」といいます。
「Ctrl + Shift + End」キーをVBAで実装し、かつとなりのシート「吉田」へコピーしてみましょう。
[使用例]
Sub SheetCopy6() Dim MaxRow As Long '最終セルの行番号 Dim MaxColumn As Integer '最終セルの列番号 '一番左上から、使用中のセル範囲を取得 MaxRow = Range("A1").SpecialCells(xlLastCell).Row MaxColumn = Range("A1").SpecialCells(xlLastCell).Column 'フォームをアクティブ化する Sheets("フォーム").Activate With Sheets("吉田") .Range("A1", .Cells(MaxRow, MaxColumn)).Value = _ Range("A1", Cells(MaxRow, MaxColumn)).Value End With End Sub
[実行結果]
シート「吉田」へコピーできました。
Sheets(“フォーム”).Activateとしてアクティブ化したので、RangeやCellsの頭に何も付いていないところはフォームを指定したのと同じになります。
なおSpecialCellsプロパティを使って、使用中のセル範囲の終わりを取得するやり方は、以下を参考にどうぞ。
シートを移動する方法
シートをコピーした後は、シートの順番がバラバラになって見づらい場合がよくあります。例えば、以下のようになってしまったら、見づらいですよね。
これもVBAを使って自動化しましょう!
シートを移動するには、Moveメソッドを使います。Moveメソッドの使い方はCopyメソッドと同じです。
シートの移動を、上記の例を使ってやってみましょう。
[使用例]
Sub SheetMove() Worksheets("フォーム").Move after:=Worksheets(Worksheets.Count) Worksheets("メンバー").Move after:=Worksheets(Worksheets.Count) End Sub
[実行結果]
移動ができました。
Worksheets.Countにてシート数を取得して末尾を指定しています。
まとめ
この記事では、シートのコピーや移動について解説しました。
ぜひマスターして、効率的なシートの操作ができるようになってくださいね!