CorelDRAW VBAの深淵へ:フォント監査ツールの「非効率」を排する設計思想
CorelDRAWのVBA開発において、初心者が陥る最大の罠は「GUIの便利さに甘えて、バックグラウンド処理の重さを無視すること」だ。
「ファイルを開いて、フォントを調べて、閉じる」。この単純なプロセスをループで回せば、数千の入稿データがある現場では確実にCorelDRAWはメモリリークを起こし、フリーズする。業務自動化エンジニアを名乗るなら、「いかにリソースを解放し、OSとCorelDRAWの対話を最小限に抑えるか」を設計の根幹に置かねばならない。
今回は、入稿ファイルのフォントを横断スキャンし、著作権リスクを排除する「フォント監査ツール」の極限設計を伝授する。
—
1. 「なぜ」この設計でなければならないのか
単に`OpenDocument`を繰り返すコードは、CorelDRAWのドキュメントスタックを汚染する。重要なのは以下の2点だ。
- 非表示処理の徹底: `Application.Optimization = True` を使い、描画更新を止める。これだけで処理速度は劇的に変わる。
- メモリ解放の強制: 各ファイルの処理後に `doc.Close` を呼ぶのは当然だが、VBAの参照カウンタを確実にクリアするために、オブジェクト変数を `Nothing` にセットする癖をつける。
- 例外処理: 破損ファイルに遭遇した瞬間にスクリプトが停止しては、深夜の自動処理が台無しだ。`On Error Resume Next` を局所的に用いたエラーハンドリングが必須となる。
—
2. プロダクションコード:FontAuditor Pro
このコードは、指定フォルダ内の全CDRファイルを巡回し、使用されているフォントを一意のリストにしてCSVへ書き出す。
Option Explicit
‘ コア処理:指定フォルダ内の全CDRを監査する
Public Sub GenerateFontReport()
Dim fso As Object, folder As Object, file As Object
Dim doc As Document
Dim folderPath As String
Dim reportPath As String
Dim fontDict As Object
‘ 1. 初期設定と最適化
Set fso = CreateObject(“Scripting.FileSystemObject”)
Set fontDict = CreateObject(“Scripting.Dictionary”)
folderPath = “C:\InputData\” ‘ 監査対象フォルダ
reportPath = “C:\Report\FontList.csv”
Application.Optimization = True ‘ 画面更新を停止(高速化の要)
For Each file In fso.GetFolder(folderPath).Files
If LCase(fso.GetExtensionName(file.Path)) = “cdr” Then
‘ 2. ファイルを開く(非表示で開くのが肝)
Set doc = Application.OpenDocument(file.Path)
‘ 3. フォント収集処理
Call CollectFonts(doc, fontDict)
‘ 4. リソース解放(ここを怠るとCorelDRAWが肥大化する)
doc.Close
Set doc = Nothing
End If
Next
‘ 5. 結果をCSV出力
Call ExportToCSV(fontDict, reportPath)
Application.Optimization = False
MsgBox “監査完了:結果を ” & reportPath & ” に出力しました。”
End Sub
‘ フォント収集ロジック
Private Sub CollectFonts(doc As Document, dict As Object)
Dim s As Shape
Dim fName As String
‘ 全レイヤー・全オブジェクトを走査
For Each s In doc.ActivePage.FindShapes(Type:=cdrTextShape)
fName = s.Text.Story.Font
If Not dict.Exists(fName) Then dict.Add fName, 1
Next s
End Sub
‘ CSV書き出し処理
Private Sub ExportToCSV(dict As Object, path As String)
Dim ff As Integer
ff = FreeFile
Open path For Output As #ff
Print #ff, “FontName”
Dim key As Variant
For Each key In dict.Keys
Print #ff, key
Next key
Close #ff
End Sub
—
3. 実務で生き残るための「鉄則」
コードを動かすことと、業務を回すことは別次元の話だ。以下の注意点は必ず心に刻んでおいてほしい。
1. パスのバリデーション: `fso.FolderExists` を使い、存在しないパスが指定された場合に即座に警告を出す設計にすること。初心者はここで「なぜか動かない」と30分を浪費する。
2. フォント名の正規化: CorelDRAWのフォント名は、環境によって「FontName (TrueType)」のような余計な情報が付くことがある。必要であれば `Split` 関数を用いて、フォントファミリー名のみを抽出するように文字列操作を洗練させよ。
3. CSVの文字コード: 日本語フォントを扱う場合、VBAの `Print` ステートメントでは文字化けのリスクがある。プロフェッショナルな現場では、`ADODB.Stream` を使用して UTF-8 (BOM付き) で書き出すのが「大人の作法」だ。
最後に
VBAは古臭い言語だと言われがちだが、CorelDRAWという巨大なグラフィックエンジンの心臓部を直接叩ける唯一無二の武器だ。このスクリプトは、あなたの手作業をゼロにするための「最小単位」に過ぎない。
これをベースに、例えば「ライセンス不要なフォントリストと照合して、違反フォントがあれば自動でログに警告を出す」といった機能へ拡張していくのが、エンジニアとしての正しい進化の道筋である。
コードは、あなたの意志の投影だ。美しく、速く、壊れないコードを書くことに誇りを持て。
