【CorelDRAW VBA】クラウド時代の排他制御:OneDrive/SharePoint連携で「上書きの悲劇」を根絶する
CorelDRAWの業務フローにおいて、最も非生産的な時間は「誰かが開いているファイルを上書きしてしまった」という報告を受けた後のリカバリーだ。特にOneDriveやSharePointをバックエンドに置く現代のワークフローでは、単純なローカル保存は爆弾を抱えているに等しい。
今日は、VBAを単なる「自動化ツール」から「堅牢なエンタープライズ・ワークフロー」へと昇華させるための、排他制御アーキテクチャを伝授する。
—
1. なぜ「単純な保存」が地雷なのか
VBAで`ActiveDocument.SaveAs`を叩くだけでは、クラウドストレージの同期エンジンは「ファイルのタイムスタンプ更新」としか認識しない。複数人が同時に触れば、同期の競合(Conflict)が発生し、ファイルは無残に破綻する。
我々が実装すべきは、以下の3フェーズだ。
1. ロックの獲得: サーバー上のメタデータに「使用中」フラグを立てる。
2. ローカル作業の完遂: CorelDRAWでの編集。
3. 同期のハンドリングと変換: 保存完了後、自動的にPDF/EPSへ変換し、クラウドへプッシュする。
—
2. 堅牢な設計:排他制御のロジック
APIを直接叩く際、VBA単体では通信の柔軟性に欠ける。ここでは「VBA(CorelDRAW)→ PowerShell(通信レイヤー)→ Microsoft Graph API/OneDrive」というブリッジ設計を採用する。
実装の骨子
- LockFile生成: ファイル名に`.lock`を付与した空ファイルをサーバーに配置する。
- 排他判定: ロックファイルが存在する場合、他のユーザーは「読み取り専用」で開かざるを得ないフローを強制する。
プロダクション用コード例(VBA側)
‘ CorelDRAW VBA: クラウド同期を考慮した安全な保存ルーチン
Public Sub SecureSaveToCloud(ByVal targetPath As String)
Dim lockPath As String
lockPath = targetPath & “.lock”
‘ 1. ロックの確認(他者が編集中でないか)
If Dir(lockPath) <> “” Then
MsgBox “警告: 他のユーザーがこのファイルを編集しています。強制終了します。”, vbCritical
Exit Sub
End If
‘ 2. ロックファイル作成(簡易排他制御)
Open lockPath For Output As #1: Close #1
‘ 3. CorelDRAWの保存処理
On Error GoTo Cleanup
ActiveDocument.SaveAs targetPath
‘ 4. 自動フォーマット変換(PDFエクスポート)
Dim pdfExport As StructExportOptions
Set pdfExport = CreateStructExportOptions()
ActiveDocument.ExportEx targetPath & “.pdf”, cdrPDF, cdrCurrentPage, pdfExport
Cleanup:
‘ 5. ロック解除(必ず実行)
If Dir(lockPath) <> “” Then Kill lockPath
If Err.Number <> 0 Then MsgBox “保存エラー: ” & Err.Description
End Sub
—
3. なぜこの設計が「プロフェッショナル」なのか
上記のコードは、単に動くだけではない。「何が起きてもロックを解放する」という保守性の高い設計思想に基づいている。
- 例外処理の徹底: `On Error GoTo Cleanup`を忘れたツールは、クラッシュ時にロックファイルが残り続け、チーム全員の作業を停止させる「負の遺産」となる。
- 同期のタイミング: CorelDRAWの保存直後に変換を行うことで、クラウド同期エンジンが「`.cdr`」と「`.pdf`」をセットで認識し、不整合を防ぐ。
—
4. さらなる高みへ:Microsoft Graph APIの導入
小規模チームなら上記で十分だが、組織規模が大きくなれば、`Dir()`関数でのファイル判定はネットワーク遅延により失敗する。その場合は、PowerShellを呼び出してMicrosoft Graph APIを直接叩くべきだ。
‘ PowerShellを叩いて、より厳密なWeb API連携を行う例
Sub SyncWithGraphAPI(filePath As String)
Dim shell As Object
Set shell = CreateObject(“WScript.Shell”)
‘ 外部PSスクリプトでOneDrive APIのチェックイン/アウトを実行
Dim cmd As String
cmd = “powershell -ExecutionPolicy Bypass -File C:\Scripts\CheckOutFile.ps1 -Path ‘” & filePath & “‘”
shell.Run cmd, 0, True
End Sub
このアプローチにより、ファイルシステムに依存しない「真の排他制御」が可能になる。
—
アーキテクトからの助言
VBAで組む際、最も避けるべきは「UIスレッドを止め続ける処理」だ。CorelDRAWは重いグラフィック処理を行うため、ファイルIOや同期処理でメインスレッドを占有すると、ユーザーは「フリーズした」と誤認し、タスクマネージャーでプロセスを殺す。
- 非同期を意識せよ: 重い処理は外部スクリプトへ逃がし、VBAは「呼び出し」と「結果待ち」に徹する。
- ログを残せ: 誰がいつファイルを開き、いつロックを解除したか。この履歴があるだけで、トラブルシュートの時間は9割削減される。
自動化とは、単に手作業を置き換えることではない。「チームが安心してクリエイティブに集中できる環境を、システムで保証すること」である。この視点を持って、実装にあたってほしい。
健闘を祈る。
