【実務・中級編】【中級者向け】印刷入稿用データの最終関門!全テキストオブジェクトのカーブ変換(アウトライン化)と未処理文字の自動検出アラート – CorelDRAW VBA解析バイブル

スポンサーリンク

はじめに:なぜ、テキストのアウトライン化は「最終関門」なのか

印刷入稿において、フォントの埋め込みミスやバージョン差異による「文字化け」「意図しない改行」は、業務上の致命傷になり得る。クライアントから預かった、あるいは社内のデザイナーが組み上げたドキュメントを、そのままPDFやEPSで書き出すのは、いわば「ロシアンルーレット」を回すようなものだ。

CorelDRAWにおけるテキストオブジェクトは、非常に高機能な反面、実行環境のフォント依存というアキレス腱を持っている。このリスクを根本から断つ唯一の手段が、「全テキストオブジェクトのカーブ変換(アウトライン化)」である。

しかし、中級者向けのVBAコードとしてよく見かける「単純に全シェイプを走査して `ConvertToCurves` を叩くだけ」のスクリプトでは、実務の現場では必ず破綻する。
レイヤーのロック、非表示レイヤー、シンボル内部、そして何より「変換しきれなかった文字(外字や特殊グリフなど)」の検知漏れだ。

今回は、CorelDRAW VBAのオブジェクトモデルの深淵を知る我々が、実務の現場で100%の信頼性を発揮する「要塞級」のアウトライン化&監査マクロの設計思想と実装コードを伝授する。

—

1. 堅牢な設計思想:なぜ「単純なループ処理」では実務で使えないのか

CorelDRAWのVBAでドキュメントを操作する際、プログラマーが陥りがちないくつかの罠がある。これらを事前に潰すことが、堅牢なツールを作る条件となる。

罠その1:階層構造の看過(レイヤー保護とグループ)

ドキュメント内には、ロックされたレイヤーや非表示のレイヤー、あるいはマスターページ上のオブジェクトが存在する。これらを無差別に処理しようとすると、実行時エラー(Error 91: オブジェクト変数または With ブロック変数が設定されていません 等)を引き起こす。また、グループ化されたテキストは、再帰的にアプローチしなければ網羅できない。

罠その2:非テキストシェイプへの無駄なメソッド呼び出し

`ConvertToCurves` はテキストに対してのみ有効なメソッドではないが、カーブや矩形に対して誤って適用しようとすると、予期せぬ挙動やパフォーマンスの低下を招く。明示的に「テキストフレーム(Artistic Text または Paragraph Text)」であるかを判定しなければならない。

罠その3:変換漏れの沈黙(Silent Failure)

これが最も危険だ。複雑なフォントや特殊なグリフ構造を持つテキストは、稀に `ConvertToCurves` を実行してもアウトライン化が完全に完了せず、テキスト属性が残ったままになるケースがある。これを検知せずに入稿データを作ってしまえば、マクロを入れた意味が全くない。

—

2. コピペ即実戦投入:全自動カーブ化&二重チェック・プロダクションコード

以下のコードは、前述のすべての懸念点をクリアし、処理後に「テキストオブジェクトがドキュメント内に1つも残っていないか」を厳密に監査する、実務仕様のVBAモジュールである。

Option Explicit

Sub AuditAndConvertToCurves()
Dim doc As Document
Set doc = Application.ActiveDocument

‘ ドキュメントが開かれているか確認
If doc Is Nothing Then
MsgBox “処理対象のドキュメントが開かれていません。”, vbCritical, “致命的エラー”
Exit Sub
End If

‘ アンドゥのトランザクションをまとめ、パフォーマンスと安全性を確保
doc.BeginCommandGroup “テキストの完全アウトライン化と監査”
On Error GoTo ErrorHandler

Dim convertedCount As Long
convertedCount = 0

‘ 1. ドキュメント内の全ページ・全レイヤーを走査してテキストをカーブ化
ProcessShapesRecursive doc.Pages, convertedCount

‘ 2. 監査フェーズ:まだテキストが残っていないかを厳密にチェック
Dim remainingTextCount As Long
remainingTextCount = CountRemainingTexts(doc.Pages)

doc.EndCommandGroup

‘ 3. 結果レポートの出力
If remainingTextCount = 0 Then
MsgBox “アウトライン化が正常に完了しました。” & vbCrLf & _
“変換されたテキスト要素数: ” & convertedCount & “件” & vbCrLf & _
“未処理文字: 0件(入稿準備完了)”, vbInformation, “監査クリア”
Else
MsgBox “【警告】アウトライン化しきれなかったテキストが ” & remainingTextCount & ” 件検出されました!” & vbCrLf & _
“特殊フォントやロックされたオブジェクトを確認してください。”, vbExclamation, “監査アラート”
End If

Exit Sub

ErrorHandler:
doc.EndCommandGroup
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “実行時エラー”
End Sub

‘ — 再帰的シェイプ走査プロシージャ —
Private Sub ProcessShapesRecursive(ByVal pagesColl As Pages, ByRef count As Long)
Dim p As Page
Dim sh As Shape

For Each p In pagesColl
‘ レイヤー単位で走査
Dim lyr As Layer
For Each lyr p.Layers
‘ ロックされている、または非表示のレイヤーはスキップ(実務的な安全策)
If lyr.Visible And Not lyr.Locked Then
For Each sh In lyr.Shapes
ProcessSingleShape sh, count
Next sh
End If
Next lyr
Next p
End Sub

‘ — 単体シェイプの判定と変換処理 —
Private Sub ProcessSingleShape(ByVal sh As Shape, ByRef count As Long)
‘ グループ化されている場合は再帰的に中身を掘る
If sh.Type = cdrGroupShape Then
Dim subSh As Shape
For Each subSh In sh.Shapes
ProcessSingleShape subSh, count
Next subSh
‘ パワークリップ内のシェイプも対象にする場合
ElseIf sh.Type = cdrPowerClipShape Then
Dim pcSh As Shape
For Each pcSh In sh.Shapes.All
ProcessSingleShape pcSh, count
Next pcSh
End If

‘ シェイプがテキスト(アートテキストまたは段落テキスト)であるか判定
If sh.Type = cdrTextShape Then
‘ テキストフレームがロックされていないか確認
If Not sh.Locked Then
Dim convertedSh As Shape
‘ テキストをカーブに変換
Set convertedSh = sh.ConvertToCurves()
count = count + 1
End If
End If
End Sub

‘ — 残存テキストの監査用カウンタ —
Private Function CountRemainingTexts(ByVal pagesColl As Pages) As Long
Dim p As Page
Dim sh As Shape
Object
Dim textCount As Long
textCount = 0

For Each p In pagesColl
Dim lyr As Layer
For Each lyr In p.Layers
If lyr.Visible Then
textCount = textCount + CountTextInShapes(lyr.Shapes)
End If
Next lyr
Next p

CountRemainingTexts = textCount
End Function

‘ — シェイプコレクション内のテキスト再帰カウント —
Private Function CountTextInShapes(ByVal shapesColl As Shapes) As Long
Dim sh As Shape
Dim count As Long
count = 0

For Each sh In shapesColl
If sh.Type = cdrTextShape Then
count = count + 1
ElseIf sh.Type = cdrGroupShape Or sh.Type = cdrPowerClipShape Then
count = count + CountTextInShapes(sh.Shapes)
End If
Next sh

CountTextInShapes = count
End Function

—

3. チーフアーキテクトが解説するコードの急所

このスクリプトが一般的なコードと一線を画すポイントを解説する。

1. `BeginCommandGroup` によるアトミック性(不可分性)の確保
CoreldRAW VBAでは、処理の最初にこれを宣言し、最後に `EndCommandGroup` で閉じることで、何千個というオブジェクトの変換処理を「1回のアンドゥ(Ctrl + Z)」で元に戻せるようにしている。実務において「誤って実行してしまった」際の保険として必須の設計である。

2. レイヤーの `Visible` と `Locked` の厳格なフィルタリング
非表示レイヤーのオブジェクトや、意図的にロックされた版下のベースなどを誤って変換・破壊することを防ぐため、明示的にスルーする条件分岐を入れている。

3. グループとパワークリップの再帰的処理(Recursion)
CorelDRAWのシェイプ構造はツリー構造を成している。グループの階層深くにあるテキストや、パワークリップ(マスク)の内部に潜むテキストは、単純なレイヤー直下の走査では絶対にヒットしない。このコードでは、`cdrGroupShape` および `cdrPowerClipShape` を検知した瞬間に自分自身を再帰呼び出し(`ProcessSingleShape`)する設計をとっているため、どれほど複雑にネストされたデータであっても取りこぼしがない。

4. 二重チェック(監査フェーズ)の独立実装
変換処理の直後に、もう一度ドキュメント全体を舐めて「`cdrTextShape` が1つも残っていないか」を数えている(`CountRemainingTexts`)。人間はエラーを疑うが、システムは数字で証明させなければならない。万が一フォントの権利制限や破損データで変換できなかったテキストがあれば、ここで確実に検知され、アラートが上がる仕組みだ。

—

おわりに:自動化の先にある「絶対的な安心」

印刷入稿におけるトラブルは、往々にして「人間の目視確認の限界」から生まれる。
「ちゃんとアウトライン化したはずなのに、印刷所から『文字化けしている』と連絡が来た」——そんな悪夢を、この1つのモジュールが完全に排除する。

CorelDRAW VBAは、正しく設計すれば単なる「作業の代行ツール」ではなく、「品質を担保する絶対的なゲートキーパー」へと進化する。ぜひこのコードをあなたの開発環境に組み込み、属人性のない堅牢な入稿ワークフローを構築してほしい。

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