Excel VBAを掌握する極限の知見:ハードコーディングを卒業し、「設定管理シート」で保守性を極める
こんにちは。日々の自動化業務、お疲れ様です。
マクロの記録から一歩踏み出し、自力でコードを書けるようになると、誰もが一度は「ある罠」に陥ります。それは、コードの中に直接値を書き込んでしまう「ハードコーディング」という呪縛です。
「フォルダのパス」や「処理対象の列番号」をコードの中にベタ書きしていませんか?
もし仕様変更があった際、わざわざVBAエディタを開いて修正していませんか?
今回は、プロのエンジニアが現場で必ず採用する「定数管理シート」を用いた設計手法を伝授します。これさえマスターすれば、コードを一切いじらずにマクロの挙動をコントロールできるようになりますよ。
—
1. なぜ「ハードコーディング」を排除すべきなのか?
コードの中に値を直接書くと、以下のような悲劇が起こります。
- 保守性の崩壊: 担当者が変わった時、どこを直せばいいか分からない。
- リスクの増大: 修正時に誤ってプログラムのロジック(`If`文や`For`文など)を消してしまう。
- 柔軟性の欠如: ユーザーがちょっと設定を変えたいだけなのに、プログラミングの知識が必要になる。
これらを解決するのが「設定はシートに逃がす」という設計思想です。
—
2. 「定数管理シート」の構築手順
まずは、Excel上に「設定用」のシートを作成しましょう。シート名を `Config` とします。
| A列(キー名) | B列(設定値) |
| :— | :— |
| FolderPath | C:\Reports\2023\ |
| TargetColumn | 5 |
| RetryCount | 3 |
このように、「設定名」と「値」を対にしてテーブル化します。これだけで、プログラムは「どこを読みに行けばいいか」を知ることができます。
—
3. 実践:VBAで「定数管理シート」を読み込む
VBA側では、このシートを読み込むための「辞書(Dictionary)」を作るのが最も効率的かつスマートです。
‘ 必要なライブラリ:Microsoft Scripting Runtime を参照設定してください
‘ ツール > 参照設定 > Microsoft Scripting Runtime にチェック
Option Explicit
Public Function LoadConfig() As Object
Dim dict As Object
Set dict = CreateObject(“Scripting.Dictionary”)
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(“Config”)
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
‘ 設定値を辞書に格納(キーと値のペアにする)
Dim i As Long
For i = 2 To lastRow
dict.Add ws.Cells(i, 1).Value, ws.Cells(i, 2).Value
Next i
Set LoadConfig = dict
End Function
‘ — 実行用メインプロシージャ —
Sub MainProcess()
Dim config As Object
Set config = LoadConfig() ‘ 設定を一括読み込み
‘ 設定値を利用する(コード内にハードコーディングは一切なし!)
Debug.Print “対象フォルダ: ” & config(“FolderPath”)
Debug.Print “対象列番号: ” & config(“TargetColumn”)
‘ これ以降、プログラムのロジックを記述していく
End Sub
このコードのポイント
1. 辞書型(Dictionary)の活用: `config(“FolderPath”)` のように記述できるため、値がどこにあるか直感的に分かります。
2. 分離の原則: 設定シートの値を変更しても、VBAのコードをコンパイルし直す必要はありません。ユーザーはExcelを操作するだけで設定を変えられます。
—
4. 初学者が陥りやすい罠と対策
① 参照設定の忘れ
上記のコードで `Scripting.Dictionary` を使用していますが、慣れないうちはエラーになることがあります。
- 対策: `CreateObject(“Scripting.Dictionary”)` と記述すれば、参照設定なしでも動作します(遅延バインディングといいます)。まずはこれで動かしてみるのが吉です。
② シート名が変わったら動かない
シート名を変更するとエラーになります。
- 対策: シートの「オブジェクト名(コード名)」を利用しましょう。プロパティウィンドウで `(Name)` を `shtConfig` にしておけば、シート名が変更されてもコードは影響を受けません。
—
5. まとめ:プロへの第一歩
今回の手法を身につけると、あなたの書くVBAは「プログラム」から「システム」へと進化します。
- ハードコーディングを排除する
- 設定とロジックを分離する
- 辞書オブジェクトで値を管理する
この3点を守るだけで、あなたの書いたマクロは驚くほど頑丈で、誰にとっても扱いやすいものになります。「ここをクリアすれば、Excel VBAの基本はバッチリですよ」――自信を持って、次なる自動化のステージへ進んでください。
何か分からないことや、さらに深い実装の相談があれば、いつでも聞いてくださいね。応援しています!
