【VBAリファレンス|実務向け】第20回 マクロ記録ではできないシートを末尾に挿入 1/4

スポンサーリンク

なぜ「シートの末尾挿入」が重要なのか

実務で「週次報告書」や「日報」を作成する際、テンプレートとなるシートをコピーして、常に一番後ろに追加したいというケースは非常に多いはずです。しかし、Excelの「マクロ記録」機能を使ってシートをコピーすると、記録されたコードは「どのシートの前に挿入するか」という固定的な位置指定になってしまいがちです。これでは、シートが増えるたびにマクロを修正しなければなりません。今回は、VBAでシートを常に末尾へ動的に追加する方法を学び、実務の自動化レベルを一段階引き上げましょう。

基礎知識:WorksheetsコレクションとCountプロパティ

VBAでシートを操作する際、ブック内の全シートを管理しているのが「Worksheetsコレクション」です。このコレクションには「何枚シートがあるか」を示す「Count」というプロパティがあります。
例えば、シートが5枚ある場合、Worksheets.Countは「5」を返します。このプロパティを「After」引数(~の後に配置する)と組み合わせることで、常に最後尾を指定することが可能になります。

実装の考え方

シートをコピーするメソッドは「Copy」です。このメソッドには「Before(~の前)」と「After(~の後)」という引数があります。
通常、マクロ記録では特定のシート名を指定してしまいますが、これを以下のように書き換えます。
Worksheets(“テンプレート”).Copy After:=Worksheets(Worksheets.Count)
これにより、常に一番最後のシート番号を指定できるため、シートが何枚増えても対応可能なロジックが完成します。

サンプルプログラム

以下のコードは、指定したシートを常に末尾へコピーする標準的なプロシージャです。

Sub AddSheetToEnd()
‘ エラー回避のため、コピー元のシート名を指定します
Dim wsTemplate As Worksheet
Set wsTemplate = ThisWorkbook.Worksheets(“テンプレート”)

‘ Worksheets.Countで現在の総シート数を取得し、その後にコピーします
‘ After引数を使うことで、自動的に末尾へ挿入されます
wsTemplate.Copy After:=Worksheets(Worksheets.Count)

‘ コピーされたシートに名前を付ける等の応用も可能です
ActiveSheet.Name = “報告書_” & Format(Date, “mmdd”)

MsgBox “シートを末尾に追加しました。”
End Sub

応用・注意点

現場で活用する際のポイントを2点挙げます。
1. シート名の重複エラー:コピー後のシート名が既存のシート名と重複するとエラーになります。上記サンプルのように、日付を付与するなどして一意の名前を付ける工夫が必要です。
2. 非表示シートの存在:もしブック内に非表示シートが含まれている場合でも、Worksheets.Countはそれらを含めてカウントします。もし「表示されているシートの末尾」に限定したい場合は、ループ処理で表示状態を確認する必要があります。

まずはこのシンプルな「After:=Worksheets(Worksheets.Count)」という記述をマスターし、マクロ記録の枠を超えた柔軟なツール作成に挑戦してみてください。

タイトルとURLをコピーしました