CorelDRAW VBAを掌握する:SQL Server連携によるベクターアセット自動管理の深淵
業務自動化エンジニア諸君。CorelDRAWのVBAで「なんとなく動くマクロ」を書く段階は卒業したか?
現場で「なぜかファイルがロックされる」「DBの同期でCorelDRAWがフリーズする」といったトラブルに頭を抱えているなら、君はオブジェクトのライフサイクルと非同期処理の境界線を理解できていない。
今回は、CorelDRAWを単なる描画ツールではなく「エンタープライズ・システムの一部」として昇華させる、SQL Server連携型アセット管理システムの設計指針を授ける。
—
1. 悲劇を避けるアーキテクチャ設計
多くの開発者が陥る罠は、「VBA内で直接DB接続を行い、同期的に処理を待つ」ことだ。
CorelDRAWのUIスレッドでネットワークI/Oを発生させれば、巨大なCDRファイルの保存中にアプリが固まるのは必然だ。
堅牢な設計の鉄則
1. 責務の分離: VBAは「ファイル情報の抽出とジョブ投入」のみを行う。
2. 非同期化: 実際のDB登録・サムネイル生成は、バックグラウンドの「Windowsサービス(C#/.NET)」に委ねる。
3. ロックの回避: ファイルを直接DBに突っ込むのではなく、ファイルパスとメタデータを「キュー(Queue)」として渡し、DB側で処理させる。
—
2. 実践:VBAによるフックと情報抽出
CorelDRAWの`DocumentBeforeSave`イベントをフックし、必要なメタデータをJSON化してローカルの監視フォルダに投げる実装が最も堅牢だ。
‘ DocumentBeforeSave イベントでの実装例
Private Sub GlobalMacroStorage_DocumentBeforeSave(ByVal Doc As Document, ByVal FileName As String)
On Error GoTo ErrHandler
‘ 1. ファイルの整合性チェック
If Doc.ReadOnly Then Exit Sub
‘ 2. メタデータの抽出(カスタムプロパティを活用)
Dim assetId As String
assetId = Doc.Properties(“AssetID”).Value ‘ 事前に設定したカスタムメタデータ
‘ 3. サムネイルの生成(一時ファイルとして出力)
Dim exportPath As String
exportPath = “C:\Temp\Export\” & assetId & “.png”
Dim expFilter As ExportFilter
Set expFilter = Doc.ExportEx(exportPath, cdrPNG, cdrSelection, cdrMixedColorDepth, 150, 150)
expFilter.Finish
‘ 4. JSONジョブファイルの生成(これをC#の監視サービスが拾う)
Call WriteJobFile(assetId, FileName, exportPath)
Exit Sub
ErrHandler:
Debug.Print “Asset Sync Error: ” & Err.Description
End Sub
—
3. C#によるバックグラウンド・プロセッサ(要点)
VBAから吐き出されたジョブファイルを監視し、SQL Serverへ登録するC#のコードの一部だ。`FileSystemWatcher`を使用する。
// ファイル監視とSQL Serverへの登録(概念コード)
public void OnCreated(object sender, FileSystemEventArgs e) {
var data = LoadJobFile(e.FullPath); // JSONをパース
using (var conn = new SqlConnection(“ConnectionString”)) {
conn.Open();
var cmd = new SqlCommand(
“INSERT INTO AssetRegistry (AssetID, FilePath, ThumbPath, Version) VALUES (@id, @path, @thumb, @ver)”, conn);
cmd.Parameters.AddWithValue(“@id”, data.Id);
cmd.Parameters.AddWithValue(“@path”, data.FilePath);
cmd.Parameters.AddWithValue(“@thumb”, data.ThumbPath);
cmd.Parameters.AddWithValue(“@ver”, DateTime.Now.Ticks);
cmd.ExecuteNonQuery();
}
// 処理完了後に一時ファイルを削除
File.Delete(e.FullPath);
}
—
4. エンタープライズレベルでの注意点
オブジェクトの破棄(Disposeの哲学)
VBAで`ExportFilter`や`Document`オブジェクトを触る際、明示的に`Set Object = Nothing`を行うのは基本中の基本だが、これだけでは足りない。CorelDRAWの内部メモリは非常に不安定だ。大規模なループ処理を行う場合は、定期的に`DoEvents`を挟み、メモリリークの兆候がないか監視せよ。
バージョン管理の罠
SQL Server側で管理する際、ファイルパスだけを記録しても意味がない。「ファイルのハッシュ値(SHA-256)」をDBに保持せよ。パスが変わっても中身が同じであれば再登録を防げるし、ファイルが改ざんされた際の検知にもなる。
なぜこの設計なのか
- 疎結合: VBAが落ちても、DB側は影響を受けない。
- 拡張性: 将来的にAIによる画像解析(タグ自動生成)を追加したくなった場合、C#側のロジックを修正するだけでCorelDRAW側は一切触る必要がない。
—
最後に:エンジニアとしての矜持
自動化とは、単にコードを書くことではない。「システム全体の挙動を制御し、ボトルネックを排除すること」だ。
CorelDRAW VBAは、強力だが古い。その古さを逆手に取り、最新のクラウド・DB技術を周辺に配置することで、最強の自動化システムが完成する。このコードをベースに、君たちの現場の「負」を解消してほしい。
何かあればまた聞け。コードの向こう側にある「真の効率化」について語り合おう。
