概要
Excel VBAを用いたグラフィック描画の世界へようこそ。本連載では、数学的なアルゴリズムを駆使してExcelシート上に「花」を描き出す手法を解説しています。第3回となる今回は、全3回構成の「花びらを描く」フェーズの序章です。単なる図形の配置ではなく、三角関数(サイン・コサイン)を用いた座標計算の基礎を学び、一枚の花びらを自在に操るためのロジックを構築します。Excelのセルをキャンバスに見立て、VBAのShapeオブジェクトを制御することで、プログラムでしか表現できない緻密な幾何学模様の世界を体験してください。
詳細解説
花びらを描くためには、まず「曲線」を定義する数式を理解する必要があります。VBAで図形を描画する場合、フリーフォーム(FreeformBuilder)を使用するのが最も自由度が高い方法です。しかし、座標を一つずつ指定するのは非効率的です。ここで活用するのが「パラメータ表示」です。
花びらの形状を決定づけるのは、円周上の点ではなく、特定の軌道を描く関数の集合です。例えば、花びらの輪郭を極座標(r, θ)で表現すると、r = sin(n * θ) という数式が一般的です。ここで、nの値を調整することで花びらの枚数や鋭さを変化させることができます。
今回のステップ1では、まず「花びらの一枚分」の軌跡をExcelの座標系に落とし込むための「変換関数」を作成します。Excelの画面上の座標系は、左上が原点(0, 0)であり、Y軸は下向きに増加します。これに対し、数学上の座標系は上が正の方向です。この「上下反転」と「中心点のオフセット」を正確に行うことが、美しい曲線を描くための第一歩となります。
VBAのShapeオブジェクトには、頂点を追加する「AddNodes」メソッドがありますが、これをループ処理で回すことで、滑らかな曲線を描くことができます。ポイントは、計算した座標を「Double型」で保持し、最後に整数(Single型やLong型)へキャストする際の誤差を最小限に抑えることです。
サンプルコード
以下のコードは、指定した中心座標を起点として、数式に基づいた花びらの一枚をシェイプとして描画する基礎的な実装例です。
Sub DrawSinglePetal()
Dim ws As Worksheet
Set ws = ActiveSheet
' 花びらの基本設定
Dim centerX As Double, centerY As Double
Dim radius As Double, theta As Double
Dim i As Integer
Dim x As Double, y As Double
centerX = 300
centerY = 300
radius = 100
' フリーフォームビルダの初期化
Dim shpBuilder As FreeformBuilder
Set shpBuilder = ws.Shapes.BuildFreeform(msoEditingAuto, centerX, centerY)
' 花びらの軌跡を計算してノードに追加
' 0からπまでサイン波を使って花びらの形を作る
For i = 0 To 100
theta = (3.14159265358979 / 100) * i
' 花びらの形状を定義する数式
Dim r As Double
r = radius * Sin(theta * 2)
x = centerX + r * Cos(theta)
y = centerY - r * Sin(theta) ' Y軸反転の考慮
shpBuilder.AddNodes msoSegmentLine, msoEditingAuto, x, y
Next i
' 閉じて描画
Dim shpPetal As Shape
Set shpPetal = shpBuilder.ConvertToShape
' 装飾設定
With shpPetal
.Fill.ForeColor.RGB = RGB(255, 150, 200)
.Line.ForeColor.RGB = RGB(200, 50, 100)
.Line.Weight = 2
End With
End Sub
実務アドバイス
実務においてVBAで図形を描画する機会は少ないかもしれませんが、この「座標計算」と「オブジェクト操作」のスキルは、高度なレポート作成やダッシュボード構築に直結します。例えば、売上データをヒートマップのように図形で表現したり、進捗率をゲージチャートとして自作したりする際に、このコードのロジックが応用できます。
また、コードを書く際のポイントとして、「マジックナンバー(直接書かれた数値)」を避け、定数や変数として定義することを強く推奨します。今回のサンプルでも、`centerX`や`centerY`を定数化していますが、これをユーザーフォームから入力できるように改造すれば、動的な描画ツールへと進化します。
さらに、パフォーマンス面のアドバイスとして、大量のシェイプを描画する場合、`Application.ScreenUpdating = False`を冒頭に入れ、描画処理の最後で`True`に戻すことで、処理速度を劇的に向上させることが可能です。今回は一枚の描画ですが、後のステップで花びらを何枚も重ねる際、この処理は必須となります。
まとめ
第3回「花びらを作る 1/3」では、幾何学的な数式をVBAの座標系に落とし込み、基本的な花びらの一枚を描画するところまでを解説しました。ここで学んだ「三角関数を用いた座標変換」と「FreeformBuilderによる描画制御」は、今後の連載で花びらを回転させたり、複数の花びらを組み合わせて美しい花を咲かせたりするための最も重要な基盤となります。
プログラムで描く図形には、手作業では決して表現できない「数学的な正確さ」が宿ります。まずはサンプルコードをそのまま動かし、次に`r`の数式をいじって、どんな形の図形になるのかを試してみてください。失敗を恐れず、数値を変えて変化を楽しむことこそが、プログラミング技術を習得する最短の近道です。次回の「2/3」では、この一枚を回転させ、複数の花びらを配置するロジックを構築します。準備を整えておいてください。
