【テクニカル・上級編】【初心者向け】指定したフォルダ内の複数CDRファイルから任意のテキストを一括抽出してテキストログ化する手法 – CorelDRAW VBA解析バイブル

スポンサーリンク

CorelDRAW VBAの深淵:数千のCDRファイルから「文字列」を秒速で抽出する極意

CorelDRAWの自動化において、多くのエンジニアが陥る罠がある。それは「ファイルを開く(Open Document)」という重い操作をループ内で繰り返し、メモリリークの海に沈むことだ。

数千のファイルを処理する場合、GUIの描画やUIの初期化は一切不要だ。本稿では、CorelDRAWの内部オブジェクトモデルを直接叩き、サイレントモードでテキストを抽出する、実戦的かつ「無駄を極限まで削ぎ落とした」アーキテクチャを提示する。

1. なぜ「Open Document」がボトルネックなのか

CorelDRAWの `Application.OpenDocument` は、ファイルを開く際にカラープロファイル、フォントのロード、グラフィックスのレンダリングキャッシュを生成する。これを数千回繰り返せば、アプリケーションはメモリ肥大化で確実にフリーズする。

真の自動化エンジニアは、「最小限のコンテキストで開き、必要な情報だけを吸い出し、即座に破棄する」というライフサイクル管理を徹底する。

2. 実装:再帰的走査とメモリマネジメント

以下のコードは、`FileSystemObject (FSO)` を用いた再帰走査と、CorelDRAWオブジェクトの明示的解放を組み合わせた堅牢なプロトタイプである。

Option Explicit

‘ 伝説的な安定性を実現するための定数群
Private Const SILENT_MODE As Boolean = True

Public Sub ExtractTextFromCDRFolder()
Dim fso As Object: Set fso = CreateObject(“Scripting.FileSystemObject”)
Dim folderPath As String: folderPath = “C:\Target\CDR_Files”
Dim logPath As String: logPath = “C:\Output\ExtractedText.log”

Dim logFile As Object
Set logFile = fso.CreateTextFile(logPath, True)

‘ 再帰処理開始
ProcessFolder fso.GetFolder(folderPath), logFile

logFile.Close
MsgBox “抽出完了”, vbInformation
End Sub

Private Sub ProcessFolder(folder As Object, logFile As Object)
Dim file As Object
Dim doc As Document

For Each file In folder.Files
If LCase(fso.GetExtensionName(file.Path)) = “cdr” Then
‘ 描画を抑止し、最小限のメモリで開く
Set doc = Application.OpenDocument(file.Path, cdrOpenSilent)

logFile.WriteLine “— File: ” & file.Name & ” —”

‘ 再帰的にページ・レイヤー・オブジェクトを探索
ExtractTextRecursive doc.ActivePage.Shapes, logFile

‘ 必須:明示的解放。これを行わないとメモリは解放されない
doc.Close
Set doc = Nothing
End If
Next
End Sub

‘ 形状オブジェクトを深掘りする再帰関数
Private Sub ExtractTextRecursive(shapes As shapes, logFile As Object)
Dim s As shape
For Each s In shapes
‘ テキストフレームを判定
If s.Type = cdrTextShape Then
logFile.WriteLine s.Text.Story.Text
End If

‘ グループ化されている場合は再帰的に探索
If s.Type = cdrGroupShape Then
ExtractTextRecursive s.Shapes, logFile
End If
Next
End Sub

3. チーフアーキテクトからの「極限の知見」

コードを動かすだけなら初級者でもできる。しかし、システム管理者として「止まらない自動化」を実現するには、以下の3点を脳に焼き付けておく必要がある。

① オブジェクトの「ゴミ」を残さない

VBAの `Set doc = Nothing` は単なる行儀の問題ではない。CorelDRAWの内部エンジンはCOMオブジェクトの参照カウントを監視している。`doc.Close` を忘れると、バックグラウンドにゾンビプロセスが残り、2回目、3回目の実行時にリソース不足で確実にクラッシュする。

② フォントの欠落問題と例外処理

古いCDRファイルには、環境内に存在しないフォントが含まれていることが多々ある。`On Error Resume Next` を適切に配置し、フォント置換ダイアログが非表示になるよう `Application.Optimization = True` を活用せよ。これにより、ポップアップによる処理停止を防げる。

③ 大規模環境でのボトルネック回避

もし対象が数万ファイルを超える場合、VBA単体では不安定になる。その際は、「VBAでファイルリストを生成し、それをキューとしてVB.NETのCLIツールへ渡す」というアーキテクチャへの移行を検討すべきだ。VBAは「CorelDRAWを制御するインターフェース」に徹し、重いログ処理やデータ解析は.NETのマルチスレッド環境に委ねる。これが現代の業務自動化における定石である。

結論

CorelDRAW VBAは、もはやレガシーではない。適切に制御されたCOM呼び出しは、最新のグラフィックエンジンを意のままに操る最強の剣となる。

今日からあなたの書くコードは、単なるスクリプトではなく、「堅牢なシステム」の一部であると自覚せよ。メモリを愛し、オブジェクトの生成と破棄を支配した者だけが、真に生産性の高い自動化という果実を手にすることができるのだ。

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