Project VBAを掌握せよ:リソース整合性を「自動バリデーション」で担保する極限の設計術
プロジェクトマネジメントにおいて、リソース管理は「血液の循環」だ。単価が空欄のリソース、カレンダーが未設定の要員。これらが放置されたプロジェクトは、いずれ「予算超過」と「スケジュールの破綻」という心不全を起こす。
多くの現場では、Excelのセルを眺めながら担当者が手動でチェックしているが、それはエンジニアの仕事ではない。今回は、Project VBAの深いレイヤーを理解し、「壊れない」「属人化しない」「拡張性がある」リソースバリデーションツールの設計思想を伝授する。
—
1. なぜ「If文の羅列」はゴミコードなのか
初心者が書くバリデーションは、大抵こうだ。
`If Cells(i, 1) = “” Then …` と延々と条件分岐を重ねる。これは保守性の死を意味する。仕様変更で「単価」の定義が変わった瞬間、コード全体を書き直す羽目になるからだ。
真のアーキテクトが目指すべきは「データ駆動型バリデーション」である。
チェックすべき項目を「定義シート(設定値)」として切り出し、コードはそれを読み込んで動的に判定する。ロジックとデータを分離せよ。これが堅牢なシステムを作る第一歩だ。
—
2. 実装の要諦:疎結合な設計思想
今回作成するツールは、以下の3フェーズで動作する。
1. メタデータ定義: どの列が必須か、どんな形式であるべきかを別シートで管理。
2. バリデーションエンジン: 定義をループ処理し、対象リソースを検証。
3. レポート生成: エラー箇所を可視化し、修正を促すリストを自動出力。
堅牢なバリデーション・ロジック(プロダクションコード)
以下のコードは、単なるコピペ用ではない。業務の要件が変わっても、設定シートをいじるだけで対応できる「汎用モジュール」だ。
Option Explicit
‘ Project VBA リソースバリデーションエンジン
‘ 設計思想: 定義シート(Config)に基づき、動的にリソースシートを検証する
Public Sub ExecuteResourceValidation()
Dim wsData As Worksheet, wsConfig As Worksheet
Dim lastRow As Long, i As Long, colIndex As Integer
Dim colName As String, isRequired As Boolean
Set wsData = ThisWorkbook.Sheets(“ResourceList”)
Set wsConfig = ThisWorkbook.Sheets(“ValidationConfig”) ‘ [項目名, 必須フラグ]を定義
‘ エラーログ初期化
Debug.Print “— バリデーション開始 —”
lastRow = wsData.Cells(wsData.Rows.Count, 1).End(xlUp).Row
‘ 2行目からデータ検証開始
For i = 2 To lastRow
‘ 設定シートをループし、定義に基づいてチェック
Dim configRow As Integer
configRow = 2
Do While wsConfig.Cells(configRow, 1).Value <> “”
colName = wsConfig.Cells(configRow, 1).Value
isRequired = wsConfig.Cells(configRow, 2).Value
‘ 列番号の取得(Findメソッドで動的に解決)
On Error Resume Next
colIndex = wsData.Rows(1).Find(colName).Column
On Error GoTo 0
‘ 必須チェックの実装
If isRequired And Trim(wsData.Cells(i, colIndex).Value) = “” Then
HighlightError wsData.Cells(i, colIndex), “必須項目未入力”
End If
configRow = configRow + 1
Loop
Next i
MsgBox “検証完了。不備のあるセルを赤くハイライトしました。”, vbInformation
End Sub
Private Sub HighlightError(targetCell As Range, msg As String)
With targetCell
.Interior.Color = RGB(255, 200, 200) ‘ 警告色
.AddComment msg ‘ エラー内容をコメントに付与
End With
End Sub
—
3. ファイル連携とパフォーマンスの「罠」
このツールを共有ネットワークドライブで運用する場合、以下の2点に注意せよ。
- 排他制御とロック: 複数人が同時に編集する環境では、VBAでの直書きは避けるべきだ。理想は「入力用フロントエンド」と「マスタDB(SQL ServerまたはAccess)」の分離。VBAはあくまでAPI経由でデータを叩くインターフェースに徹すること。
- イベントの無効化: 大規模なリストを走査する場合、`Application.ScreenUpdating = False` と `Application.Calculation = xlCalculationManual` は必須だ。これを行わないコードは、現場のエンジニアの貴重な時間を奪う「低速なスクリプト」でしかない。
—
結論:ツールは「文化」を変える
バリデーションツールを導入するということは、単にエラーを見つける作業を自動化するだけではない。「データが正しくなければプロジェクトは進められない」という規律をチームに植え付けることに真の価値がある。
もしあなたがこのコードを導入するなら、まず「なぜこの項目が必須なのか」をチーム全員に問い直してほしい。無意味な項目をチェックさせているなら、それはコードの欠陥以前の問題だ。
さあ、コードを書き換えろ。あなたの作ったそのツールが、プロジェクトの未来を救うことになるのだから。
