【入門編】【上級者向け】プロジェクトファイル内のバイナリ破損を検知するためのチェックサム検証マクロ – Project VBA解析バイブル

スポンサーリンク

プロジェクトの「命」を守る。バイナリ破損を未然に防ぐチェックサム検証術

こんにちは。Project VBAの世界へようこそ。
大規模なスケジュール管理やリソース調整をVBAで自動化していると、避けて通れないのが「プロジェクトファイルの破損」という悪夢です。

「保存したはずなのに開けない」「ファイルサイズがゼロになった」。そんな絶望を味わう前に、私たちは技術者として「保存されたファイルが、本当に書き込まれた通りに存在しているか」を機械的に証明しなければなりません。

今日は、Project VBAの最深部を覗き込み、ファイル保存の整合性を担保する「チェックサム検証」の極意を伝授します。

なぜ「保存」を疑う必要があるのか?

VBAで `FileSaveAs` を実行したとき、OSやネットワークドライブの背後では複雑なI/O処理が行われています。しかし、VBAのコードが `True` を返したとしても、実際にはディスクの不具合やセッションの切断により、データが断片的にしか書き込まれていないケースがあります。

これを検知するのが「チェックサム(ハッシュ値)」です。
ファイルの内容を数学的に変換し、一意の文字列を生成する。保存前と保存後のこの値が一致すれば、「データは正常に生存している」と断言できるのです。

実装の戦略:SHA256ハッシュによる検証

VBA単体では高度な暗号処理が苦手ですが、Windows標準の `CAPICOM` や `ADODB.Stream` を活用することで、強力なハッシュ検証が可能です。今回は、モダンな開発現場でも通用する `ADODB.Stream` を使用した手法を紹介します。

ステップ1:チェックサム計算エンジンの構築

まずは、指定されたパスのファイルを読み込み、ハッシュ値を計算する関数を用意します。

‘ プロジェクトファイル等のバイナリからSHA256ハッシュを生成する関数
Function GetFileHash(ByVal filePath As String) As String
Dim stream As Object
Dim hasher As Object

‘ ADODB.Streamでバイナリデータを取得
Set stream = CreateObject(“ADODB.Stream”)
stream.Type = 1 ‘ adTypeBinary
stream.Open
stream.LoadFromFile filePath

‘ ここでは簡略化のため、ハッシュ生成ロジックの核となる部分をイメージしてください
‘ 本来はCAPICOM等を使用しますが、環境依存を避ける場合は
‘ PowerShellを呼び出してハッシュを取得するのが最も堅牢です
GetFileHash = ExecutePowerShellHash(filePath)

stream.Close
End Function

ステップ2:保存前後の検証マクロ

メイン処理です。「保存前」にハッシュを計算し、「保存後」に再度計算して比較する。これだけでプロジェクトの生存確認が完了します。

Sub SaveAndVerifyProject()
Dim targetPath As String
Dim hashBefore As String, hashAfter As String

targetPath = “C:\Projects\MasterSchedule.mpp”

‘ 1. 保存前のハッシュ取得
hashBefore = GetFileHash(targetPath)

‘ 2. プロジェクトの保存実行
On Error Resume Next
FileSaveAs Name:=targetPath
If Err.Number <> 0 Then
MsgBox “保存プロセスでエラーが発生しました”
Exit Sub
End If
On Error GoTo 0

‘ 3. 保存後のハッシュ取得
hashAfter = GetFileHash(targetPath)

‘ 4. 整合性チェック
If hashBefore = hashAfter Then
MsgBox “整合性確認:OK。ファイルは正常に保存されました。”
Else
MsgBox “警告:ファイルが破損している可能性があります!”
End If
End Sub

陥りやすい罠と解決策

初学者がこのロジックで躓くポイントは大きく分けて2つです。

1. 「保存中」のファイルロック問題

  • `FileSaveAs` が完了した直後にハッシュ計算を走らせると、OS側がまだファイルを解放していないことがあります。少しだけ `Sleep` 関数で待機(1〜2秒)させるのが、現場の知恵です。

2. ハッシュ値が常に変わってしまう

  • Projectファイルは保存するたびに、ファイル内のメタデータ(最終保存日時など)が書き換わることがあります。この場合、単純なバイナリ比較ではなく、プロジェクト固有のデータ領域だけを抽出するか、ファイルサイズが「期待値通り増えているか」を併用して判定しましょう。

プロフェッショナルへの道

ここをクリアしたあなたは、もう「マクロを動かす人」ではありません。「業務の堅牢性を設計するエンジニア」です。

コードをコピペして終わりにするのではなく、「もしエラーが起きたら、バックアップからどう復旧させるか?」という物語の続きまで考えてみてください。エラーハンドリングこそが、優れたVBAコードと素人のコードを分かつ境界線です。

何か不明点があれば、いつでも聞いてください。あなたのProject VBAライフが、より強固で安全なものになるよう、いつでもサポートします。

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