概要:マクロ記録という「未完成の設計図」を実務レベルへ引き上げる
Excelの「マクロの記録」機能は、VBA初心者にとって魔法のようなツールです。しかし、ベテランの視点から見れば、それはあくまで「叩き台」に過ぎません。記録機能は、ユーザーが行った操作を逐一、忠実に再現しようとするあまり、本質的に不要な記述や、処理速度を著しく低下させる「ゴミコード」を大量に生成します。本稿では、第7回シリーズの第3弾として、記録されたマクロから「Select」や「Activate」といった冗長な記述を排除し、実務に耐えうる、高速かつ堅牢なコードへリファクタリングする具体的な手法を詳細に解説します。
詳細解説:なぜマクロ記録は「Select」を多用するのか
マクロ記録が生成するコードの最大の特徴は、対象となるセルやシートをいちいち「選択(Select)」し、その「選択されている対象(Selection)」に対して操作を行うという点です。これは、人間がExcel上でマウスを使って操作する順序をそのままプログラムに変換しているためです。
しかし、VBAの世界では、セルを選択する必要は全くありません。むしろ、選択という動作は画面の描画更新を発生させ、処理速度を大幅に低下させる最大の要因となります。
例えば、記録機能で作成された以下のコードを見てください。
Range("A1").Select
Selection.Value = "売上データ"
Selection.Font.Bold = True
この3行の処理は、実は1行で完結します。
Range("A1").Value = "売上データ"
Range("A1").Font.Bold = True
さらに、同じセルに対して複数のプロパティを設定する場合、Withステートメントを用いることで、コードの可読性を高め、オブジェクトへの参照コストを最小化できます。
With Range("A1")
.Value = "売上データ"
.Font.Bold = True
End With
このように、「記録されたコードをそのまま動かす」のではなく、「記録されたコードの意味を読み解き、VBA本来の文法に書き換える」ことこそが、中級者への登竜門です。
サンプルコード:記録コードの最適化プロセス
以下のサンプルは、記録機能で作成した「ある範囲に罫線を引く」というマクロを、プロフェッショナルな記述へと最適化する過程を示しています。
【記録機能が自動生成する冗長なコード例】
Sub FormatTable_Record()
Range("B2:D10").Select
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlThin
End With
'(中略:他にも多くの不要なプロパティ設定が続く)
End Sub
【最適化されたプロフェッショナルなコード例】
Sub FormatTable_Pro()
' 画面描画を停止して高速化を図る
Application.ScreenUpdating = False
With Range("B2:D10").Borders
.LineStyle = xlContinuous
.Weight = xlThin
End With
Application.ScreenUpdating = True
End Sub
この最適化により、コード行数は半分以下に削減され、処理速度は劇的に向上します。また、ScreenUpdatingプロパティを制御することで、マクロ実行中の画面のチラつきを防ぎ、ユーザーにストレスを与えない洗練されたツールへと進化させることができます。
実務アドバイス:メンテナンス性を左右する「変数」の導入
コードを綺麗にするもう一つの重要なステップは、「ハードコーディングされた値を排除すること」です。記録機能で生成されたコードには「”A1″」や「”Sheet1″」といった具体的な文字列が直接書き込まれています。しかし、実務ではデータの行数は日々変化します。
「Range(“A100”)」と書けば100行目までしか処理できませんが、「Cells(Rows.Count, 1).End(xlUp).Row」を使って最終行を動的に取得すれば、データ量が変わってもマクロを書き直す必要はなくなります。
また、頻繁に参照するシートや範囲は、オブジェクト変数(Worksheet型やRange型)に格納する癖をつけましょう。
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("売上管理")
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
' 以降、ws.Range("A1:C" & lastRow) のように記述する
変数を使用することで、将来的な仕様変更(シート名の変更や列の追加など)に対して、コードの修正箇所を最小限に抑えることができます。これが「保守性の高いコード」を書くための必須技術です。
まとめ:マクロ記録は「先生」ではなく「参考資料」として活用せよ
今回の連載を通じて強調したいのは、マクロ記録機能はあくまで「プログラミングの学習や、プロパティ名を調べるための辞書」として活用すべきだということです。記録されたコードを鵜呑みにせず、常に「もっと効率的な書き方はあるか?」「このSelectは本当に必要か?」と自問自答する姿勢が、あなたを真のVBAエンジニアへと成長させます。
1. Select/Activateを徹底的に排除し、直接オブジェクトを操作する。
2. Withステートメントを活用してコードの可読性を上げる。
3. Application.ScreenUpdatingを制御して実行速度を改善する。
4. 固定値を避け、変数や最終行取得ロジックを用いて動的に処理する。
この4つの鉄則を守るだけで、あなたの書くマクロは劇的に変化します。次回はシリーズ最終回として、エラーハンドリングとデバッグの極意について解説します。まずは今回学んだリファクタリングを、ご自身が過去に作成したマクロで試してみてください。コードの掃除は、技術力向上への最短ルートです。
