【VBAリファレンス】VBA練習問題VBA100本ノック 33本目:マクロ記録の改修

スポンサーリンク

VBA100本ノック33本目:マクロ記録の改修とプロフェッショナルなコードへの昇華

Excel VBAを習得する過程で、誰もが一度は通る道が「マクロ記録」です。しかし、マクロ記録で生成されるコードは、あくまで「操作の追体験」に過ぎません。実務において、マクロ記録のコードをそのまま運用することは、保守性・実行速度・堅牢性の観点から「避けるべき行為」とされています。本稿では、VBA100本ノックの第33本目として提示されている「マクロ記録の改修」をテーマに、なぜマクロ記録をそのまま使ってはいけないのか、そして、どのようにリファクタリングすべきかを技術的な視点から徹底解説します。

マクロ記録が抱える構造的な問題点

マクロ記録機能は、ユーザーの操作を逐一キャプチャし、それをコードに落とし込むという非常に優れた機能です。しかし、そこにはプロフェッショナルな開発現場では看過できない「3つの大きな欠陥」が存在します。

第一に「冗長なSelectionとActivateの多用」です。マクロ記録は、ユーザーが画面上でセルを選択したという操作をそのままコード化します。例えば、A1セルに値を入力する際、記録機能は「Range(“A1”).Select」「Selection.Value = “値”」という2行を生成します。しかし、VBAのオブジェクトモデルでは、わざわざセルを選択しなくても「Range(“A1”).Value = “値”」と記述するだけで完結します。選択(Select)は、画面の描画処理を伴うため、実行速度を著しく低下させる主因となります。

第二に「絶対参照による柔軟性の欠如」です。記録されたコードは、操作した時点のシート名やセル番地を直接指定します。もしシート名が変わったり、データの行数が増減したりした場合、コードは即座にエラーを吐くか、意図しない場所を操作することになります。

第三に「不要なプロパティ設定の混入」です。書式設定などを記録すると、設定を変更していないプロパティまで含めて、膨大なコードが出力されます。これらはコードの可読性を著しく下げ、デバッグを困難にします。

マクロ記録を「実務レベル」に昇華させるリファクタリングの鉄則

マクロ記録のコードを実務で使えるレベルに改修するには、以下のステップを踏む必要があります。

1. オブジェクトの明示とSelectの排除
「ActiveSheet」や「Selection」への依存を排除し、WorkbookやWorksheetオブジェクトを明示的に変数に格納します。これにより、どのブックのどのシートを操作しているのかが明確になります。

2. 変数化による動的処理への対応
固定のセル番地(例: A1:A10)を直接記述するのではなく、最終行を自動取得する「Cells(Rows.Count, 1).End(xlUp).Row」のような手法を用いて、データ量に依存しない動的なコードへ書き換えます。

3. 不要なコードの断捨離
記録されたコードのうち、処理の本質に関係のない「Select」や「Activate」を削除し、一撃で値を代入したり、範囲を操作したりする記述に統合します。

サンプルコード:リファクタリングの実践

以下に、マクロ記録で出力されがちな「非効率なコード」と、それをプロフェッショナルな記述に改修した「推奨コード」を比較提示します。


' --- マクロ記録で生成される非効率なコード例 ---
Sub MacroRecordExample()
    Range("A1").Select
    ActiveCell.FormulaR1C1 = "売上データ"
    Range("A1").Select
    With Selection.Font
        .Name = "MS Pゴシック"
        .Size = 12
        .Bold = True
    End With
    ' このようにSelectionが繰り返され、画面描画が発生する
End Sub

' --- 改修後のプロフェッショナルなコード ---
Sub RefactoredCode()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Sheet1")
    
    ' Selectを排し、オブジェクトを直接指定
    With ws.Range("A1")
        .Value = "売上データ"
        With .Font
            .Name = "MS Pゴシック"
            .Size = 12
            .Bold = True
        End With
    End With
End Sub

この改修により、コードの行数は削減され、実行速度は大幅に向上します。また、`ws`という変数を通じてシートを操作しているため、シート名が変更されても変数定義の一箇所を修正するだけで対応可能となります。

実務における「保守性」を高めるためのアドバイス

実務の現場において最も重要なのは「自分以外が読んでも理解できること」です。マクロ記録のコードは、往々にして「誰が何をしているのか」が不明瞭になりがちです。

まず、マジックナンバー(直接記述された数字)を避けてください。例えば、データの最終列を「5」と決め打つのではなく、定数や変数として管理します。次に、エラーハンドリングを必ず追加してください。マクロ記録のコードは、予期せぬ入力値やシートの欠落に対して脆弱です。「On Error GoTo」によるエラー検知や、事前にオブジェクトがNothingでないかを確認する処理を組み込むことで、堅牢なシステムとなります。

また、頻繁に行う処理(最終行の取得や、特定シートのクリアなど)は、個別のプロシージャ(SubやFunction)として独立させ、必要に応じて呼び出す設計にしましょう。これにより、コードの再利用性が高まり、修正が必要になった際も一箇所を直せば全体に反映されるという、メンテナンス性の高い構造を構築できます。

まとめ

マクロ記録は、VBAにおける「学びのツール」としては極めて優秀ですが、「完成品のコード」ではありません。マクロ記録で生成されたコードは、あくまで「素材」です。そこから不要な装飾(SelectやActivate)を取り除き、オブジェクトを明示し、動的なデータに対応できるよう変数化することで、初めてプロフェッショナルなツールへと昇華されます。

VBA100本ノックの33本目が教えてくれる教訓は、「記録したものを鵜呑みにせず、常にコードの裏にあるオブジェクトモデルを意識せよ」ということです。この意識を持つことで、あなたの書くVBAコードは、単なる自動化ツールから、堅牢で保守性の高いシステムへと進化するでしょう。今日から、マクロ記録した後の「コードの掃除」を習慣化してください。それが、脱初心者への最短ルートです。

タイトルとURLをコピーしました