Excelの「マクロの記録」は入門として便利ですが、記録されたコードをそのまま使い続けると冗長・固定・不安定という3つの問題に直面します。記録コードを「たたき台」として捉え、不要な部分を削り、変数化・整理する習慣をつけることで、保守しやすい実用的なコードに変えられます。
この記事では、次の内容を順番に解説します。
- 自動記録で起きやすい3つの問題パターン
- 「選択→操作」を省略して直接操作に書き直す方法
- 固定されたシート・セルを変数化する方法
- 不要なプロパティを削ってスリムにする方法
自動記録コードの3つの問題パターンを知るには?
自動記録で生成されるコードに共通する問題を整理します。それぞれの問題と改善の方向性を把握してから、具体的な修正方法を見ていきましょう。
| 問題パターン | 原因 | 改善方向 |
|---|---|---|
| 冗長(Select/Selection の多用) | 記録が「クリックした操作」を忠実に再現するため | Select を省いて直接操作に書き直す |
| 固定(特定シート・セルのハードコーディング) | 記録時の環境がそのままコードに埋め込まれるため | 変数を使って汎用化する |
| 不要プロパティが多い | 変更していない設定項目まで全部記録されるため | 目的に関係ないプロパティを削除する |
「選択→操作」を省略して書き直すには?
自動記録では「セルを選択してから操作する」という手順がそのままコードになります。VBAはセルを選択しなくても直接操作できるため、Select・Selection の2行を1行にまとめられます。
'自動記録のコード(冗長)
Range("B2").Select
Selection.Font.Bold = True
'書き直し後(シンプル)
Range("B2").Font.Bold = True
より実際的な例で比較します。
'自動記録版(セルの選択が多用されている)
Sub RecordedMacro()
Range("A1").Select
Selection.Value = "完了"
Range("B1").Select
Selection.Font.Bold = True
Range("C1").Select
Selection.Interior.Color = RGB(255, 255, 0)
End Sub
'書き直し版(選択なしで直接操作)
Sub CleanedMacro()
Range("A1").Value = "完了"
Range("B1").Font.Bold = True
Range("C1").Interior.Color = RGB(255, 255, 0)
End Sub
書き直し版では行数が半分になり、画面のチカチカ(セル選択の移動)もなくなります。処理速度も上がります。
固定されたシートとセルを変数化するには?
自動記録では操作時のシート名やセル番地がコードに直接書き込まれます。別のシートや行で同じ処理をしたいときに使えません。変数を使うと汎用性が大きく上がります。
'自動記録版(シートとセルが固定)
Sheets("Sheet1").Select
Range("A1").Select
ActiveCell.Value = "完了"
'書き直し版その1(直接指定)
Sheets("Sheet1").Range("A1").Value = "完了"
'書き直し版その2(変数を使って柔軟に)
Dim ws As Worksheet
Dim targetRow As Long
Set ws = Sheets("Sheet1")
targetRow = 5 '動的に変えられる
ws.Cells(targetRow, 1).Value = "完了"
シート名をコードに直書きしたい場合は定数(Const)にすると、変更時に1か所だけ直せば済みます。
Const SHEET_NAME As String = "Sheet1"
Dim ws As Worksheet
Set ws = Sheets(SHEET_NAME)
不要なプロパティを削ってスリムにするには?
書式変更を記録すると、変更していない項目まですべてコードに含まれます。本当に変えたいプロパティだけを残し、それ以外は削除します。
'自動記録版(変更していないプロパティまで含まれている)
With Selection.Font
.Name = "MS Pゴシック"
.Size = 11
.Bold = True
.Italic = False
.Underline = xlUnderlineStyleNone
.Color = -16777216
.TintAndShade = 0
.ThemeFont = xlThemeFontNone
End With
'書き直し版(目的の操作だけ残す)
Range("B2").Font.Bold = True
削除してよいプロパティの判断基準は「この記述がなくても目的の結果になるか?」です。なくても結果が変わらないなら削除してOKです。
記録コードを整理する手順を確認するには?
自動記録のコードを実用レベルに整理するための流れです。
| ステップ | 作業内容 |
|---|---|
| 1. 動作確認 | まず記録されたコードをそのまま実行して、意図通りに動くか確認する |
| 2. Select を除去 | 「〇〇.Select + Selection.〇〇」を「〇〇.〇〇」の1行に書き直す |
| 3. 不要プロパティを削除 | 変更していない設定項目(Font.Name・Italic など)を削除する |
| 4. シート・セルを変数化 | ハードコーディングされたシート名やセル番地を変数または定数に変える |
| 5. 再度動作確認 | 整理後のコードを実行して、意図通りに動くか確認する |
まとめ
- 自動記録は「出発点」として使い、完成品として使い続けないことが重要
- Select・Selection の多用は省略できる。直接操作に書き直すとコードが短くなり処理も速くなる
- シート名・セル番地のハードコーディングは変数や定数に変えると汎用性が上がる
- 変更していない不要なプロパティは削除してOK。「なくても同じ結果になるか?」で判断する
- 記録→整理の繰り返しが、VBAを手書きできる力につながる
よくある質問
SelectとActiveSheetを使っていても動くのですが、直す必要はありますか?
動作自体はしますが、Select を使うと処理中に選択セルが動き、他の処理と干渉する可能性があります。また画面が更新されるたびにチカチカして処理が遅くなります。直さなくてもいい場面もありますが、コードを人に見せる・長く使う・処理速度が気になる場合は直しておく方がよいです。
ActiveCellやSelectionを変数化するにはどうすればいいですか?
現在の選択セルや選択範囲を変数に格納するには Set rng = Selection または Set rng = ActiveCell と書きます。ただし、処理の途中で選択が変わると変数の参照も変わる可能性があるため、できるだけ明示的に Sheets("Sheet1").Range("A1") のような書き方に直すのがベストです。
自動記録のコードでも動いているので、わざわざ直す意味はありますか?
今動いていても、データの量や構成が変わると動かなくなることがあります。また他の人が読んでも意図が伝わらないコードは、引き継ぎ・修正・デバッグが難しくなります。「動く」と「メンテナンスしやすい」は別の話で、長く使うコードほど整理する価値があります。
自動記録を勉強のツールとして使う方法はありますか?
とても有効な使い方です。「Excelでこの操作をVBAでやるにはどう書くのか?」を調べたいときに、一度記録してコードを確認する方法があります。そのコードを見ながら「どのプロパティが何を操作しているか」を読み解くことで、VBAの書き方を自然に覚えていけます。
Application.ScreenUpdatingとの組み合わせは必要ですか?
Select を多用していたコードを直接操作に書き替えた後でも、大量の行を処理する場合は Application.ScreenUpdating = False を入れると処理が速くなります。Select の除去だけでも十分速くなることが多いですが、数百〜数千行を扱う処理では組み合わせるとさらに効果的です。
動画で学びたい方へ
「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。
VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。



