巨大なマクロは「負債」である。VBAを掌握するための「20行分割」の美学
こんにちは。現場で苦しむコードを見てきたエンジニアとして、今日は一つだけ、皆さんに一生モノの技術をお伝えします。
皆さんが書いているそのVBAコード、「1つのプロシージャ(Sub)」に、何行書いていますか?
もし100行、200行と続くコードがあるなら、それは「マクロ」ではなく「魔物」です。修正するたびに別の場所でエラーが出る、あの悪夢のような状況を回避するための唯一の解法。それが「20行以内でのプロシージャ分割」です。
今日は、マクロの記録から脱却し、メンテナンス可能なコードを書くための第一歩を一緒に踏み出しましょう。
—
1. なぜ「20行」なのか?
プログラミングの世界には「可読性の限界」というものがあります。
人間の脳が一度に把握できる情報の塊は限られています。1つのSubが画面をスクロールしないと見渡せないような長さになると、途端に論理構造が崩れます。
- 20行のメリット:
- 画面に収まるので、全体像が一目で理解できる。
- 「何をしているか」が関数名(プロシージャ名)で説明できる。
- 特定の機能だけを切り出して、別のシートやブックでも再利用できる。
—
2. 悪い例:全てを詰め込んだ「スパゲッティ・コード」
まずは、よくある「全部入り」のコードを見てみましょう。
‘ 修正が困難な例:データ処理、書式設定、メール送信が混ざっている
Sub ProcessAllData()
Dim i As Long
‘ データの読み込み
For i = 2 To 100
If Cells(i, 1).Value <> “” Then
‘ 複雑な計算
Cells(i, 2).Value = Cells(i, 1).Value 1.1
‘ 書式設定
Cells(i, 2).Font.Bold = True
‘ 条件付きメール送信判定
If Cells(i, 2).Value > 1000 Then
‘ (ここに長いメール送信処理が続く…)
End If
End If
Next i
End Sub
このコード、どこか一箇所を変えようとすると、全体を壊すリスクがありますね。これが「スパゲッティ・コード」です。
—
3. 良い例:役割を明確にする「分割の魔法」
では、これを「機能」ごとに分解してみましょう。メインの処理は「指揮者」に徹し、個別の処理は「専門家」に任せるのです。
‘ メイン処理:流れを制御するだけ
Sub RunAutomation()
Dim i As Long
For i = 2 To 100
If IsValidData(i) Then
Call CalculateAndFormat(i)
Call SendAlertIfHigh(i)
End If
Next i
End Sub
‘ 専門家1:データ判定
Function IsValidData(row As Long) As Boolean
IsValidData = (Cells(row, 1).Value <> “”)
End Function
‘ 専門家2:計算と書式
Sub CalculateAndFormat(row As Long)
Cells(row, 2).Value = Cells(row, 1).Value 1.1
Cells(row, 2).Font.Bold = True
End Sub
‘ 専門家3:メール判定
Sub SendAlertIfHigh(row As Long)
If Cells(row, 2).Value > 1000 Then
‘ ここにメール送信処理を書く
End If
End Sub
この構造の凄み
- テストが簡単: 例えば計算ロジックを変えたいとき、`CalculateAndFormat`だけを修正すればいい。他には一切影響しません。
- 再利用性: `IsValidData`は、別のマクロでもそのままコピーして使えます。
- デバッグの速さ: エラーが出たとき、どの「専門家」が失敗したのかが一瞬で分かります。
—
4. 初心者が陥りやすい罠と対策
「分割すると、変数の引き渡しが面倒そう…」と感じるかもしれません。
- 罠: 全ての変数をグローバル変数(モジュールの一番上に書くPublic変数)で済ませようとする。
- 解決策: `Call`で呼び出す際に、引数(引数:`row As Long`など)として値を渡す癖をつけてください。最初は難しく感じるかもしれませんが、「その関数が必要なデータだけを渡す」というルールを守れば、バグは劇的に減ります。
—
最後に:プロのエンジニアへの道
ここをクリアすれば、あなたはもう「記録されたマクロを動かすだけの人」ではありません。「業務のロジックを設計するエンジニア」の入り口に立っています。
まずは、今あなたが書いているそのコードを、まずは2つに分けるところから始めてみてください。たったそれだけで、あなたのVBAライフは劇的に安定します。
何かわからないことがあれば、またいつでも聞きに来てくださいね。あなたのコードが、美しく洗練されたものになることを応援しています!
