[VBA] Excel VBAで円弧を描くのが思ったより大変だった

  • 投稿日:
  • by
  • Category:

「円弧とは何ぞや」という方はまずExcelで描いてみて欲しい。

挿入-図形から「円弧」を選択する

001.png

そしてマウスを適当にクリックすると円弧を描くことができる。

002.png

これが円弧。

マウスで描画するならたったこれだけの話なのだが、これをVBAでやろうとするとなかなか難しかった。

世界で一番わかりやすい記事が既にあるのだが、一発では飲み込めず四苦八苦したため備忘録として残しておく。

 

 

Excel 円弧の仕様(その1) 円弧は全円ベース

003.png

先ほど適当に描いた円弧を見てピンときた方は相当なセンスをお持ちだろう。

というのも、Excelの円弧は、描くと必ず「全円の右上1/4」として描画されるという特性がある。

004.gif

実際に色々な形で円弧を描いてみると分かるが、どうやってもこの図のように「右上1/4が描画された円」が作成される。

「円弧は全円の一部」で、「初期生成時は右上1/4が表示」される。これがポイント(その1)だ。

 

Excel 円弧の仕様(その2)描画範囲を指定する

円弧を選択すると8つの白丸の他に、2つの黄丸🟡が表示される。

003.png

この🟡を動かすと円弧の描画範囲を変更することができる。

005.png

実際に動かしてみると分かりやすい。元々は全円のオブジェクトで、2つの🟡で指定された範囲だけ弧が描画されるイメージだ。

2つある黄丸うちの一つが描画開始角度、もう一つが描画終了角度を表している。これがポイント(その2)。

 

おさらい

おさらいすると、

・円弧を描くと全円の右上1/4が表示されたものが生成される
・2つの🟡で描画範囲(開始角度と終了角度)を指定する。

この2点を把握しておくと、ひとまずVBAで円弧を描くことは可能になる。

 

実際にVBAで描画してみる

VBAで円弧の図形を描くには Shapes.AddShape()を使用する

Set shp = ActiveSheet.Shapes.AddShape(msoShapeArc, left, top, width, height)

引数は5つあり、1つ目に描画したい形「円弧」を意味するmsoShapeArcを、残りはleft, top, width, heightを指定する。

GUIに表示される枠線のイメージだとleft,topには左上⚪の座標(x,y)を指定すればいいように感じるが、そうではない点に注意。

例えば(150, 150, 100, 100)を指定して実行すると、このような円弧が描かれる。

006.png

left,topに指定した座標(150, 150)は円弧の頂点(黄丸)の位置になる。左上白丸ではない

ピンとこない場合は、全く同じ値を指定して四角形を描画してみると分かりやすい。

Set shp2 = ActiveSheet.Shapes.AddShape(msoShapeRectangle, left, top, width, height)
shp2.Fill.Visible = False ' 円弧が見えなくなるため塗りつぶさない

007.png

見て分かるように、GUIの枠線と違って1/4の円弧を囲むように四角形が描画された。

個人的にはこの四角形の方が円弧描画時に指定する座標のイメージがしやすい。

leftは円弧の左端、topは円弧の上端。その左上原点を基準にwidthとheightで縦横の長さが決まるイメージだ(以後この青線四角形を円弧補助線と呼ぶ)。

 

開始角度、終了角度の変更

描画直後は(勝手に)右上1/4の円弧が描画されるわけだが、別にこの扇形が欲しいというわけではない。

求めている円弧を描画するには、円弧の描画開始角度、終了角度を変更する必要がある。

With shp.Adjustments
    .Item(1) = 35
    .Item(2) = 120
End With

このように、Adjustments.Item(1)と(2)に開始角度、終了角度を指定すれば「円の何度から何度まで実線を描くか」を指定できる。

008.png

ちなみにデフォルトでは-90°と0°が指定されている(右上1/4が表示されるのはこのため)

注意が必要なのは、Adjustmentsを変更するとLeft, Topも変わる点。

円弧の描画範囲が変わると円弧の左端、上端の位置も変わるので、それに応じてLeft, Topも自動的に書き変わる。

画像の例ではAddShape時にはLeft:150/Top:150を指定したが、Adjustments変更後に値を確認するとLeft:50/Top:250に変わっていた。

 

下半円を描いた場合

またまた勘のいい方ならピンとくるかもしれないが、先ほど書いた「leftは円弧の左端、topのは弧の上端」という定義は厳密には不正確だ。

というのも、上画像と同様にAdjustmentを設定して下半円の円弧を描いた場合、この「leftは円弧の左端、topのは弧の上端」のとおり円弧補助線を引くと下図赤色の四角形になってしまう。

009.png

(点線は補助線なので無視してほしい)

実際の値を見るとLeft:50/Top:250になっており、円弧補助線は青色の四角形になる。

ポイントは黄点で示した円の中心点。「Left, Topは円の中心座標(x,y)より大きくならない」というルールがあるようだ。

Topを求める場合、

上半円の円弧を描くと、円弧の上端は必ず中心点より上になるためTop=円弧の上端となるが、
下半円を円弧を描くと、円弧の上端は中心点より下(赤線の位置)になるが、この場合Top=中心点のY座標が設定される。

Leftを求める時も同様で、

左半円の円弧を描くとLeft=円弧の左端だが、
右半円の円弧を描くとLeft=中心点のX座標になる。

そのため、キチンと定義するなら「円弧の左端上端中心点の3点すべて含む矩形(=円弧補助線)を描き、その左端座標がLeft、上端座標がTop」ということになる。
(もっと簡潔な言い回しがありそうだが、頭のいい人がコメントしてくれるだろう)

 

まとめ

VBAで円弧を描く際は全円と中心点、そして円弧補助線を脳内で補完するとイメージがわかりやすい。

ここまで分かった上で冒頭に紹介した記事を読むと、何と分かりやすい記事なのかと感動することになるだろう。

010.png

VBAで楕円の円弧を描画 - Qiita より

ここまでだらだら書いた内容がこの一枚ですべて説明がつく。すげぇ。

コメントする