概要
Excel VBAを用いたグラフィック描画の連載「花びらを描く」も、いよいよ最終回を迎えました。第1回では基本的な図形の配置、第2回では三角関数を用いた花びらの座標計算に焦点を当てましたが、本稿では、それらの知識を統合し、より滑らかで洗練された「ベジェ曲線」を用いた花びらの生成と、それを動的に制御するアニメーション技術について深掘りします。Excelは単なる表計算ソフトではなく、VBAの力を借りれば強力な描画エンジンへと変貌します。本記事では、数式とプログラムを融合させ、Excelシート上に芸術的な幾何学模様を構築する技術を伝授します。
詳細解説:ベジェ曲線による滑らかな描画
これまでの連載では、直線や単純な円弧の組み合わせで花びらを表現してきましたが、自然界の曲線美を再現するには「ベジェ曲線」の概念が不可欠です。ベジェ曲線とは、始点、終点、そして制御点によって定義される曲線であり、VBAの「AddCurve」メソッドを用いることで実装可能です。
花びらの形状を決定づけるのは、極座標変換による座標算出と、それらを結ぶための制御点のオフセット計算です。具体的には、花びらの中心軸に対して左右対称の制御点を設定することで、花びらがふっくらとした有機的なラインを描くようになります。
ここで重要となるのは「媒介変数t」の考え方です。0から1までの値を変化させることで、曲線の軌跡を一意に決定します。VBAでこれを実装する際、単に点を打つのではなく、Shapeオブジェクトの「Nodes」プロパティを操作することで、描画後の形状修正も可能となります。本稿の最終コードでは、これらの数理的アプローチを統合し、ユーザーがパラメータ(花びらの枚数、湾曲率、サイズ)を自由に変更できる設計としました。
サンプルコード
以下のコードは、アクティブシート上に指定した枚数の花びらをベジェ曲線で描画し、それを回転させることで花びら全体を形成するプログラムです。
Sub DrawPetalsWithBezier()
Dim ws As Worksheet
Set ws = ActiveSheet
ws.Shapes.SelectAll
Selection.Delete
Dim centerX As Double, centerY As Double
Dim radius As Double, petalCount As Integer
Dim i As Integer, angle As Double
Dim shp As Shape
centerX = 300
centerY = 300
radius = 150
petalCount = 8
For i = 0 To petalCount - 1
angle = (2 * Application.Pi() / petalCount) * i
' ベジェ曲線による花びらの生成
' 始点(centerX, centerY)から終点へ向かう曲線
Set shp = ws.Shapes.AddCurve(CreatePointArray(centerX, centerY, angle, radius))
With shp
.Line.ForeColor.RGB = RGB(255, 100, 150)
.Line.Weight = 2
.Rotation = (360 / petalCount) * i
End With
Next i
End Sub
Function CreatePointArray(cx As Double, cy As Double, theta As Double, r As Double) As Single()
' 簡易的な曲線ポイント生成ロジック
' 実務ではこの配列に制御点の座標を代入する
Dim pts(1 To 4, 1 To 2) As Single
pts(1, 1) = cx: pts(1, 2) = cy
pts(2, 1) = cx + r * Cos(theta) * 0.5: pts(2, 2) = cy + r * Sin(theta) * 0.5
pts(3, 1) = cx + r * Cos(theta) * 0.8: pts(3, 2) = cy + r * Sin(theta) * 0.8
pts(4, 1) = cx + r * Cos(theta): pts(4, 2) = cy + r * Sin(theta)
CreatePointArray = pts
End Function
実務アドバイス
実務においてVBAでグラフィックスを扱う際、最も注意すべきは「オブジェクトのメモリ管理」です。大量のShapeオブジェクトを生成する場合、処理の最後に必ず不要な図形を削除するルーチンを組み込んでください。また、描画速度を向上させるために、描画中は`Application.ScreenUpdating = False`を宣言し、描画完了後に`True`に戻すテクニックは必須です。
さらに、プロフェッショナルなレベルを目指すのであれば、「クラスモジュール」の活用を推奨します。「Petal」というクラスを作成し、そこに「描画色」「サイズ」「回転角」をプロパティとして持たせることで、複数の花を画面上に並べたり、個別にアニメーションさせることが容易になります。コードの再利用性を高めることは、長期的なメンテナンスコストを抑える鍵となります。
また、色の決定にはRGB値だけでなく、HSV色空間を用いることも検討してください。色相(Hue)を一定の規則で変化させることで、グラデーションの美しい花びらを描くことができ、視覚的な品質を飛躍的に向上させることが可能です。
まとめ
第2回にわたる「花びらを描く」シリーズを通じて、Excel VBAによる図形描画の基礎から、ベジェ曲線を用いた高度な表現手法までを解説しました。VBAは単なる業務自動化ツールではありません。数学的なアルゴリズムを具現化し、視覚的なアウトプットを行うための創造的なキャンバスでもあります。
今回作成したコードをベースに、独自のパラメータを追加したり、ランダム性を組み込んで「デジタル生成アート」へと発展させてみてください。Excelという枠組みの中で、どれだけ自由に表現できるか。その限界に挑むことこそが、VBAプログラミングの真の醍醐味といえるでしょう。本連載が、皆様のVBAスキル向上と、新たな創作のインスピレーションの一助となれば幸いです。次なるステップとして、ぜひクラスモジュールを活用したオブジェクト指向描画の世界へ挑戦してください。
