概要:なぜ「配列」による複数シート選択が最強なのか
Excel VBAで複数のシートに対して同じ処理を行いたい場面は、実務において非常に多く存在します。例えば、「全シートの特定のセルをクリアする」「全シートの印刷設定を一括変更する」「特定の条件を満たすシートだけを別ブックにコピーする」といったケースです。
初学者が陥りやすい罠は、For Eachループを使ってWorksheetsオブジェクトを一つずつアクティブにして処理を行う方法です。しかし、この方法は画面の再描画が発生しやすく、処理時間が大幅に増大する原因となります。ここで真価を発揮するのが、配列を用いた複数シートの選択です。WorksheetsオブジェクトのSelectメソッドにシート名の配列を渡すことで、VBAはそれらのシートを「グループ化」し、あたかも一つのシートであるかのように一括操作が可能になります。本記事では、この手法を実務レベルで使いこなすための技術と、注意すべきポイントを徹底解説します。
詳細解説:Selectメソッドと配列の密接な関係
VBAでシートを複数選択するには、Worksheets.Selectメソッドを使います。通常、引数を省略すると「現在選択されているシート」が操作対象となりますが、ここにシート名の配列を渡すと、VBAはその配列に含まれる全てのシートを同時に選択状態にします。
この手法の最大の利点は「処理の簡潔化」と「パフォーマンスの向上」です。一つずつシートを巡回するループ処理と比較して、メモリの書き込み回数や画面更新のオーバーヘッドを最小限に抑えることができます。
しかし、ここで注意が必要なのは、Selectメソッドは「アクティブなブック」に対してのみ有効であるという点です。また、選択するシートが多すぎる場合や、存在しないシート名を配列に格納してしまった場合、実行時エラーが発生します。そのため、配列を作成する段階で「シートの存在確認」を行うロジックを組み込むのがプロの流儀です。
サンプルコード:安全かつ高速な複数シート選択の実装
以下に、特定のキーワードを含むシートのみを抽出し、それらを一括で選択して書式設定を行う実用的なコードを提示します。
Sub SelectSheetsByArray()
Dim ws As Worksheet
Dim sheetNames() As String
Dim count As Long
Dim targetKeyword As String
' 検索キーワードを設定
targetKeyword = "2023"
count = 0
' 対象シートをカウントして配列のサイズを決定
For Each ws In ThisWorkbook.Worksheets
If InStr(ws.Name, targetKeyword) > 0 Then
ReDim Preserve sheetNames(count)
sheetNames(count) = ws.Name
count = count + 1
End If
Next ws
' 対象が見つかった場合のみ処理を実行
If count > 0 Then
' 画面更新を停止して高速化
Application.ScreenUpdating = False
' 配列を渡して複数シートを選択
Sheets(sheetNames).Select
' 選択されたグループに対して一括処理を実行
With ActiveWindow.SelectedSheets
.Range("A1").Value = "更新済み"
.Range("A1").Interior.Color = vbYellow
End With
' 選択を解除(最初のシートのみを選択状態に戻す)
ThisWorkbook.Worksheets(sheetNames(0)).Select
Application.ScreenUpdating = True
MsgBox count & "枚のシートを更新しました。", vbInformation
Else
MsgBox "対象のシートが見つかりませんでした。", vbExclamation
End If
End Sub
このコードのポイントは、ReDim Preserveを使用して動的に配列を拡張している点です。これにより、対象シートの数が事前に不明であっても、柔軟に処理を行うことができます。
実務アドバイス:エラーを回避するためのベストプラクティス
実務でこの技術を運用する際、以下の3点に注意してください。
1. 非表示シートの取り扱い:
Selectメソッドは、非表示シートが含まれているとエラーを吐くことがあります。配列を作成するループの中で、必ず「If ws.Visible = xlSheetVisible Then」という条件式を入れ、表示されているシートのみを対象にするよう制御してください。
2. 画面更新の制御:
大量のシートを選択して操作する場合、Application.ScreenUpdating = False は必須です。これを行わないと、画面が激しく点滅し、ユーザーに不安を与えるだけでなく、処理速度が劇的に低下します。
3. 選択解除の重要性:
処理が終わった後、シートがグループ化されたままの状態(タブが複数白くなっている状態)でユーザーにファイルを返すと、ユーザーが意図せず全シートを同時に編集してしまい、データ破壊の原因となります。処理の最後には必ず単一シートを選択し、グループ化を解除するコードを記述してください。
4. 大規模データへの対応:
もし対象となるシートが数百枚に及ぶ場合、配列のサイズ制限やメモリ消費の問題が発生する可能性があります。その場合は、配列を数分割して処理するか、ループ処理の中で処理単位を細分化する設計変更を検討してください。
まとめ:VBA中級者へのステップアップ
今回解説した「配列を用いた複数シート選択」は、VBAのコードを劇的に短くし、実行速度を向上させるための非常に強力な武器です。単なる「ループ処理の置き換え」と捉えるのではなく、「グループ操作による一貫性の確保」という視点を持つことが重要です。
実務においては、コードの実行速度以上に「メンテナンス性」が求められます。今回紹介したような配列による動的なシート制御は、シート名が変わっても柔軟に対応できるため、長期的に使える高品質なマクロとなります。
ぜひ、日々の業務で手動で行っている「シートを一つずつ選択して値を貼り付ける」といった作業を、このコードに置き換えてみてください。その圧倒的な処理速度と、確実な操作性に驚くはずです。VBAを使いこなすということは、Excelの制約から解放されるということです。本記事の技術を習得し、より高度な自動化の世界へ足を踏み入れてください。
