概要:マクロの記録という「出発点」と、その先にある「最適化」の重要性
VBAを学ぶ過程において、「マクロの記録」は魔法のようなツールです。操作を記録するだけで自動的にコードが生成されるその仕組みは、初心者がコードの構造を理解するための最良の教材といえます。しかし、マクロの記録には大きな欠点があります。それは「記録されたコードは、人間が書くべき効率的なコードとは程遠い」という点です。
本稿では、第7回シリーズの第2弾として、記録されたマクロに必ず含まれる「不要な記述」を特定し、それをどのように削ぎ落としていくかという「コードの最適化」に焦点を当てます。プロのエンジニアは、マクロの記録を「完成品」とは見なさず、あくまで「骨組み」と捉えます。この骨組みを肉付けし、贅肉を落とすプロセスこそが、実務で使えるマクロへと昇華させるための唯一の道なのです。
詳細解説:記録機能が生成する「Select」と「Selection」の呪縛を解く
マクロの記録機能を使ってセルの値を変更したり、書式を設定したりすると、コードには必ずと言っていいほど「Select」や「Selection」という単語が登場します。これはExcelが「ユーザーがどのセルを選択しているか」を逐一追跡しようとするためです。
例えば、「A1セルに『売上報告』と入力し、太字にする」という操作を記録すると、以下のようなコードが生成されます。
Sub RecordMacroExample()
Range("A1").Select
ActiveCell.FormulaR1C1 = "売上報告"
With Selection.Font
.Bold = True
End With
End Sub
このコードには3つの無駄が含まれています。
1. Range(“A1”).Select(A1を選択する)
2. ActiveCell(アクティブなセルを操作する)
3. Selection(選択範囲を操作する)
プロの現場では、これらを「直接参照」という手法で書き換えます。セルを選択するという動作は、Excelの画面描画処理を伴うため、処理速度が大幅に低下する原因となります。数千行のデータ処理を行う場合、この「Select」の有無が数秒から数分の差を生むことになります。
サンプルコード:冗長さを排除した「プロの書き方」への変換
上記の冗長なコードを、実務レベルのコードにリファクタリングしてみましょう。ポイントは「オブジェクトの直接指定」です。
Sub OptimizedMacroExample()
' オブジェクトを直接指定することで高速化と可読性の向上を図る
With Range("A1")
.Value = "売上報告"
.Font.Bold = True
End With
End Sub
このコードであれば、Excelは「A1セルを見に行って、そこに値を書き込み、太字にする」という一連の処理を内部メモリだけで完結させます。画面を切り替える必要がないため、動作は非常に軽快です。
次に、もう少し実務に近い「行の挿入」や「書式のコピー」のケースを見てみましょう。マクロの記録では以下のようなコードが生成されがちです。
' 記録されたコードの典型例(非効率)
Rows("2:2").Select
Selection.Insert Shift:=xlDown
Range("A1").Select
Selection.Copy
Range("A2").Select
ActiveSheet.Paste
これをリファクタリングすると、以下のようになります。
' リファクタリング後のコード(効率的)
Rows(2).Insert Shift:=xlDown
Range("A1").Copy Destination:=Range("A2")
このように、`Select`メソッドを排除し、`Copy`メソッドに`Destination`引数を組み合わせることで、クリップボードを介さない直接的な転記が可能になります。これにより、画面のちらつきも抑えられ、プログラムとしての安定性が飛躍的に向上します。
実務アドバイス:コードを整理するための「3つのチェックリスト」
記録したマクロを修正する際、以下の3点を意識するだけで、コードの品質は劇的に向上します。
1. 「Select」を全削除する
コード全体を眺め、`.Select`という文字列を探してください。もし存在するのであれば、その前の行のオブジェクトと、その後の`Selection`や`ActiveCell`を繋げられないか検討してください。ほとんどの場合、結合が可能です。
2. 「ActiveSheet」や「ActiveWorkbook」に頼らない
マクロの記録は常に「アクティブなもの」を対象にします。しかし、実務ではシート名やブック名を明示的に指定すべきです。例えば `Worksheets(“Sheet1”).Range(“A1”)` と書くことで、予期せぬシートでマクロが実行される事故を防ぐことができます。
3. 「With」ステートメントを活用する
同じオブジェクトに対して複数の設定を行う場合(フォント、サイズ、色、境界線など)、`With`ステートメントを使うことでコードがスッキリし、記述ミスが減ります。
まとめ:マクロの記録は「スタート地点」、そこからの成長がプロへの道
マクロの記録は、決して「手抜き」ではありません。むしろ、VBA初心者が構文を学び、オブジェクトモデルを理解するための強力な武器です。しかし、記録されたコードをそのまま運用し続けることは、未完成の家で暮らすようなものです。
今回紹介した「Selectの排除」と「オブジェクトの直接指定」は、VBAを習得する上で最も重要かつ、最初に越えるべき壁です。この壁を乗り越えたとき、あなたは「動くコードを書く人」から「保守性の高いプログラムを設計できる人」へと一歩進化します。
次回の第3弾では、さらに一歩進んで「変数を使った汎用的なコードへの昇華」について解説します。記録された固定的な数値やセル範囲を、動的な変数に置き換えることで、マクロはより柔軟で強力なツールへと進化します。今回学んだ「削ぎ落とす技術」を基礎として、次回は「組み立てる技術」をマスターしていきましょう。
Excel VBAは、あなたの退屈な事務作業を自動化するだけではありません。論理的思考を鍛え、業務プロセスそのものを最適化するための最強の武器です。記録されたコードに甘んじず、自らの手でコードを磨き上げる喜びを、ぜひ実務の現場で体験してください。
