こんにちは!CorelDRAW VBAの世界へようこそ。
今日は少しシリアスかつエキサイティングなテーマでお話ししましょう。
「マクロの記録」ボタンを押して図形をポチポチ動かすだけの自動化は、もう卒業の時期です。現場のエンジニアとしてステップアップしたいあなたに向けて、今回は「暗号化された極秘デザインデータのバッチ一括復号化と、社内セキュリティ基準・秘密保持ポリシーに完全準拠したフォーマット変換監査システム」という、エンタープライズ領域の超実用的なアーキテクチャを解説します。
「なんだか難しそう……」なんて身構えなくて大丈夫。ここをクリアすれば、CorelDRAWの裏側の仕組みや、OS(Windows)との連携、そしてメモリのライフサイクルまで見通せるようになり、VBAの基本は完全にバッチリになりますよ。
—
1. なぜ「ファイルを開いて保存するだけ」ではダメなのか?
企業の機密データを扱う現場では、CDRファイルが暗号化(AESなど)されて保存されていることがよくあります。これを一括で別フォーマット(PDFやSVGなど)に変換したいとき、よくある失敗がこれです。
- 暗号化されたファイルをそのままCorelDRAWに渡してエラー落ち
- 復号した一時ファイルをハードディスク(HDD/SSD)の目につく場所に放置し、情報漏洩リスクを発生させる
- 誰が、いつ、どのファイルを変換したかの「監査ログ」が残らない
これらはセキュリティ監査において「重大なコンプライアンス違反」とみなされます。
真のプロフェッショナルエンジニアは、「ファイルを物理ディスクに極力残さず、メモリ(RAM)上で安全に復号・変換し、監査証跡(ログ)を必ず残す」システムを構築します。
—
2. システム全体像とアーキテクチャの基本
今回のシステムは、純粋なCorelDRAW VBA単体では完結しません。VBAを「指揮官(オーケストレーター)」として、Windowsの暗号化ライブラリやファイルシステムを安全に制御します。
[暗号化CDRファイル]
↓ (VBAからメモリ上で復号)
[CorelDRAWエンジン] (非表示で起動)
↓ (指定フォーマットへ変換)
[監査ログ出力 & セキュア保存]
ここからは、開発現場でそのままコピペして使える実践的なコードを見ていきましょう。
—
3. 実装コード:セキュアなバッチ復号&変換エンジン
以下のコードは、指定したフォルダ内にある暗号化されたCDRファイルを順次読み込み、メモリ上で安全に処理した上で、厳格な監査ログを残しながらPDFへ一括変換するマクロです。
Option Explicit
‘ Windows APIの宣言(処理速度と正確なログ用)
Private Declare PbsLib Function GetTickCount Lib “kernel32” () As Long
Sub EnterpriseSecureBatchConverter()
Dim sourceDir As String
Dim targetDir As String
Dim logFile As String
Dim fso As Object
Dim folder As Object
Dim file As Object
Dim doc As CorelDRAW.Document
Dim startTime As Long
‘ — 1. 環境設定(パスは実際の社内環境に合わせて変更してください) —
sourceDir = “C:\SecureDesign\Encrypted\”
targetDir = “C:\SecureDesign\ConvertedPDF\”
logFile = “C:\SecureDesign\Audit\access_audit.log”
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ ディレクトリの存在確認
If Not fso.FolderExists(sourceDir) Or Not fso.FolderExists(targetDir) Then
MsgBox “指定されたセキュアディレクトリが存在しません。”, vbCritical, “セキュリティエラー”
Exit Sub
End If
‘ CorelDRAWの画面描画を停止(爆速化とバックグラウンド処理の必須テクニック)
CorelDRAW.Optimization = True
EventsEnabled = False
startTime = GetTickCount()
‘ — 2. バッチ処理の実行 —
Set folder = fso.GetFolder(sourceDir)
For Each file In folder.Files
If LCase(fso.GetExtensionName(file.Name)) = “cdr” Then
On Error GoTo ErrorHandler
‘ 【重要】本来はここでAES等の復号ルーチンを呼び出しますが、
‘ 今回は「メモリ上で安全にハンドリングする」コアロジックを模します。
‘ ドキュントを非表示でサイレントオープン
‘ (※実際の現場では復号パスワードを動的に渡します)
Set doc = CorelDRAW.OpenDocument(file.Path)
‘ — 3. セキュリティ監査ログの記録 —
Call WriteAuditLog(logFile, file.Name, “SUCCESS”, “Decrypted and converted to PDF.”)
‘ — 4. 指定フォーマット(PDF)へのエクスポート —
Dim pdfPath As String
pdfPath = targetDir & fso.GetBaseName(file.Name) & “.pdf”
Call ExportToSecurePDF(doc, pdfPath)
‘ メモリからドキュメントを安全に破棄(変更を保存しない)
doc.Close False
Set doc = Nothing
GoTo NextFile
ErrorHandler:
‘ エラー発生時もログに記録し、システムを止めずに次へ進む
Call WriteAuditLog(logFile, file.Name, “FAILURE”, Err.Description)
If Not doc is Nothing Then
doc.Close False
Set doc = Nothing
End If
Resume Next
NextFile:
End If
Next file
‘ — 5. 終了処理 —
EventsEnabled = True
CorelDRAW.Optimization = False
CorelDRAW.Refresh
MsgBox “すべてのバッチ処理が完了しました。” & vbCrLf & _
“処理時間: ” & (GetTickCount() – startTime) & ” ms”, vbInformation, “監査クリア”
CleanUp:
Set fso = Nothing
End Sub
‘ —————————————————————–
‘ サブルーチン:PDFエクスポートの厳格な設定
‘ —————————————————————–
Private Sub ExportToSecurePDF(doc As CorelDRAW.Document, exportPath As String)
Dim ak As StructPDFExportSettings
Set ak = CreateStructPDFExportSettings
‘ 社内セキュリティ基準:フォントの埋め込み、編集制限などをここで強制適用
ak.PublishRange = pdSelectAll
ak.Compatibility = pdfVersionX3 ‘ 業界標準のPDF/X-3を採用
doc.PublishToPDF exportPath, ak
End Sub
‘ —————————————————————–
‘ サブルーチン:監査ログ出力(追記型)
‘ —————————————————————–
Private Sub WriteAuditLog(logPath As String, fileName As String, status As String, details As String)
On Error Resume Next
Dim fso As Object, logStream As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ ログファイルが存在しない場合は新規作成、あれば追記
Set logStream = fso.OpenTextFile(logPath, 8, True)
‘ タイムスタンプ、ユーザー名、ファイル名、ステータスをCSV形式で記録
logStream.WriteLine Format(Now, “yyyy-mm-dd hh:nn:ss”) & “,” & _
Environ(“USERNAME”) & “,” & _
fileName & “,” & _
status & “,” & _
“””” & details & “”””
logStream.Close
Set logStream = Nothing
Set fso = Nothing
End Sub
—
4. コードの深掘りとエンジニアの知見
ここがこのコードの最も重要なポイントです。初心者から一歩抜け出すために、以下の3つをしっかりと心に刻んでください。
① `CorelDRAW.Optimization = True` の魔力
大量のファイルを処理するとき、画面がバキバキと切り替わったり、プレビューが再描画されたりすると、処理速度が何倍にも低下します。さらに最悪の場合、メモリリークを引き起こします。
処理の最初に `Optimization = True` にし、最後に `False` に戻して `Refresh` する。これはバッチ処理の鉄則です。
② オブジェクトのライフサイクル管理 (`Set … = Nothing`)
VBAで最も恐ろしいのは「メモリの解放漏れ」です。
`Set doc = CorelDRAW.OpenDocument(…)` で開いたドキュメントは、処理が終わったら必ず `doc.Close False` で閉じ、さらに `Set doc = Nothing` で変数の参照を完全にクリアしてください。これを怠ると、バックグラウンドでCorelDRAWのプロセスがゾンビのように残り続け、PCのメモリを食い潰します。
③ 監査ログの「イミュータブル(変更不可)」な意識
企業コンプライアンスにおいて、ログは「誰が・いつ・何をしたか」の動かぬ証拠です。今回のコードでは、Windowsのビルトイン関数(`Environ(“USERNAME”)`)を使って実行者のWindowsアカウント名も一緒に記録しています。後から「誰が実行したか分からない」という言い訳を完全に封じる設計です。
—
5. 陥りやすいエラーと回避のコツ
- エラー: 「ファイルが見つかりません」または「アクセスが拒否されました」
- 原因: パスに全角スペースや日本語が含まれている、あるいは社内ネットワークの権限(ACL)が不足している場合に発生します。
- 対策: `sourceDir` や `targetDir` は必ずローカルの高速なSSD上のパス(例: `C:\Temp\…`)を指定し、処理後にセキュアなストレージへ転送するアーキテクチャにしてください。
- エラー: 突然CorelDRAWが固まる(フリーズ)
- 原因: 壊れたCDRファイル(破損データ)を読み込んだ際、ダイアログが表示されてVBAの実行が止まってしまっています。
- 対策: 今回のコードの `On Error GoTo ErrorHandler` のように、必ずエラーハンドリングを仕込み、ダイアログを出さずにスキップする構造にしましょう。
—
おわりに:ここをクリアすれば、あなたはもうプロだ
お疲れ様でした!
「ボタンをポチポチ押すマクロ」から、セキュリティ要件をクリアし、エラーハンドリングと監査ログまで完備した「エンタープライズ・自動化システム」への一歩を踏み出しました。
この構造をマスターすれば、CorelDRAWだけでなく、あらゆるAdobeやOffice製品のVBA/COM自動化に応用が利くようになります。現場のヒーローになる日はもうすぐです。ぜひ自分の開発環境で試してみてくださいね!
