こんにちは。ベテランExcel VBA講師の「師範」です。
前回からお送りしている「マクロ記録ではできないシートを末尾に挿入」というテーマ、今回はその第2回目となります。
前回は、なぜ「マクロの記録」機能では「常にシートを末尾に追加する」という動作が記録できないのか、その理由を解説しました。おさらいすると、マクロの記録は「操作したその瞬間の状態」を記録するため、「現在のシート数」を動的に判断できないからでしたね。
今回は、いよいよVBAコードの核心部分に迫ります。「どうやってExcelに『末尾』を認識させるか」という、プログラミングの基礎にして奥義とも言えるロジックを解説していきます。
「末尾」という概念をコードに翻訳する
Excel VBAにおいて、シートを挿入する命令は `Worksheets.Add` です。このメソッドには引数が用意されており、どこに挿入するかを指定することができます。
具体的には、`Before` 引数(指定したシートの前)または `After` 引数(指定したシートの後ろ)を使います。しかし、ここで問題になるのが「最後尾のシートがどれか」という情報です。
例えば、`Worksheets.Add After:=Worksheets(3)` と書けば、3番目のシートの後ろに挿入されます。しかし、ブック内のシートが増減した場合、常に3番目が最後尾とは限りませんよね。
ここで使うべきなのが、`Worksheets.Count` というプロパティです。
Worksheets.Count の魔法
`Worksheets.Count` は、そのブックに含まれるシートの総数を返します。
もしシートが5枚あれば、`Worksheets.Count` は「5」という数値を返します。
つまり、`Worksheets(Worksheets.Count)` と書くことで、常に「その時点で一番右端にあるシート」を指し示すことができるのです。これが、動的な処理を実現するための第一歩です。
実際にコードを書いてみよう
では、実際に「末尾にシートを追加する」ためのコードを記述してみましょう。
Sub AddSheetToEnd()
‘ 新しいシートを、現在の最後のシートの後ろに追加する
Worksheets.Add After:=Worksheets(Worksheets.Count)
End Sub
このコードを分解して解説します。
1. `Worksheets.Add`: シートを新規作成するコマンドです。
2. `After:=`: 「~の後ろに」という指定です。
3. `Worksheets(Worksheets.Count)`: ここがポイントです。`Worksheets.Count` で総数を取得し、その番号のシートを指名しています。
非常にシンプルですが、これこそが「マクロの記録」では決して辿り着けない、プログラミングによる動的な制御です。
なぜ「After」を使うべきなのか
ここで少しだけ技術的な深掘りをしましょう。なぜ `Before` ではなく `After` を使うのか。
もちろん、`Before` を使って「最後尾のシートの直前」に挿入することも不可能ではありません。しかし、シートの順序を管理する上で、`After` を使う方が直感的であり、かつトラブルが少ないのです。
特に、ブックに「集計用シート」や「設定用シート」などが混在している場合、`After` を使って「一番右端」を基準にするというルールを徹底しておけば、シート構成が変わってもマクロがエラーを吐くリスクを最小限に抑えられます。
エラーを回避するための「変数」活用術
初心者の方が陥りやすいミスとして、「シートを操作している間に、別のシートがアクティブになってしまう」というケースがあります。
コードをより堅牢(ロバスト)にするために、一度変数に格納する書き方をおすすめします。
Sub AddSheetSafely()
Dim lastSheet As Worksheet
‘ 最後のシートを変数に格納
Set lastSheet = Worksheets(Worksheets.Count)
‘ そのシートの後ろに追加
Worksheets.Add After:=lastSheet
End Sub
このように `Set` ステートメントを使ってオブジェクト変数に格納することで、コードの可読性が格段に上がります。また、後々「追加したシートに名前を付ける」「追加したシートにデータを転記する」といった拡張を行う際にも、この変数 `lastSheet` を起点に処理を繋げることができるため、メンテナンス性が飛躍的に向上します。
次回の予告:さらに複雑な要求に応える
いかがでしたでしょうか。今回は `Worksheets.Count` を使った「末尾の特定」について解説しました。
しかし、実務では「末尾に追加する」だけでは足りないケースが多々あります。例えば、「特定の名前を持つシートの直後に挿入したい」や「追加したシートに自動で連番を振りたい」といった要求です。
次回(3/4)は、もう少し踏み込んで「追加したシートを制御する(名前の変更や配置の工夫)」について解説します。ただ追加するだけでなく、その後の処理を見据えた「プロの設計思想」を伝授しますので、ぜひ楽しみにしていてください。
VBAの学習は、小さな「できた!」の積み重ねです。まずはこの `Worksheets.Count` を使ったコードを、ご自身の環境で実際に動かしてみてください。シートが増えていく様子を見るだけで、自動化の醍醐味が感じられるはずですよ。
それでは、また次回の講義でお会いしましょう。
