【VBAリファレンス】Excel VBAで描く幾何学の美学 第2回 花びらを描く 1/3

スポンサーリンク

概要

Excel VBAは単なるデータ集計や業務自動化のツールではありません。数学的なアルゴリズムを視覚化するための強力なキャンバスでもあります。本連載の第2回となる今回は、Excelのワークシートを広大なアートボードに見立て、VBAを用いて美しい「花びら」を描くというテーマに挑戦します。

「花びらを描く」という作業は、一見すると単純な図形描画に見えますが、その本質は「極座標」と「三角関数」の融合にあります。第1回で基礎的な座標変換を学んだ皆さんに、今回は「閉曲線」を数学的に定義し、それをVBAでどのようにシェイプオブジェクトとして再構築するかを解説します。3回にわたるシリーズの第1弾として、まずは花びらの骨格となる「数式」の理解と、VBAでの描画制御の基本をマスターしましょう。

詳細解説

花びらを描くためには、まず「極座標」の概念が必要です。通常の直交座標系(x, y)では、円や花びらのような曲線を描く際に、計算が非常に煩雑になります。そこで、角度θと原点からの距離rを用いて表現する極座標系を採用します。

花びらを表現する代表的な数式として、「バラ曲線(Rose Curve)」が挙げられます。数式は以下のように定義されます。
r = A * sin(n * θ)

ここで、Aは花びらの長さを決定するパラメータ、nは花びらの数を決定するパラメータです。この数式を直交座標系に変換するには、以下の変換式を用います。
x = r * cos(θ)
y = r * sin(θ)

この数式をVBAで扱う際、重要なのは「ステップ数」の設計です。VBAはコンピュータですので、連続的な曲線を引くためには、θを微小な値で刻んで計算し、その結果を直線(セグメント)で結ぶ必要があります。例えば、0から2πまでを100分割すれば、100本の線分によって滑らかな花びらが描き出されます。

サンプルコード

以下のコードは、Excelのシート上に「フリーフォーム」オブジェクトを作成し、数学的な計算結果を基に花びらの軌跡を繋ぐものです。


Sub DrawPetal_Phase1()
    Dim shp As Shape
    Dim ws As Worksheet
    Dim pi As Double
    Dim theta As Double
    Dim r As Double
    Dim x As Double, y As Double
    Dim n As Integer, A As Double
    Dim stepCount As Integer
    Dim i As Integer
    
    Set ws = ActiveSheet
    pi = Application.WorksheetFunction.Pi()
    n = 4 ' 花びらの数(調整可能)
    A = 100 ' 花びらの大きさ
    stepCount = 360 ' 描画精度(細かさ)
    
    ' 既存の図形を削除
    For Each shp In ws.Shapes
        shp.Delete
    Next shp
    
    ' フリーフォームの開始
    With ws.Shapes.BuildFreeform(msoEditingCorner, 300, 300)
        For i = 0 To stepCount
            theta = (2 * pi / stepCount) * i
            r = A * Sin(n * theta)
            x = r * Cos(theta)
            y = r * Sin(theta)
            
            If i = 0 Then
                .AddNodes msoSegmentLine, msoEditingAuto, 300 + x, 300 + y
            Else
                .AddNodes msoSegmentLine, msoEditingAuto, 300 + x, 300 + y
            End If
        Next i
        
        Set shp = .ConvertToShape
    End With
    
    ' デザインの装飾
    With shp
        .Fill.ForeColor.RGB = RGB(255, 182, 193)
        .Line.ForeColor.RGB = RGB(255, 105, 180)
        .Line.Weight = 2
    End With
End Sub

実務アドバイス

実務において、このような描画処理を行う際は「パフォーマンス」と「可読性」のバランスが重要です。

1. 画面更新の抑制: 描画プロセス中に `Application.ScreenUpdating = False` を設定することで、描画速度を飛躍的に向上させることができます。
2. 座標のオフセット管理: サンプルコードでは(300, 300)を基準点としていますが、実務ではセル位置や指定した範囲の中心座標を動的に取得するように設計すると、汎用性が高まります。
3. エラーハンドリング: 数学的な計算(特に巨大なAの値や、極端なステップ数)を行うと、オブジェクトの描画制限に引っかかることがあります。`On Error Resume Next` を活用しつつ、描画が失敗した場合のログ出力も考慮しましょう。
4. 数学の抽象化: 今回は直接コード内に計算式を書きましたが、実務では「数式部分」を独立したFunctionプロシージャとして切り出すことを強く推奨します。そうすることで、花びらの形状を「バラ曲線」から「心臓形(カージオイド)」などに変更する際、描画ロジックを修正することなく数式部分の入れ替えだけで対応可能になります。

まとめ

第2回目となる今回は、数学的な数式をVBAを通じてExcelのオブジェクトモデルに変換する手法を解説しました。花びらを描くというプロセスは、プログラミングにおける「抽象化」と「具現化」の訓練として非常に優れています。

今回作成したコードは、あくまで「骨格」です。次回、第3回では、この花びらにグラデーションや回転アニメーションを付与し、さらに動的な表現へと昇華させていきます。まずは今回提示したコードを実行し、パラメータ(nやAの値)を自由に変更して、どのような形の「花」が生まれるかを実験してみてください。Excel VBAというキャンバスの上で、皆さんの創造力を数学の力で解き放ちましょう。準備ができたら、次回のステップアップへ進みましょう。

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