こんにちは!CorelDRAW VBAの世界へようこそ。
マクロの記録ボタンを押して生成されたコードを眺めるだけのステージは、もう卒業しませんか?
今回は、プログラミング初学者や「マクロの記録から一歩先へ進みたい!」と願う中級者に向けて、実務で即戦力となる「ブランドガイドライン自動監査マクロ」の作り方を解説します。
社内のブランドガイドラインで「このフォントは使っちゃダメ」「指定外の色(CMYK値やRGB値)が混ざっている」といったレギュレーション違反を指摘され、手作業でチェックして回った経験はありませんか? 人間の目によるチェックは、どうしてもヒューマンエラーを生みます。
ここをクリアすれば、CorelDRAW VBAの基本オブジェクトの走査構造はバッチリです。
世界最高峰の自動化エンジニアである私と一緒に、実務で即使える「品質管理ツール」を構築していきましょう!
—
なぜ「自動監査ツール」が必要なのか?
CorelDRAWで作成されたデザインデータの納品前チェックは、地味で神経を使う作業です。
もし納品後に「指定外のフォントが含まれていた」「禁止されている特色やカラーが使われていた」となると、最悪の場合、ブランドの信用失墜や刷り直しという大惨事に発展します。
これをVBAで完全自動化します。
ドキュメント内をくまなくスキャンし、ポリシーに反する要素(シェイプ)を自動で検出し、赤枠でハイライトして注意を促す──そんな夢のようなツールを、たった数十行のコードで作ってみせましょう。
—
本マクロの設計思想とCorelDRAW VBAの核心
CorelDRAWのドキュメント構造は、「Document(ドキュメント)」 $\rightarrow$ 「Page(ページ)」 $\rightarrow$ 「Layer(レイヤー)」 $\rightarrow$ 「Shape(シェイプ)」 というツリー構造(階層構造)になっています。
全シェイプを網羅的に監査するためには、このツリーを再帰的(またはループ処理)に辿る必要があります。
特に注意すべきは、CorelDRAW特有の「コンテナ(グループ、ブレンド、PowerClipなど)」の存在です。グループ化された中のシェイプを見落とさないように走査するのが、プロのエンジニアの腕の見せ所です。
—
実装コード:ブランドガイドライン監査マクロ
以下のコードをCorelDRAWのVBAエディタ(`Alt + F11`)に貼り付けてください。
今回は、「特定の禁止フォント(例: Comic Sansなど)」と「特定の禁止カラー(例: 許されないRGBレッド)」を検出し、該当するシェイプの線を赤色に変えて太くするスクリプトです。
Sub BrandComplianceAuditor()
Dim doc As Document
Set doc = ActiveDocument
‘ ドキュメントが開かれているかチェック
If doc Is Nothing Then
MsgBox “アクティブなドキュメントがありません。”, vbCritical, “エラー”
Exit Sub
End If
Dim violationCount As Long
violationCount = 0
‘ 処理の高速化(画面描画を停止)
doc.BeginCommandGroup
ActiveWindow.Optimization = True
On Error GoTo ErrorHandler
‘ アクティブページの全シェイプを走査(グループ内も考慮)
Dim sh As Shape
For Each sh Exp in doc.ActivePage.Shapes ‘ ※説明用の記述です。正しくは下の階層走査関数を使います
Next sh
‘ より堅牢な再帰的スキャンを実行するため、専用プロシージャを呼び出し
Call ScanShapesRecursive(doc.ActivePage.Shapes, violationCount)
‘ 画面描画を再開
ActiveWindow.Optimization = False
doc.EndCommandGroup
ActiveWindow.Refresh
‘ 結果報告
If violationCount > 0 {
MsgBox “監査完了: ” & violationCount & “件のレギュレーション違反を検出しました!” & vbCrLf & _
“該当シェイプを赤枠でハイライトしています。”, vbExclamation, “ブランド監査結果”
} Else {
MsgBox “監査完了: 違反は検出されませんでした。素晴らしい品質です!”, vbInformation, “ブランド監査結果”
}
Exit Sub
ErrorHandler:
ActiveWindow.Optimization = False
doc.EndCommandGroup
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “致命的なエラー”
End Sub
‘=============================================================================
‘ シェイプツリーを再帰的に走査し、違反をチェックするコアエンジン
‘=============================================================================
Private Sub ScanShapesRecursive(ByVal shapesCol As Shapes, ByRef count As Long)
Dim sh As Shape
For Each sh In shapesCol
‘ 1. グループやコンテナの場合は、中身を再帰的にチェック
If sh.Type = cdrGroupShape Then
Call ScanShapesRecursive(sh.Shapes, count)
ElseIf sh.Type = cdrBlendShape Then
Call ScanShapesRecursive(sh.Shapes, count)
ElseIf sh.HasProperty(cdrShapeIsPowerClip) Then
‘ パワープレイスの中身も走査する場合
If Not sh.PowerClip Is Nothing Then
Call ScanShapesRecursive(sh.PowerClip.Shapes, count)
End If
End If
‘ 2. テキストシェイプのフォントチェック
If sh.Type = cdrTextShape Then
If CheckFontViolation(sh) Then
Call MarkAsViolation(sh)
count = count + 1
End If
End If
‘ 3. カラー(塗りつぶし)のチェック
If CheckColorViolation(sh) Then
Call MarkAsViolation(sh)
count = count + 1
End If
Next sh
End Sub
‘=============================================================================
‘ 個別チェック関数:フォントのレギュレーション違反判定
‘=============================================================================
Private Function CheckFontViolation(ByVal sh As Shape) As Boolean
CheckFontViolation = False
If sh.Text.Story.Length > 0 Then
Dim i As Long
‘ 文字列内のフォント名が禁止リストに含まれているかチェック
‘ ここでは例として “Comic Sans MS” を禁止フォントとします
Dim fontName As String
fontName = sh.Text.Story.Font.Name
If StrComp(fontName, “Comic Sans MS”, vbTextCompare) = 0 Then
CheckFontViolation = True
End If
End If
End Function
‘=============================================================================
‘ 個別チェック関数:カラーのレギュレーション違反判定
‘=============================================================================
Private Function CheckColorViolation(ByVal sh As Shape) As Boolean
CheckColorViolation = False
‘ 塗りつぶしを持っているか?
If sh.Fill.Type = cdrUniformFill Then
Dim col As Color
Set col = sh.Fill.UniformColor
‘ 例:ブランドカラーとして許可されていない「鮮やかな赤 (RGB: 255, 0, 0)」を検知
If col.Type = cdrColorRGB Then
If col.RGBRed = 255 And col.RGBGreen = 0 And col.RGBBlue = 0 Then
CheckColorViolation = True
End If
End If
End If
End Function
‘=============================================================================
‘ アクション:違反シェイプを視覚的にハイライトする
‘=============================================================================
Private Sub MarkAsViolation(ByVal sh As Shape)
‘ 違反したシェイプの輪郭線を赤色にし、太さを強調する
sh.Outline.SetProperties Width:=2, Color:=CreateRGBColor(255, 0, 0)
sh.Outline.Type = cdrOutline
End Sub
—
コードの解説:ここがエンジニアのこだわりポイント!
1. `ActiveWindow.Optimization = True` による爆速化
CorelDRAWで何千ものシェイプをループ処理するとき、画面の再描画を挟むと動作が極端に重くなります。処理の最初に最適化を有効にし、最後に戻すことで、一瞬で監査を終わらせるプロのテクニックです。
2. 再帰処理(`ScanShapesRecursive`)の採用
CorelDRAWでは、オブジェクトがグループ化されていると通常の `For Each` ではグループ内部のシェイプにアクセスできません。関数の中で自分自身を呼び出す「再帰処理」を使うことで、どれだけ複雑にネストされたグループやパワーコンテナであっても、全ての要素をもれなくキャッチできます。
3. エラーハンドリングの完備
予期せぬオブジェクトや特殊なフォント構造に出くわした際、マクロが強制終了して画面の最適化フラグが戻らなくなるトラブルを防ぐため、`On Error GoTo` を必ず実装しています。
—
初学者が陥りやすいエラーと対策
- エラー:「オブジェクトが必要です」 (Runtime Error 424)
- 原因: 選択されているシェイプが存在しない状態、あるいは `ActivePage` が正しく取得できていないタイミングでプロパティにアクセスしようとした場合に発生します。
- 対策: コードの冒頭のように `If doc Is Nothing Then` などでオブジェクトの存在確認(ヌルチェック)を必ず行いましょう。
- グループの中の文字や色が変わらない
- 原因: マクロの記録頼みだと、選択されているオブジェクトしか操作できず、グループ階層の奥底にある要素が無視されてしまいます。
- 対策: 今回紹介したような再帰的アプローチをマスターすれば、この悩みとは一生お別れです!
—
まとめ:自動化でデザインの品質を担保しよう
今回は、CorelDRAW VBAを用いた「ブランドガイドライン自動監査マクロ」の実装方法を解説しました。
ここをクリアすれば、CorelDRAW VBAの「ドキュメント構造の理解」「再帰処理」「プロパティの判定」という三大基本スキルが完璧に身についています。
実務の現場では、単に絵を描くだけでなく、こうした「品質を担保する仕組み(ガバナンス)」をコードで構築できるエンジニアが圧倒的に重宝されます。ぜひ社内のルールに合わせて禁止フォントやカラーの条件を書き換え、あなたのチームのワークフローに導入してみてください。
それでは、次回の高度な自動化の世界でお会いしましょう。お疲れ様でした!
