概要
Excel VBAを用いた図形描画シリーズ、その第2回「花びらを描く」の完結編へようこそ。前回の記事では、基本的な楕円の配置と回転角の概念について解説しました。本稿では、最終ステップとして、三角関数(Sin, Cos)を駆使した「数式による花びらの自動生成」と、ベジェ曲線による「有機的な曲線描画」の高度な実装手法を伝授します。単に図形を並べるだけでなく、数学的な裏付けを持った美しい花びらをプログラムで制御することで、VBAによるグラフィック表現の可能性を最大限に引き出します。
詳細解説
花びらを描くという行為は、プログラミングにおいて「極座標系」の理解を深める絶好の題材です。中心点からの距離(半径)と、回転角度(ラジアン)を組み合わせることで、円周上に規則的に並ぶ花びらを生成します。
数式による制御の要点は、以下の3点に集約されます。
1. 角度のラジアン変換:VBAの三角関数はラジアンを引数に取ります。「度数 × Pi / 180」という変換式は、グラフィック処理における基本です。
2. 座標計算:中心点(cx, cy)に対し、x = cx + r * cos(theta)、y = cy + r * sin(theta) という数式を適用します。これにより、どんな半径の円上にも正確に図形を配置可能です。
3. 図形の変形と回転:VBAのShapeオブジェクトが持つRotationプロパティを利用し、生成する花びらの角度を逐次更新します。
特に重要なのは「花びらの重なり」を考慮した計算順序です。中心に近い部分から描画するのか、あるいは外側から重ねるのか。この計算ロジックが、生成される花の「立体感」を左右します。また、ベジェ曲線の制御点(Control Point)を動的に算出することで、単なる楕円の集合体ではない、より自然で繊細な花びらの形状を再現することが可能になります。
サンプルコード
以下のコードは、指定した中心座標を基準に、数学的に計算された位置と角度で花びらを描画するプロシージャです。
Sub DrawFlowerPetals()
Dim ws As Worksheet
Set ws = ActiveSheet
Dim centerX As Double, centerY As Double
Dim radius As Double, numPetals As Integer
Dim i As Integer, angle As Double
Dim petal As Shape
' 初期設定
centerX = 300
centerY = 300
radius = 100
numPetals = 12
' 既存の図形をクリア(必要に応じて)
For Each petal In ws.Shapes
If petal.Name Like "Petal_*" Then petal.Delete
Next petal
' 花びらの描画ループ
For i = 0 To numPetals - 1
angle = (2 * Application.Pi() / numPetals) * i
' 楕円形を作成し、数式で座標を決定
Set petal = ws.Shapes.AddShape(msoShapeOval, _
centerX + radius * Cos(angle) - 20, _
centerY + radius * Sin(angle) - 40, _
40, 80)
' 図形の装飾と回転
With petal
.Name = "Petal_" & i
.Rotation = (360 / numPetals) * i
.Fill.ForeColor.RGB = RGB(255, 150, 200)
.Line.Visible = msoFalse
End With
Next i
End Sub
実務アドバイス
実務においてVBAでグラフィックを扱う際、最も陥りやすい罠は「再描画の遅延」です。数千個の図形を一度に生成する場合、画面の更新を停止させることで実行速度が劇的に向上します。コードの冒頭に `Application.ScreenUpdating = False` を記述し、終了時に `True` に戻す処理は必須です。
また、作成した図形をグループ化して一つのオブジェクトとして扱うテクニックも重要です。`ws.Shapes.Range(Array(…)).Group` を使用することで、生成後に位置を微調整したり、サイズを全体的に変更したりすることが容易になります。
さらに、色味を決定する際に「RGB関数」を乱数と組み合わせることで、毎回異なる色彩の花を咲かせることも可能です。`RGB(Int(Rnd * 256), Int(Rnd * 256), 255)` といった記述で、淡いピンクからパープルまでのグラデーションを自動生成するなど、実務的なレポートのアクセントとしても活用できます。
まとめ
第2回にわたる「花びらを描く」テーマの完結編として、数式とコードによる描画の融合を解説しました。VBAは単なる業務効率化のためのツールではありません。今回のような幾何学的なアプローチを習得することで、Excelの柔軟性を最大限に活用した「デジタルアート」の領域まで踏み込むことができます。
座標計算の精度、三角関数の活用、そしてオブジェクトのプロパティ操作。これらはすべて、VBAの基礎でありながら、奥深いプログラミングの真髄です。今回作成したコードをカスタマイズし、花びらの枚数を変えたり、色を動的に変化させたりして、あなただけの「デジタルガーデン」をExcel上に構築してみてください。技術的な探求心こそが、ベテランエンジニアへの最短ルートです。
