【Excel VBA】数式の模様を描く作図ツールの実装の工夫3選|自動作図・増減ボタン・画像出力
まずは動画で、3つの工夫の全体をご覧ください(一部の画面は加工しています)。
セルの数値を変えるだけで、幾何学模様がその場で描き変わる。そんな作図ツールを Excel VBA で作りました。リサージュ曲線とトロコイド曲線を組み合わせた模様を描くツールです。
ツールの機能の一覧やサンプルブックのダウンロードは、「Excelで幾何学模様を自動作図するツールを作りました」で紹介しています。
この記事はその続きとして、実装の考え方に絞って解説します。取り上げるのは次の3つです。
数値を変えると自動で描き直す仕組み
選んだセルの横にだけ増減ボタンを出す仕組み
描いた図形を画像ファイルに保存する仕組み
どれも模様を描くためだけのものではなく、ほかの業務のツールにも応用できる作り方だと考えています。コードは、実際のブックから要点を抜き出したものです。
工夫1:数値を変えると自動で描き直す
計算した座標は、そのままでは描けない
曲線の計算で得られるのは、X と Y の数の並びです。これをシートの図形にするには、2つの問題があります。
1つ目は大きさです。計算結果の範囲はパラメータによって変わるので、そのままではキャンバスからはみ出したり、小さくなりすぎたりします。
2つ目は向きです。数学の座標は Y が上向きですが、シートの Top は下向きです。

セルが変わったら、5つの手順で描き直す
処理は次の順番で進めています。
パラメータのセルが変わったことを検知する
XY 座標を計算する(結果は2次元配列で受け取る)
最大と最小から倍率を決めて、キャンバスに収める
中心を基準に Y の向きを反転して、シートの位置に置き換える
古い図形を消して、1本の折れ線として描く

最初の検知は、Worksheet_Change と Intersect の組み合わせです。パラメータのセルが変わったときだけ描き直すので、ほかのセルを編集しても処理は動きません。
倍率は、X と Y のうち広い方の範囲がキャンバスに収まるように決めます。上下左右に少し余白を残すため、5%小さくしています。
シートの位置への置き換えは、Left には中心に X を足し、Top は中心から Y を引くだけです。この引き算で上下の向きがそろいます。
この変換は「ConvXYListForSheetCenter」として部品にしています。
描くときは、点の数だけ線を引くのではなく、AddPolyline で全部の点を1本の折れ線にします。図形が1つで済むので、次に描き直すときも名前を指定して消すだけです。初期値の例では、点の数は 1,354 個になります。描画の部品は「DrawPolyLineAddPolyLine」で紹介しています。
実際の画面では、値を変えるたびに模様がその場で描き直されます。

図形が1つにまとまっているので、線だけの表示と塗りつぶしの切り替えも、その図形の設定を変えるだけで済みます。

曲線の計算方法は書籍で
この記事では、計算した座標を図形にする部分に絞っています。曲線の計算方法を詳しく知りたい方には、次の書籍が参考になります。Excel を使って、ストリング・アートやフラクタル図形などの数学的なアートを作る方法を解説した本です。
書名:アートで魅せる数学の世界
著者:岡本健太郎
出版社:技術評論社(2021年)
工夫2:選んだセルの横にだけ増減ボタンを出す
打ち直しも、ボタンの並べすぎも使いにくい
模様づくりでは、数値を少しずつ変えて結果を見比べます。毎回キーボードで打ち直すのは手間です。かといって、セルごとにスピンボタンを置くと、パラメータの数だけ画面にボタンが並びます。

ボタンの名前に、幅と範囲を持たせる
そこで、セルを選んだときだけ、そのセルの横にボタンを作ることにしました。前のボタンは消すので、画面に出るのはいつも1組だけです。
セルによって、ちょうどよい増減の幅は違います。そこで、セルごとに下限・上限と、並べる幅を指定しています。
工夫したのは、この幅と範囲をボタンの名前に書き込んでおく点です。たとえば M のセルの「+10」のボタンは、次の名前になります。
ボタンを押すと、Application.Caller で押されたボタンの名前を取得し、Split で分けて、幅・下限・上限を取り出します。
この形にすると、ボタンごとに別のマクロを用意しなくても、増やす処理と減らす処理の2つで全部のボタンを動かせます。設定を保存するためのセルや変数も要りません。

実際の画面では、選んだセルに合わせて、幅の違うボタンが横に現れます。

ボタンを出す部品は「EventShowSpinButton_Multi」、上限・下限の範囲で値を変える部品は「ChangeValueCell」で紹介しています。
工夫3:描いた図形を画像ファイルに保存する
図形には、画像に保存する命令が用意されていない
Excel の図形(Shape)には、画像ファイルとして保存する命令が用意されていません。一方で、グラフ(Chart)には Export という、画像に書き出す命令があります。

グラフを通り道にして書き出す
そこで、グラフを通り道にしています。手順は次のとおりです。
背景と模様をいったんグループにして、コピーする
一時的なシートにグラフを置いて、貼り付ける
Chart.Export で画像ファイルに書き出す
一時的なシートを消して、グループを元に戻す

書き出しの中心は、次の部分です。
出力する画像の大きさは、グラフの大きさで決まります。ピクセル数を指定しないときは図形の2倍の大きさで書き出し、指定したときは、その幅から倍率を逆算します。式の 1.463 は、指定した幅に合わせるための経験的な係数です。
実際の画面では、ボタンを押すと一時的なシートが一瞬現れ、書き出しが終わるとメッセージが表示されます。

実務で効いてくる2つの細工
1つ目は、コピーの完了を確かめていることです。クリップボードに図形が入る前に貼り付けてしまうと、処理が失敗することがあります。先にダミーの文字列をクリップボードに入れておき、それが消えたらコピーが終わったと判断しています。
2つ目は、失敗したときの片付けです。ピクセル数が大きすぎて書き出せないときは、一時的なシートを消し、グループも解除してから、ピクセル数を下げるようメッセージを出します。途中で止まっても、シートに余計なものが残りません。
また、ファイル名には全部のパラメータの値を入れています。あとで画像を見返したときに、どの設定で描いたものかがファイル名だけで分かります。

書き出しの部品は「OutputShapeToPicture」で紹介しています。
ほかの業務への応用
今回の3つの工夫は、作図以外のツールにも使えると考えています。
セルの数値から図形を描く:部品の外形、機器の配置図、軌跡など、計算で決まる形の作図
選んだセルに増減ボタンを出す:単価や数量、日付の微調整など、数値を試しながら決める表
図形やグラフを画像に書き出す:報告書やホームページに載せる図の一括作成
まとめ
数式の模様を描くツールを題材に、実装の工夫を3つ紹介しました。
計算した座標は、倍率と向きを補正してから、AddPolyline で1本の折れ線として描く
増減ボタンは選んだセルの横にだけ作り、幅と範囲はボタンの名前に持たせる
図形はグラフに貼り付けて Chart.Export で画像にし、使った一時シートは片付ける
ツール全体の機能とサンプルブックは「Excelで幾何学模様を自動作図するツールを作りました」をご覧ください。


