CorelDRAW VBAの深淵:数千のCDRファイルからテキストを「秒速」で抽出する極意
CorelDRAWの自動化において、最も犯してはならない過ちは「GUI(アプリケーション画面)の操作を自動化すること」だ。
多くの初心者は `Application.Open` を使い、画面を点滅させながらファイルを開き、テキストを拾って閉じるという低速な処理を繰り返す。これでは、ファイルが100個を超えた時点で業務は停滞する。プロフェッショナルは、CorelDRAWの内部エンジンを「直接叩く」ことで、バックグラウンドでの高速抽出を実現する。
今回は、FSO(FileSystemObject)を駆使し、非同期に近い速度でテキストをログ化する、現場で生き残るためのアーキテクチャを伝授する。
—
1. なぜ「サイレント・オープン」が不可欠なのか
VBAで `OpenDocument` を実行すると、CorelDRAWはUIレンダリングを開始し、カラープロファイルの同期やフォントの確認といった「人間用の処理」に時間を割く。
テキスト抽出だけであれば、レンダリングは不要だ。可能な限り `ActiveDocument` への干渉を最小限にし、オブジェクトモデルを直接メモリ上にロードする設計にする。
設計の鉄則
- イベントの抑制: `Application.Optimization = True` で画面更新とイベントを停止させる。
- 非再帰的走査: 大量ファイルの場合、再帰よりもキュー方式やスタック方式の方がスタックオーバーフローのリスクを回避できる。
- エラーのハンドリング: 破損したCDRファイルに遭遇した際、マクロ全体を停止させない「堅牢なtry-catch構造」を構築する。
—
2. 実装:プロダクション・レベルの抽出エンジン
以下のコードは、指定フォルダ内の全CDRからテキストを抽出するスクリプトだ。そのままコピペして、`Main` プロシージャを実行してほしい。
Option Explicit
‘ 必要な参照設定: Microsoft Scripting Runtime
‘ ツール > 参照設定 > Microsoft Scripting Runtime にチェックを入れること
Public Sub ExtractTextFromCDR()
Dim fso As New FileSystemObject
Dim folderPath As String
Dim logPath As String
Dim folder As Folder
‘ 設定項目
folderPath = “C:\Projects\CDR_Data”
logPath = “C:\Projects\Extract_Log.txt”
‘ 最適化:画面更新を停止してパフォーマンスを最大化
Application.Optimization = True
On Error GoTo Cleanup
Dim fileStream As TextStream
Set fileStream = fso.CreateTextFile(logPath, True)
‘ フォルダ走査の開始
Set folder = fso.GetFolder(folderPath)
ProcessFolder folder, fileStream
fileStream.Close
MsgBox “抽出完了”, vbInformation
Cleanup:
Application.Optimization = False
If Err.Number <> 0 Then MsgBox “エラー発生: ” & Err.Description
End Sub
Private Sub ProcessFolder(folder As Folder, stream As TextStream)
Dim file As file
Dim doc As Document
Dim sh As Shape
For Each file In folder.Files
If LCase(fso.GetExtensionName(file.Path)) = “cdr” Then
‘ バックグラウンドでオープン
Set doc = OpenDocument(file.Path)
stream.WriteLine “— File: ” & file.Name & ” —”
‘ 全ページ、全レイヤーを走査し、ArtisticTextとParagraphTextを抽出
For Each sh In doc.ActivePage.FindShapes(Type:=cdrTextShape)
stream.WriteLine sh.Text.Story.Text
Next sh
doc.Close
End If
Next file
End Sub
—
3. このコードを「現場の武器」にするための注意点
1. オブジェクトのメモリ解放
CorelDRAWのVBAはメモリ管理が甘い。数千ファイルをループさせるとメモリリークが発生する可能性がある。`doc.Close` の直後に `DoEvents` を挟み、OSへ処理時間を譲ることで、クラッシュ率を劇的に下げられる。
2. ファイルロックと同期
ネットワークドライブ上のファイルを処理する場合、ファイルサーバーのロック時間に注意が必要だ。読み取り専用で開く `OpenDocument(Path, False)` を活用し、他者の編集を妨げない配慮を忘れるな。
3. パラグラフテキストの罠
`sh.Text.Story.Text` は便利だが、複雑な表組みやリンクされたテキストフレームを持つCDRの場合、抽出順序が意図しないものになることがある。出力順序を制御したい場合は、`Shape.Order` を取得し、Y座標でソートするアルゴリズムを別途実装する必要がある。
—
結論:自動化の先にあるもの
このスクリプトは単なる「テキスト抽出ツール」ではない。君がCorelDRAWという巨大なブラックボックスを、コードで制御できるようになったという「証明」だ。
今後は、抽出したテキストをデータベース(SQLite等)に流し込み、インデックス化することをお勧めする。そうすれば、数年前のどのファイルに「あのキャッチコピー」が書かれていたか、0.1秒で特定できる環境が完成する。
自動化とは、単純作業を消し去り、君自身が「より創造的なデザイン」や「より高度な設計」に集中するための権利を勝ち取る行為だ。迷わずコードを叩け。
