【入門編】【上級プロ向け】クラスモジュールを使ったオブジェクト指向VBA開発:CorelDRAW操作をカプセル化して再利用性を高める設計論 – CorelDRAW VBA解析バイブル

スポンサーリンク

こんにちは!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コード見違えるほど美しく、強靭になりますよ!

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