【入門編】【初心者向け】ドキュメント内の全テキストフレームのフォントファミリーを一覧化し重複を除いて出力する基本スクリプト – CorelDRAW VBA解析バイブル

スポンサーリンク

CorelDRAW VBAの「深淵」へようこそ。フォント棚卸しで覚える自動化の第一歩

こんにちは。CorelDRAWの自動化の世界へようこそ。
「マクロの記録」ボタンを押して、生成されたコードの解読に頭を悩ませる日々は今日で終わりです。

CorelDRAWのVBA(Visual Basic for Applications)を操るということは、単にコマンドを並べることではありません。ドキュメントという名の「オブジェクトの森」をどう効率的に探索し、必要な情報をスマートに抜き出すか。その作法を学ぶことです。

今回は、ドキュメント内の全テキストフレームをスキャンし、「現在使われているフォントファミリーを重複なしで抽出する」という、実務で非常に重宝するスクリプトを例に、VBAの真髄を伝授します。

1. なぜ「スクリプト」を書く必要があるのか?

数百ページあるカタログや、デザイナーから引き継いだ複雑なデザインデータ。そこから「使われているフォントを全部教えて」と言われたら、手作業では何分かかるでしょうか?

VBAなら、わずか数秒です。この速さを体感すると、もう元の手作業には戻れません。今回目指すのは、「文書内の全オブジェクトを走査し、テキスト属性をフィルタリングし、辞書(Collection)に蓄積する」という自動化の基本アーキテクチャです。

2. 実装コード:フォント・リスト・スキャナー

以下のコードをVBAエディタ(`Alt + F11` で開けます)に貼り付けてみてください。

Sub ListUsedFonts()
Dim doc As Document
Dim shp As Shape
Dim fontList As New Collection
Dim fontName As String
Dim i As Long
Dim exists As Boolean

Set doc = ActiveDocument

‘ 全レイヤー、全ページを再帰的に走査するための準備
‘ ActivePage.FindShapes を使うのがCorelDRAW VBAの定石です
For Each shp In doc.ActivePage.FindShapes(Type:=cdrTextShape)
‘ テキストフレームかどうかを確認
If shp.Type = cdrTextShape Then
fontName = shp.Text.Story.Font

‘ 重複チェック:コレクションに追加されているか判定
exists = False
For i = 1 To fontList.Count
If fontList(i) = fontName Then
exists = True
Exit For
End If
Next i

‘ 初めて見つけたフォントなら追加
If Not exists Then
fontList.Add fontName
End If
End If
Next shp

‘ 結果の出力
Dim result As String
result = “ドキュメント内で使用されているフォント一覧:” & vbCrLf
For i = 1 To fontList.Count
result = result & “- ” & fontList(i) & vbCrLf
Next i

MsgBox result, vbInformation, “フォント棚卸し完了”
End Sub

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

初心者の方が最初に躓くポイントを、伝説的エンジニアの視点で紐解きます。

① `FindShapes` という魔法の杖

`ActivePage.FindShapes(Type:=cdrTextShape)` は、CorelDRAW VBAにおいて最も強力なメソッドの一つです。画面上の無数にある図形から、わざわざ自分で「これは画像か?曲線か?」と判定する必要はありません。`Type` を指定することで、最初からテキストだけに絞って抽出できます。これがパフォーマンスの差を生みます。

② なぜ「Collection」を使うのか?

配列(Array)でも良いのですが、`Collection` オブジェクトは「中身の追加」が非常に柔軟です。また、今回は「重複を防ぐ」というロジックを実装していますが、実務レベルでは `Scripting.Dictionary` を使うとさらに高速化可能です(今回は学習のため、あえて `Collection` で愚直に判定しています)。

③ `shp.Text.Story.Font` の意味

CorelDRAWのオブジェクトモデルでは、テキストは `Story` という階層を持っています。ここで注意が必要なのは、「1つのテキストフレーム内に複数のフォントが混在している場合」です。上記のコードはフレーム単位のフォントを取得しますが、より厳密に文字単位で調べたい場合は `shp.Text.Story.Characters` をループさせるという「さらなる深淵」が待っています。まずはここから始めましょう。

4. 陥りやすいエラーとその対策

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

これは、`ActiveDocument` が開かれていない状態で実行したときによく起こります。コードの冒頭に `If ActiveDocument Is Nothing Then Exit Sub` と入れるだけで、エラーで落ちるストレスが消えます。

  • 処理が遅い:

大規模なドキュメントで処理が止まる場合は、`Application.Optimization = True` と `Application.Refresh` をオフにする処理を追加してください。描画の更新を止めるだけで、処理速度は劇的に向上します。

最後に:自動化は「設計」から始まる

今回紹介したコードは、あくまで「入り口」です。ここから「フォント名をテキストファイルに書き出す」「特定のフォントを別のフォントに一括置換する」といった拡張へと繋げていってください。

自動化の本質は、「面倒な作業をコードに押し付け、自分は本来の創造的な業務に没頭すること」にあります。

この小さなスクリプトが、あなたのCorelDRAWライフを変える最初の一歩になれば幸いです。もし行き詰まったら、いつでも戻ってきてください。プロの世界の知見を、また共有しましょう。

それでは、良い自動化ライフを!

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