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

スポンサーリンク

CorelDRAW VBAを掌握せよ:数百のCDRファイルからテキストを一括抽出する「自動化の極意」

こんにちは。自動化の世界へようこそ。
「マクロの記録」ボタンを押すだけの生活に別れを告げ、CorelDRAWの内部構造を操るエンジニアの第一歩を踏み出しましょう。

今回は、現場で最も需要が高い「フォルダ内の全CDRファイルから、テキストを一括抽出してログ化する」ツールを作成します。ただコードを動かすだけでなく、なぜそのコードが必要なのか、プロが意識する「メモリ管理」と「効率化」の視点から解説します。

1. なぜ「サイレントオープン」が重要なのか?

CorelDRAWを操作する際、最も重い処理は「画面の描画(レンダリング)」です。ファイルを開くたびにGUIが表示され、プレビューが更新されると、処理時間は数倍に膨れ上がります。

我々エンジニアが目指すのは、「GUIを抑制した高速処理」です。これを実現するために、`CorelScript`や`CorelDRAW.Application`の挙動を正しく制御する必要があります。

2. 開発準備:FSOの参照設定

Windowsのファイル操作には、`FileSystemObject` (FSO) が欠かせません。

1. VBAエディタを開く(Alt + F11)。
2. メニューの「ツール」→「参照設定」をクリック。
3. 「Microsoft Scripting Runtime」にチェックを入れます。

これだけで、フォルダ内のファイルを自由自在に操る魔法の手に入れられます。

3. 実践:テキスト抽出自動化スクリプト

以下のコードをコピーして、標準モジュールに貼り付けてください。

Option Explicit

‘ フォルダ内の全CDRからテキストを抽出するメインルーチン
Sub ExtractAllTextFromCDR()
Dim fso As New FileSystemObject
Dim folderPath As String
Dim targetFolder As Folder
Dim file As file
Dim doc As Document
Dim outputPath As String
Dim fileNum As Integer

‘ 抽出先のテキストログパス
outputPath = “C:\Temp\ExtractedText.txt”
fileNum = FreeFile
Open outputPath For Output As #fileNum

‘ フォルダ選択ダイアログを表示(簡易版)
folderPath = “C:\Your\CDR\Files\Path” ‘ ここを対象フォルダに変更
Set targetFolder = fso.GetFolder(folderPath)

‘ 各ファイルをループ処理
For Each file In targetFolder.Files
If LCase(fso.GetExtensionName(file.Path)) = “cdr” Then
‘ バックグラウンドで静かに開く(VisibleをFalseにするのがコツ)
Set doc = Application.OpenDocument(file.Path)

Print #fileNum, “— File: ” & file.Name & ” —”

‘ 再帰的にテキストを探すサブルーチンを呼び出し
Call GetTextRecursive(doc.ActiveLayer, fileNum)

‘ メモリ解放のために必ず閉じる
doc.Close
End If
Next file

Close #fileNum
MsgBox “抽出完了!”
End Sub

‘ シェイプを再帰的に探索する関数
Private Sub GetTextRecursive(ByVal parent As Object, ByVal fileNum As Integer)
Dim shp As Shape

For Each shp In parent.Shapes
‘ グループ化されている場合は中身を掘り下げる
If shp.Type = cdrGroupShape Then
Call GetTextRecursive(shp, fileNum)
‘ テキストフレームなら内容を取得
ElseIf shp.Type = cdrTextShape Then
Print #fileNum, shp.Text.Story.Text
End If
Next shp
End Sub

4. コードの「ここが肝」:エンジニアの視点

① `doc.Close` の重要性

初心者が最もやりがちなミスが、処理を繰り返すうちにメモリがパンクすることです。`Application.OpenDocument`で開いたドキュメントは、必ず`doc.Close`でメモリから解放してください。これを忘れると、CorelDRAWが裏で立ち上がり続け、PCがフリーズします。

② 再帰呼び出し(Recursive Call)の魔法

CorelDRAWのデータ構造は「木構造(ツリー)」です。グループの中にグループがある…といった入れ子構造を解決するために、`GetTextRecursive`という関数で自分自身を呼び出し続けています。これが分かれば、どんな複雑なレイヤー構成でも怖くありません。

③ なぜ「サイレントオープン」なのか

`Application.OpenDocument` は非常に強力ですが、処理速度を追求するなら、APIの設定で「読み込みオプション」を調整することも可能です。今回はシンプルに保っていますが、さらに高度な自動化を目指すなら、`OpenDocument`の引数を調べてみてください。

5. 初心者が陥る罠と回避策

  • エラー:「オブジェクトが必要です」

→ ほとんどの場合、ドキュメントが完全に開く前に処理が走っています。非常に大きなファイルの場合は、少しの待機時間(`DoEvents`)を入れるのが大人の処世術です。

  • テキストが取れない?

→ CorelDRAWには「段落テキスト」と「アートテキスト」があります。今回のコードは `shp.Text.Story` を使っているため、どちらも網羅できます。もし取れない場合は、そのシェイプが「曲線(カーブ)」に変換されていないか確認してください。カーブ化された文字は、もはやテキストデータではありません。

次のステップへ

ここをクリアしたあなたは、もう「マクロの記録」で生成された汚いコードをコピーするだけの初心者ではありません。オブジェクトの構造を理解し、効率を追求するエンジニアの入り口に立っています。

次は、「テキストを抽出する」だけでなく、「特定のキーワードを置換して別名保存する」といった、実用的な破壊的自動化に挑戦してみてください。

何か詰まったら、いつでも戻ってきてください。CorelDRAWの世界は、コード次第で無限に広がります。健闘を祈ります!

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