【入門編】【初心者向け】単一CDRファイル内の全テキストフレームを一括抽出してテキストファイルに書き出す基本スクリプト – CorelDRAW VBA解析バイブル

スポンサーリンク

ようこそ、CorelDRAWオートメーションの世界へ。

デザインの現場で、数百ページに及ぶカタログや、無数のキャッチコピーが散りばめられたポスターから「テキストだけを抜き出してほしい」と頼まれたことはありませんか? ひとつひとつコピー&ペーストを繰り返す作業は、クリエイティブな時間とは言えませんよね。

私は、これまで数多くのCorelDRAWシステムを構築してきたアーキテクトです。今日は、あなたが「マクロの記録」を卒業し、自分の手でロジックを組み立てる第一歩として、「ドキュメント内の全テキストを一括抽出する魔法のスクリプト」を伝授します。

この記事を読み終える頃には、CorelDRAWの内部構造が透けて見えるようになっているはずですよ。

1. CorelDRAW VBAの構造を「地図」で理解する

コードを書く前に、CorelDRAWがデータをどう管理しているかを知っておきましょう。これを理解するだけで、エラーの8割は回避できます。

CorelDRAWのデータ構造は、大きな「入れ子」になっています。
1. Application: CorelDRAW本体
2. Document: 開いているファイル
3. Page: 各ページ
4. Layer: 各レイヤー
5. Shape: 描画されているオブジェクト(四角形、線、そしてテキスト

今回の目的は、この階層を上から順に辿り、「Shapeの種類がテキスト(cdrTextShape)であるもの」だけを見つけ出すことです。

2. 実践コード:全テキスト抽出スクリプト

さっそくコードを見てみましょう。このコードは、現在開いているドキュメントからすべてのテキストを拾い上げ、デスクトップに `ExtractedText.txt` という名前で保存します。

‘ —————————————————————————
‘ Module: TextExporter
‘ Description: ドキュメント内の全テキストを抽出し、テキストファイルへ出力する
‘ —————————————————————————
Sub ExportAllTextToDesktop()
Dim doc As Document
Dim pg As Page
Dim sh As Shape
Dim textContent As String
Dim filePath As String
Dim fileNumber As Integer

‘ 1. アクティブなドキュメントを取得(開いていない場合は終了)
Set doc = ActiveDocument
If doc Is Nothing Then
MsgBox “ドキュメントが開かれていません。”, vbCritical
Exit Sub
End If

‘ 2. 保存先のパスを設定(デスクトップ)
filePath = CreateObject(“WScript.Shell”).SpecialFolders(“Desktop”) & “\ExtractedText.txt”

‘ 3. 全ページを巡回してテキストを収集
textContent = “— CorelDRAW Text Export [” & doc.FileName & “] —” & vbCrLf

For Each pg In doc.Pages
textContent = textContent & vbCrLf & “=== Page: ” & pg.Index & ” ===” & vbCrLf

‘ ページ内のすべてのシェイプから「テキストシェイプ」だけを探す
‘ FindShapesを使うと、グループ化された中身も効率よく検索できます
For Each sh In pg.Shapes.FindShapes(Type:=cdrTextShape)
‘ テキストの内容を取得し、前後の不要な改行をトリミングして蓄積
If sh.Text.Story.Length > 0 Then
textContent = textContent & sh.Text.Story.Text & vbCrLf & “—” & vbCrLf
End If
Next sh
Next pg

‘ 4. テキストファイルとして書き出し
On Error Resume Next
fileNumber = FreeFile
Open filePath For Output As #fileNumber
Print #fileNumber, textContent
Close #fileNumber
On Error GoTo 0

‘ 完了報告
MsgBox “抽出が完了しました!” & vbCrLf & “保存先: ” & filePath, vbInformation, “成功”
End Sub

3. コードの「急所」を解説

このスクリプトには、初心者から一歩抜け出すための重要なテクニックがいくつか含まれています。

① `FindShapes(Type:=cdrTextShape)` の魔法

通常、ページ内の図形を調べるには `For Each sh In pg.Shapes` と書きますが、これでは「グループ化された中にあるテキスト」を見落としてしまいます。
`FindShapes` メソッドを使うと、CorelDRAWが自動的に階層の奥深くまで潜り、指定した条件(今回はテキストシェイプ)に合致するものだけをリストアップしてくれます。これは非常に高速で強力なメソッドです。

② `sh.Text.Story.Text`

CorelDRAWのテキストオブジェクトには、フォント情報や配置情報など膨大なプロパティがあります。その中で、純粋に「文字内容」だけを指すのが `Story` プロパティです。これを使うことで、美術テキスト(Artistic Text)でも段落テキスト(Paragraph Text)でも、同じように中身を取り出すことができます。

③ ファイル出力の定石

`FreeFile` で空いているファイル番号を取得し、`Open … For Output` で書き出す手法は、VBAにおける最もシンプルで確実な外部出力方法です。

4. 陥りやすいエラーと回避策

マクロが動かない時、あるいは思い通りにいかない時は、以下のポイントをチェックしてください。

1. レイヤーがロックされている場合
ロックされたレイヤーにあるテキストは、通常の検索では取得できないことがあります。必要に応じて、事前に `doc.UnlockAllShapes` を実行するか、レイヤーの設定を確認してください。
2. パワークリップ(PowerClip)の中身
`FindShapes` は非常に優秀ですが、パワークリップの中にあるテキストまではデフォルトでは追いきれない場合があります。さらに高度な自動化を目指すなら、再帰的な探索が必要になります(これは次の中級編で解説しましょう)。
3. 空のテキストフレーム
中身が空のテキストフレーム(文字を入力せずに作成した枠)が存在すると、エラーにはなりませんが、抽出結果に無駄な空行が増えます。コード内の `If sh.Text.Story.Length > 0` という判定が、それを防ぐフィルターになっています。

最後に:この一歩が「自動化エンジニア」への道

お疲れ様でした! このスクリプトは非常にシンプルですが、「対象を特定し(Find)」「情報を取得し(Get)」「外部へ渡す(Output)」という、業務自動化の三原則がすべて詰まっています。

まずはこのコードをコピーして、あなたのCorelDRAWで動かしてみてください。
「自分で書いたコードでソフトが動く」という感動こそが、あなたをさらなる高みへと押し上げる原動力になります。

もし、「特定のレイヤーだけ抽出したい」とか「Excelに直接書き出したい」といった要望が出てきたら、それはあなたがVBAの基本をマスターし、次のステップへ進む準備ができた証拠です。

CorelDRAW VBAの世界は奥深く、そして自由です。一歩ずつ、楽しみながら掌握していきましょう!

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