Excelで設計した座標データから紙の模型を作る際、データを図形化するのに困っていた。グラフの「散布図」を使えばおおよその形は分かるが、縦横比を厳密に指定できないため模型には向かない(軸などを消す手間もある)。そこで、VBAを用いて座標値を読み取り折れ線図形を出力することにした。
コードを書いたのは2007年頃のはずだが、今もたまに使っている。(それどころかExcelを「表計算機能付きドローソフト」扱いすることが多くなった)
久しぶりの工作。何ができるかな? pic.twitter.com/PckyNqPLMI
— Nomoto (@HMMNRST) 2018年12月2日
答え:熱気球の球皮 pic.twitter.com/6FOlx0ki46
— Nomoto (@HMMNRST) 2018年12月2日
方法
-
BuildFreeform
で図形作成用のオブジェクトを作る(開始点も指定) -
AddNodes
でオブジェクトに点を追加していく -
ConvertToShape
で図形作成を完了する
引数に与える座標値については、マニュアルによると以下の決まりがある。
- シートの左上隅が原点で、x座標は右向きが正、y座標は下向きが正
- 単位はポイント(pt)。1 pt = 1/72 in, 1 in = 25.4 mm
また、実際に試したところ以下の動作をしているように感じる。
- 終点を始点と同じにすると図形が閉じる
- 負の座標値があると、作成後に図形全体が正の領域に入るよう平行移動
- 古いExcelでは隣り合う2点が近すぎるとエラー(2003で確認、2010では発生せず)
サンプルコード
N行2列のxy座標リスト(単位:mm)を選択してマクロを実行すれば図形を作成できる。
Option Explicit
Option Base 1
Sub DrawPolyline()
Dim C As Variant
Dim f As Double
Dim n As Integer
Dim m As Integer
Dim i As Integer
' セルの読み込み
n = Selection.Rows.Count
m = Selection.Columns.Count
If (n < 2 Or m <> 2) Then
MsgBox ("座標リストには2行以上×2列(x,y)の矩形領域を選択してください")
Exit Sub
End If
C = Selection.Value
' 単位換算(セル入力値[mm] -> 内部処理[pt])
f = 72 / 25.4 ' 1pt=1/72in, 1in=25.4mm
For i = 1 To n
C(i, 1) = C(i, 1) * f
C(i, 2) = C(i, 2) * f
Next i
' ポリライン(フリーフォーム)の作成
With ActiveSheet.Shapes.BuildFreeform(msoEditingAuto, C(1, 1), C(1, 2))
For i = 2 To n
.AddNodes msoSegmentLine, msoEditingAuto, C(i, 1), C(i, 2)
Next i
.ConvertToShape.Select
End With
End Sub
もちろん模型作りだけでなく、寸法などが正確であってほしいもの全般の描画に使用できる。
参考
Excel VBA リファレンス