「動けばいい」は卒業せよ:VBAを「遺産」ではなく「資産」にするための規律
VBAは、しばしば「誰でも書ける手軽な言語」と揶揄される。だが、それは大きな間違いだ。VBAは、Excelという巨大なオブジェクト・モデルを直接操る、極めて強力かつ危険な言語である。
多くの現場で、数ヶ月前の自分が書いたコードを読み解けず、「これ、どうやって動かしてるんだ?」と冷や汗をかいた経験はないだろうか。あるいは、前任者のスパゲッティコードに翻弄され、改修のたびにバグを生み出していないだろうか。
「動くコード」を作るのは素人だ。プロは「メンテナンスされることを前提とした、堅牢な構造」を設計する。
本稿では、VBAを業務自動化の武器として使いこなすための、インデントとコメントにおける「絶対原則」を伝授する。
—
1. インデントは「ロジックの視覚化」である
インデントを怠ることは、設計図のないままビルを建てるに等しい。VBAのVBE(Visual Basic Editor)はレガシーだが、インデントのルールを徹底するだけで、コードの「不具合の巣窟」は即座に特定可能になる。
最低限守るべきルール
- スペース4つを絶対とする: タブ文字は環境によって表示幅が崩れる。必ず「ツール > オプション > エディタ > タブ幅」で設定を統一せよ。
- ブロック単位でインデントする: `If`, `For`, `Do`, `Select Case` の内部は、必ず一段深くせよ。
- インデントが深すぎるなら設計ミス: 5段階以上のネストが発生しているなら、それは「1つのプロシージャが複数の責務を負っている」証拠だ。速やかにサブプロシージャへ切り出せ。
—
2. コメントは「何をしているか」ではなく「なぜそうしたか」を書く
多くのエンジニアは、コードの直後に `i = i + 1 ‘ 1を足す` といった無意味なコメントを書く。これはコードの可読性を下げるノイズだ。
コメントの真の価値は「仕様の背景」と「制約条件の明示」にある。
コメントを書くべき3つのタイミング
1. プロシージャのヘッダー: 引数、戻り値、副作用(どのシートを書き換えるか)を明記せよ。
2. トリッキーなロジック: なぜ標準的な方法ではなく、その迂回ルートをとったのか(APIの制約や、メモリ節約の意図など)。
3. 外部連携の前提条件: ファイルパスの仕様や、データベース接続のタイムアウト設定など、外部に依存する箇所。
—
3. 実践:保守性を高める「プロダクション・コード」の型
では、保守性を担保し、後任者が泣かないコードの例を見てほしい。
‘ ==============================================================================
‘ 機能:指定されたフォルダ内のCSVを一括でDBへインポートする
‘ 引数:targetPath (String) – 対象フォルダのパス
‘ 備考:エラー時はログを出力し、処理を中断する(トランザクション制御)
‘ ==============================================================================
Public Sub ImportCsvData(ByVal targetPath As String)
Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ 1. 事前条件のチェック(ガード節)
If Not fso.FolderExists(targetPath) Then
Err.Raise vbObjectError + 1001, , “指定されたパスが存在しません。”
End If
‘ 2. メインループのインデントを維持
Dim targetFile As Object
For Each targetFile In fso.GetFolder(targetPath).Files
‘ 拡張子チェックのロジック
If LCase(fso.GetExtensionName(targetFile.Name)) = “csv” Then
‘ ここで個別インポートを実行
‘ サブプロシージャへ分離することで、可読性とテスト容易性を確保
Call ProcessIndividualFile(targetFile.Path)
End If
Next targetFile
‘ クリーンアップ
Set fso = Nothing
End Sub
このコードが「プロの設計」である理由
- ガード節の導入: 異常系を先に処理することで、メインのロジックがネストせず、フラットに保たれている。
- ヘッダーコメント: この関数が何をして、どんなリスクがあるかを一目で理解できる。
- 責務の分離: `ProcessIndividualFile` というサブプロシージャに処理を委譲することで、修正の影響範囲を最小限に抑えている。
—
最後に:コードは「対話」である
VBAを書くとき、あなたは誰かと会話している。未来の自分、あるいは次にこのツールを引き継ぐ同僚とだ。
インデントを揃え、意図をコメントに残すことは、相手に対する敬意であり、あなた自身の時間を守るための投資である。「動くコード」で満足するステージは終わりだ。 これからは、読みやすく、堅牢で、誰が触っても壊れない「プロダクション・コード」を追求してほしい。
それができるエンジニアだけが、Excelという強力な武器を真に掌握できるのだ。
