LoginSignup
17
21

More than 5 years have passed since last update.

Excelの座標値リストから図形を作成

Last updated at Posted at 2016-06-30

Excelで設計した座標データから紙の模型を作る際、データを図形化するのに困っていた。グラフの「散布図」を使えばおおよその形は分かるが、縦横比を厳密に指定できないため模型には向かない(軸などを消す手間もある)。そこで、VBAを用いて座標値を読み取り折れ線図形を出力することにした。

コードを書いたのは2007年頃のはずだが、今もたまに使っている。(それどころかExcelを「表計算機能付きドローソフト」扱いすることが多くなった)

方法

  1. BuildFreeform で図形作成用のオブジェクトを作る(開始点も指定)
  2. AddNodes でオブジェクトに点を追加していく
  3. 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

もちろん模型作りだけでなく、寸法などが正確であってほしいもの全般の描画に使用できる。

polyline_sample.png

参考

Excel VBA リファレンス

17
21
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
21