こんにちは!CorelDRAW VBAの世界へようこそ。
これまで、マクロの記録をそのまま貼り付けたり、標準モジュールに何百行もの手続き型コードをベタ書きしたりして、「なんだかコードがスパゲッティ化してきたな……」「似たような図形処理のコードを何度もコピペしているな……」と悩んだことはありませんか?
今回は、そんなレガシーな開発スタイルから完全に脱却し、「クラスモジュール」を使ったオブジェクト指向VBA開発の極意を伝授します。
ここをクリアすれば、あなたのCorelDRAW VBAスキルはプロの領域に達します。一緒に、美しく再利用性の高い設計論の世界へ足を踏み入れましょう!
—
なぜクラスモジュールなのか?(標準モジュール脱却の理由)
標準モジュールに書かれたVBAは、いわば「上から下に流れるだけの使い捨てスクリプト」です。
例えば、「赤い矩形を描いて、特定の座標に配置し、影をつける」という処理を考えてみましょう。これを標準モジュールだけで書くと、`ActiveDocument.ActiveLayer.CreateRectangle…` のような長ったらしいAPI呼び出しがあちこちに散らばり、後から「やっぱり全ての矩形の角を丸めたい」となったときに地獄の修正作業が待っています。
ここでクラスモジュールの出番です。
クラスモジュールを使うと、CorelDRAWの生々しいAPI(アプリケーション層、ドキュメント層、レイヤー層)を隠蔽(カプセル化)し、「私のCustomRectangle(カスタム矩形)オブジェクト」という独自の概念を作り出すことができます。
- カプセル化: 複雑なCorelDRAWの内部処理を隠し、`rect.Color = “Red”` のように直感的なプロパティやメソッドで操作できるようにする。
- 再利用性: 一度作ったクラスは、別のプロジェクトでもそのまま部品として使い回せる。
- 保守性: APIの仕様変更や要件変更があっても、クラスの内部だけを修正すれば、呼び出し側のコードは1行も変えなくてよい。
それでは、実際の設計とコードを見ていきましょう。
—
実践:CorelDRAW操作をカプセル化する設計
今回は、「位置・サイズ・色・角丸」をカプセル化して管理できる「SmartShape(スマートシェイプ)」クラスを設計します。
ステップ1:クラスモジュールの作成
VBAエディタ(VBE)を開き、メニューの [挿入] > [クラス モジュール] を選択します。
プロパティウィンドウで、このクラスの名前を `SmartShape` に変更してください。
以下のコードを `SmartShape` クラスの中に貼り付けます。
‘ ==============================================================================
‘ クラス名: SmartShape
‘ 概要: CorelDRAWの矩形シェイプをオブジェクト指向的にカプセル化するクラス
‘ ==============================================================================
Option Explicit
‘ 内部で保持するCorelDRAWの実際のシェイプオブジェクト
Private m_Shape As Shape
Private m_Layer As Layer
‘ プロパティ用変数の定義
Private m_X As Double
Private m_Y As Double
Private m_Width As Double
Private m_Height As Double
Private m_FillColor As Long ‘ RGB値
Private m_CornerRadius As Double
‘ コンストラクタ(クラス初期化時にレイヤーを受け取る)
Public Sub Init(targetLayer As Layer)
Set m_Layer = targetLayer
‘ デフォルト値の設定
m_X = 0#
m_Y = 0#
m_Width = 50#
m_Height = 50#
m_FillColor = RGB(255, 0, 0) ‘ デフォルトは赤
m_CornerRadius = 0#
End Sub
‘ — プロパティの定義(カプセル化の要) —
Public Property Let X(val As Double)
m_X = val
If Not m_Shape Is Nothing Then m_Shape.PositionX = m_X
End Property
Public Property Let Y(val As Double)
m_Y = val
If Not m_Shape Is Nothing Then m_Shape.PositionY = m_Y
End Property
Public Property Let Width(val As Double)
m_Width = val
If Not m_Shape Is Nothing Then m_Shape.SetSize m_Width, m_Height
End Property
Public Property Let Height(val As Double)
m_Height = val
If Not m_Shape Is Nothing Then m_Shape.SetSize m_Width, m_Height
End Property
Public Property Let FillColor(val As Long)
m_FillColor = val
If Not m_Shape Is Nothing Then
m_Shape.Fill.UniformColor.RGBAssign _
Red(m_FillColor), Green(m_FillColor), Blue(m_FillColor)
End If
End Property
Public Property Let CornerRadius(val As Double)
m_CornerRadius = val
‘ CorelDRAWの矩形特有の角丸処理(0〜50のパーセンテージ)
If Not m_Shape Is Nothing And m_Shape.Type = cdrRectangleShape Then
m_Shape.Rectangle.CornerRoundness = m_CornerRadius
End If
End Property
‘ — メソッドの定義(図形を実際に描画・生成する) —
Public Sub Create()
‘ CorelDRAWのAPIを叩いて矩形を生成
Set m_Shape = m_Layer.CreateRectangle(m_X, m_Y, m_X + m_Width, m_Y – m_Height)
‘ プロパティの値をシェイプに反映
Me.FillColor = m_FillColor
Me.CornerRadius = m_CornerRadius
End Sub
‘ — メソッドの定義(移動する) —
Public Sub Move(deltaX As Double, deltaY As Double)
m_X = m_X + deltaX
m_Y = m_Y + deltaY
If Not m_Shape Is Nothing Then
m_Shape.Move deltaX, deltaY
End If
End Sub
ステップ2:標準モジュールからの呼び出し
次に、標準モジュールを1つ追加し、先ほど作成した `SmartShape` クラスをインスタンス化して使ってみましょう。
コードの美しさに注目してください。CorelDRAW特有の複雑なレイヤー操作やプロパティ代入が、まるでプレハブ住宅のパーツを組み立てるかのようにシンプルになっています。
‘ ==============================================================================
‘ 標準モジュール: MainModule
‘ 概要: SmartShapeクラスを利用して図形を配置するメイン処理
‘ ==============================================================================
Option Explicit
Sub DrawWithObjectOriented()
‘ 1. アクティブドキュメントとアクティブレイヤーの取得
Dim doc As Document
Set doc = ActiveDocument
If doc Is Nothing Then
MsgBox “ドキュメントが開していません。”, vbCritical
Exit Sub
End If
Dim lyr As Layer
Set lyr = doc.ActiveLayer
‘ 2. クラスのインスタンス化(オブジェクトの生成)
Dim myBox As SmartShape
Set myBox = New SmartShape
‘ 3. 初期化(レイヤーを注入:依存性の注入の基本形)
myBox.Init lyr
‘ 4. プロパティの設定(直感的な代入)
myBox.X = 100
myBox.Y = 200
myBox.Width = 80
myBox.Height = 40
myBox.FillColor = RGB(0, 120, 215) ‘ 青色
myBox.CornerRadius = 25 ‘ 角を丸くする
‘ 5. 描画実行!
myBox.Create
‘ 6. 追加の操作(メソッドの呼び出し)
myBox.Move 50, -50
MsgBox “オブジェクト指向による図形描画が完了しました!”, vbInformation
End Sub
—
プロが教える!陥りやすい罠とパフォーマンスの知見
クラスモジュールを使った設計は非常に強力ですが、CorelDRAW VBA特有の「重み」を知らないと、思わす痛い目を見るポイントがあります。
1. オブジェクトのライフサイクルとメモリ管理
VBAのクラスは、スコープを抜けると自動的に破棄されます(デストラクタ `Class_Terminate` が走ります)。
しかし、CorelDRAWの `Shape` オブジェクトや `Layer` オブジェクトへの参照 (`Set m_Shape = …`) を保持し続けたままクラスが破棄されないと、メモリリークやCorelDRAWの不安定化を招く原因になります。
大規模なツールを作る際は、不要になったクラス変数を `Set myBox = Nothing` で明示的に解放する癖をつけましょう。
2. 画面描画の最適化(ScreenUpdating)
もし、この `SmartShape` クラスをループさせて100個の図形を一気に作ろうとした場合、標準のままでは描画が毎回走ってしまい、処理が極端に遅くなります。
プロのエンジニアは、クラスを呼び出す前後に必ず以下を挟みます。
ActiveDocument.BeginCommandGroup “Batch Create”
Application.Optimization = True ‘ 画面描画とイベントを停止して爆速化
‘ — ここでクラスを使った大量処理 —
Application.Optimization = False
ActiveDocument.EndCommandGroup
ActiveWindow.Refresh
この一工夫を入れるだけで、実行スピードが何十倍も変わります。
—
まとめ
今回は、CorelDRAW VBAにおけるクラスモジュールを使ったオブジェクト指向設計を解説しました。
- 標準モジュールのベタ書きから卒業し、クラスでロジックをカプセル化する。
- プロパティ(`Let`)やメソッドを使って、直感的でメンテナンス性の高いコードを書く。
- CorelDRAWのオブジェクトのライフサイクルとパフォーマンス(`Optimization`)を意識する。
ここをクリアすれば、あなたはもうただのマクロ記録者ではありません。胸を張って「CorelDRAW業務自動化エンジニア」と名乗ることができます。
ぜひ、日々の定型業務の自動化にこの設計論を取り入れてみてください。あなたのVBAコード見違えるほど美しく、強靭になりますよ!
