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ライフを変える最初の一歩になれば幸いです。もし行き詰まったら、いつでも戻ってきてください。プロの世界の知見を、また共有しましょう。
それでは、良い自動化ライフを!
