とくになにもないよ

パワプロとか雑記とか #などと

VBAで円弧(もどき)を描画するプログラムを書いた話

こんばんわ。
今回はついにパワプロ以外の話をします。

 

何の話かといいますとVBAの話です。
とか言っても10000件のデータを条件に応じて抽出して条件ごとに別のシートに書き出すものではなくて、円弧(もどき)を描画するプログラムです
それではコードの紹介に参りましょう。

Sub PseudoArcDraw() '直訳すると「円弧もどきを描画」

Dim x As Single

Dim y As Single

Dim Radius As Single

Dim Sine As Single

Dim Cosine As Single

Dim StartDegrees As Single

Dim EndDegrees As Single

Radius = 100 '半径を指定

x = 200      '横方向の座標(単位はポイント)を指定

y = 200      '縦方向の座標(単位はポイント)を指定

StartDegrees = 0  '起点角度(単位は度数法)を指定

EndDegrees = 90  '終点角度(単位は度数法)を指定

Sine = Sin(2 * 3.1416 * ((360 - StartDegrees) / 360))
'VBAのSin関数がラジアン角で指定する仕様になっているので、ここで度数法からラジアン角に変換。

Cosine = Cos(2 * 3.1416 * ((360 - StartDegrees) / 360))
'VBAのCos関数がラジアン角で指定する仕様になっているので、ここで度数法からラジアン角に変換。

With ActiveSheet.Shapes.BuildFreeform(msoEditingAuto, x + (Cosine * Radius), y + (Sine * Radius))
'ここで線の起点位置を指定。
             
             
    For Degrees = StartDegrees To EndDegrees '起点から終点までの角度を指定。
'この場合は0(右端)から90(上端)までの1度刻みで変化する円弧もどきが描画される。
'ここをいじれば任意の角度の円弧もどき、Stepを用いれば五芒星も描画可能。
                          
        Sine = Sin(2 * 3.1416 * ((360 - Degrees) / 360))
 'VBAのSin関数がラジアン角で指定する仕様になっているので、ここで度数法からラジアン角に変換。
        
        Cosine = Cos(2 * 3.1416 * ((360 - Degrees) / 360))
'VBAのCos関数がラジアン角で指定する仕様になっているので、ここで度数法からラジアン角に変換。
        
       .AddNodes msoSegmentLine, msoEditingAuto, x + (Cosine * Radius), y + (Sine * Radius)
'起点(もしくは前に描画された線の終点)から縦方向にCos(変数Degreesの値)×半径、横方向にSin(変数Degreesの値)×半径の線を描画。
        
    Next Degrees
    
    .ConvertToShape.Select
    'これをしないと書いた線が図形にならない。
    
End With
End Sub

…え?せっかく円弧(msoShapeArc)があるのだからそれで書けばいいじゃんって?
いやいや、今回この話をしたのは理由がある。それは…
ワイは実際の鉄道会社が使うような路線図をだれでも比較的簡単に書けるVBAプログラムを書く、という目標があるからだ!
そして今回このプログラムを書いた理由は…
円弧(msoShapeArc)使うと座標を取得したその後がいろいろとめんどくさいからだよ!!!!
(90度なら問題ないが、45度などにするとshapse.width等で取得した座標と線の終点がずれる)

なので「円弧(もどき)」でお茶を濁した、という具合です。




以上!
追記:コードに誤りがあったので修正しました。