導入
実務でマクロを組んでいると、「特定の条件に一致するシートをまとめて印刷したい」「複数のシートを一括でコピーや削除したい」といった場面に遭遇することがあります。通常、シートを選択する際は配列を使う方法が一般的ですが、ループ処理の中で動的にシートを選択したい場合、Selectメソッドの引数「Replace」を使いこなすことが非常に重要です。今回は、この引数を制御して「選択状態を維持したままシートを追加する」テクニックを解説します。
基礎知識
VBAでシートを選択するには「Worksheet.Select」メソッドを使用します。このメソッドには「Replace」という引数があり、これがシート選択の挙動を左右します。
・Replace:=True(デフォルト)
既存の選択を解除し、指定したシートだけを選択します。
・Replace:=False
既存の選択を維持したまま、指定したシートを「追加」で選択します。
この「False」をうまく使うことで、ループ処理中に条件に合致したシートを次々とグループ化していくことが可能になります。
実装/解決策
論理的な手順は以下の通りです。
1. ループで全シートを巡回する。
2. 条件に合致した「最初の1枚」は、Replace:=Trueで選択する(ここで以前の選択状態をリセットする)。
3. 条件に合致した「2枚目以降」は、Replace:=Falseで選択する(これにより、前のシートが選択されたまま新しいシートが追加される)。
この仕組みにより、柔軟なシート操作が実現できます。
サンプルプログラム
以下のコードは、ブック内から「売上」という文字列で始まるシートをすべて検索し、一括選択する例です。
Sub SelectTargetSheets()
Dim Sh As Worksheet
Dim IsFirstSelected As Boolean
‘ 最初のシートを選択したかどうかを判定するフラグ
IsFirstSelected = False
‘ ブック内の全シートをループ
For Each Sh In ThisWorkbook.Worksheets
‘ シート名が「売上」で始まるか判定
If Sh.Name Like “売上” Then
‘ 最初の1枚目は選択状態をリセットして選択(True)
‘ 2枚目以降は既存の選択を維持して追加(False)
Sh.Select Replace:=Not IsFirstSelected
‘ 初回選択が終わったのでフラグを立てる
IsFirstSelected = True
End If
Next Sh
‘ 対象がなかった場合の通知
If Not IsFirstSelected Then
MsgBox “対象のシートは見つかりませんでした。”
Else
MsgBox “対象のシートを選択しました。”
End If
End Sub
応用・注意点
現場で活用する際のポイントをいくつか挙げます。
・画面更新の停止
シートを選択する処理は画面が激しく動くため、処理速度が低下し、ユーザーにもストレスを与えます。「Application.ScreenUpdating = False」をコードの冒頭に入れ、最後にTrueに戻すことで、高速かつスマートに処理を実行できます。
・エラー回避
非表示のシートに対してSelectメソッドを実行するとエラーが発生します。「If Sh.Visible = xlSheetVisible Then」といった条件を加え、表示されているシートのみを対象にするよう工夫すると、より堅牢なマクロになります。
・選択解除のタイミング
グループ化した後は、操作が終わったら「Worksheets(1).Select」のように、単一のシートを選択し直してグループを解除する癖をつけておくと、後の処理で誤操作を防げます。
