【実務・中級編】【上級プロ向け】クラウドストレージ(SharePoint / OneDrive)APIと直結したCDRファイルの排他制御、競合回避、および自動バージョン同期パイプラインの構築 – CorelDRAW VBA解析バイブル

スポンサーリンク

【CorelDRAW VBA × クラウドストレージ】SharePoint/OneDrive API直結:CDRファイルの排他制御と自動バージョン同期パイプラインの構築

ベクターグラフィックスの制作現場において、複数デザイナーによるリモートワークやクラウドストレージ(SharePoint / OneDrive)の導入はもはや標準だ。しかし、ここで必ず発生するのが「ファイルの上書き競合(オーバーライト・コンフリクト)」という致命的な問題である。

ローカルに同期されたCDRファイルを無造作に編集し、知らぬ間に他のデザイナーの変更を吹き飛ばしてしまった……。この絶望的な事故を防ぐため、私たちは「祈りながら保存する」のをやめ、コードでシステムを統制しなければならない。

今回は、CorelDRAW VBAから直接クラウドストレージのAPIを叩き、「ファイルの動的ロック(排他制御)」、「競合回避」、そして「自動バージョン同期パイプライン」を構築する極限のテクニックを伝授する。

—

なぜ「フォルダの同期機能」だけでは破綻するのか?

多くの現場が、OneDriveやSharePointの標準クライアントによるファイル同期に依存している。だが、CorelDRAWの巨大なCDRファイルを扱う上で、これは地雷原を歩くようなものだ。

  • タイムラグの罠: 同期完了前のファイルを別のユーザーが開くことで、意図しない「競合ファイル(Conflict Copy)」が生成される。
  • メモリ・I/Oの重み: CorelDRAWが一時ファイルを生成・削除する挙動と、クラウド同期デーモンのファイル監視がバッティングし、保存エラーやファイル破損(Corruption)を引き起こす。
  • 権限の欠落: 「誰が今、そのデザインを編集しているのか」をCorelDRAWのUI上で視覚的に把握できない。

これらを解決するには、VBAから直接Microsoft Graph API等(またはSharePoint REST API)を制御し、ファイルを開く瞬間にクラウド上で排他ロックを取得するアーキテクチャが必要となる。

—

全体アーキテクチャ設計

エンタープライズ環境における堅牢なパイプラインは、以下の3層で構成する。

1. プリ・チェック層(Pre-Check):
CorelDRAWでドキュメントを開く(または新規作成して保存する)際、API経由でSharePoint上のメタデータおよびロック状態を確認する。
2. 排他制御層(Lock & Exclusive):
他者が編集中であれば読み取り専用(Read-Only)で強制し、自身が編集権を持つ場合は即座にクラウド上でチェックアウト(ロック)を実行する。
3. ポスト・同期層(Post-Sync):
保存時にローカルの変更をアップロードしつつ、一意のバージョンタグ(ハッシュまたはタイムスタンプ)を付与して同期パイプラインを完結させる。

—

実装:CorelDRAW VBAからSharePoint/OneDriveを制御する

以下のプロダクションコードは、Microsoft Graph APIを利用してSharePoint上のCDRファイルのロック状態を確認し、安全な排他制御を行うための実践的なVBAモジュールである。

※実運用では、OAuth 2.0のアクセストークン取得部分を適切に環境に合わせて実装してほしい。ここではAPI通信の核心部とCorelDRAWのライフサイクル連携に絞る。

‘ ==============================================================================
‘ Module: clsCloudLockManager
‘ Desc: SharePoint / OneDrive APIを用いたCDRファイルの排他制御クラス
‘ ==============================================================================
Option Explicit

Private m_Token As String
Private m_SiteURL As String
Private m_FileID As String

‘ 初期設定
Public Sub Initialize(ByVal AccessToken As String, ByVal SiteURL As String, ByVal FileID As String)
m_Token = AccessToken
m_SiteURL = SiteURL
m_FileID = FileID
End Sub

‘ 1. クラウド上のファイルのロック状態(チェックアウト状態)を確認する
Public Function CheckRemoteLockStatus() As Boolean
Dim http As Object
Set http = CreateObject(“MSXML2.XMLHTTP.6.0”)

Dim apiURL As String
apiURL = m_SiteURL & “/_api/web/getfilebyserverrelativeurl(‘” & m_FileID & “‘)/CheckOutType”

On Error GoTo ErrorHandler
http.Open “GET”, apiURL, False
http.setRequestHeader “Authorization”, “Bearer ” & m_Token
http.setRequestHeader “Accept”, “application/json;odata=verbose”
http.send

If http.Status = 200 Then
‘ CheckOutType が 0 以外(または取得できた場合)の解析
‘ 0 = None (Unlocked), 1 = Online, 2 = Offline
If InStr(http.responseText, “0“) > 0 Then
CheckRemoteLockStatus = False ‘ ロックされていない(安全)
Else
CheckRemoteLockStatus = True ‘ 誰かがロック中
End If
Else
Err.Raise 1001, “CloudLock”, “API通信エラー: ” & http.statusText
End If
Exit Function

ErrorHandler:
MsgBox “ロック状態の確認に失敗しました: ” & Err.Description, vbCritical
CheckRemoteLockStatus = True ‘ 安全側に倒してロック中とみなす
End Function

‘ 2. クラウド上でファイルを排他ロック(チェックアウト)する
Public Function AcquireRemoteLock() As Boolean
Dim http As Object
Set http = CreateObject(“MSXML2.XMLHTTP.6.0”)

Dim apiURL As String
apiURL = m_SiteURL & “/_api/web/getfilebyserverrelativeurl(‘” & m_FileID & “‘)/checkout()”

On Error GoTo ErrorHandler
http.Open “POST”, apiURL, False
http.setRequestHeader “Authorization”, “Bearer ” & m_Token
http.setRequestHeader “X-RequestDigest”, GetFormDigest()
http.send

If http.Status = 200 Or http.Status = 204 Then
AcquireRemoteLock = True
Else
AcquireRemoteLock = False
End If
Exit Function

ErrorHandler:
AcquireRemoteLock = False
End Function

‘ 3. フォームダイジェストの取得(SharePoint REST API用ヘルパー)
Private Function GetFormDigest() As String
‘ 実装簡略化のためダミーを返す。実際は _api/contextinfo から取得すること
GetFormDigest = “”
End Function

—

CorelDRAW イベントハンドラとの統合(`GlobalMacros`)

この排他制御を「デザイナーが意識せずとも自動で発動する」ようにするのがプロの仕事だ。CorelDRAWのグローバルマクロ(`GlobalMacroStorage`)の `DocumentOpen` や `Save` イベントをフックし、強制的にパイプラインを通過させる。

‘ ==============================================================================
‘ Class Module: ThisMacroStorage (GlobalMacroStorage)
‘ Desc: CorelDRAWのドキュメントライフサイクルを監視し、クラウド連携を強制する
‘ ==============================================================================
Option Explicit

Private Sub Application_DocumentOpen(ByVal Doc As Document, ByVal FileName As String)
‘ 対象がクラウド管理下のCDRファイルである場合のみ実行
If Not IsCloudManagedPath(FileName) Then Exit Sub

Dim cloudMgr As New clsCloudLockManager
‘ トークンやサイト情報の取得(環境変数や設定ファイルから読み込み)
cloudMgr.Initialize “DUMMY_OAUTH_TOKEN”, “https://your-tenant.sharepoint.com/sites/DesignTeam”, FileName

‘ 排他チェック
If cloudMgr.CheckRemoteLockStatus Then
MsgBox “【警告】このファイルは現在、他のデザイナーが編集中です。” & vbCrLf & _
“読み取り専用モードで開きます。”, vbExclamation, “排他制御システム”

Doc.ReadOnly = True
Exit Sub
End If

‘ 自動ロックの試行
If Not cloudMgr.AcquireRemoteLock() Then
MsgBox “ファイルの排他ロックの取得に失敗しました。強制的に読み取り専用で開きます。”, vbCritical
Doc.ReadOnly = True
Else
MsgBox “クラウド上の排他ロックを取得しました。編集を開始できます。”, vbInformation, “同期パイプライン”
End If
End Sub

Private Function IsCloudManagedPath(ByVal path As String) As Boolean
‘ OneDriveやSharePointの同期フォルダパスが含まれているか判定
If InStr(1, path, “SharePoint”, vbTextCompare) > 0 Or _
InStr(1, path, “OneDrive”, vbTextCompare) > 0 Then
IsCloudManagedPath = True
Else
IsCloudManagedPath = False
End If
End Function

—

現場で絶対に陥る「罠」とチーフアーキテクトからの助言

1. VBAからのHTTPS通信の限界:
VBAの `MSXML2.XMLHTTP` はモダンな認証(MFAやAzure ADの複雑なトークンフロー)を直接処理するのが困難だ。実務では、C#等で作成した軽量なローカル常駐型コンソールアプリ(またはCOMアドイン)をVBAから `Shell` 関数やWScript.Shell経由で叩く「ハイブリッドアーキテクチャ」を採用するのが最も堅牢である。
2. CorelDRAWのバックグラウンド保存との競合:
CorelDRAWの「自動バックアップ(Autobackup)」機能がクラウド同期フォルダ内に一時ファイルを乱立させると、APIの排他制御とコンフリクトを起こす。クラウド管理下のドキュメントでは、ローカルの安全な一時ディレクトリにバックアップを出力するよう、環境設定をスクリプト側で強制上書き(`CorelScriptTools` の活用)すべきだ。
3. 例外処理の怠慢によるデッドロック:
VBAの途中でエラーが発生し、クラウド上のロックが外れたまま取り残される「幽霊ロック(Zombie Lock)」を防ぐため、必ず `On Error GoTo` を実装し、異常終了時でもロック解除APIを叩くクリーンアップ処理を担保すること。

—

結びにかえて

ツールは、人間の「うっかり」をカバーするために存在する。
「誰かが上書きしてデザインが消えた」という言い訳を、プロの現場からコードの力で根絶やしにする。今回紹介したAPI直結型の排他制御パイプラインを導入することで、CorelDRAWは単なるお絵描きソフトから、エンタープライズに耐えうる堅牢なデザインプラットフォームへと進化する。

妥協のないアーキテクチャで、真の自動化と開発者としてのプライドを現場に実装してほしい。

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