【入門編】実務で役立つ「定数管理シート」の構築:コードを書き換えずに設定変更を実現する設計 – Excel VBA解析バイブル

スポンサーリンク

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の基本はバッチリですよ」――自信を持って、次なる自動化のステージへ進んでください。

何か分からないことや、さらに深い実装の相談があれば、いつでも聞いてくださいね。応援しています!

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