ConvXYListForSheetCenter|XY座標をワークシートの作図座標に変換する
- yuji fukami
- 2 日前
- 読了時間: 5分

この部品でできること
ConvXYListForSheetCenter は、数学のグラフで使うXY座標の一覧を、ワークシート上に図形を描くための座標へ変換するExcel VBAの汎用プロシージャです。
XY座標の二次元配列を渡すと、そのままシートに作図できる座標の二次元配列を返す
指定した基準位置(CenterTop / CenterLeft)を座標の原点として扱える
数学のグラフでは上向きのY軸を、シートの下向きの座標に自動で反転する
計算で求めた座標をそのまま AddPolyline に渡すと、上下が反転した図形がシートの左上あたりに描かれてしまいます。この部品を間に挟むだけで、思ったとおりの位置・向きで作図できるようになります。
使いどころ
数式で計算した曲線(円・サインカーブ・リサージュ曲線など)をシート上に作図したいとき
セルに入力したXY座標の一覧を、そのまま図形として可視化したいとき
図形を「このセルの位置を原点にして」描きたいとき
CADのような感覚で、シート上に座標を指定して作図したいとき
コード
ConvXYListForSheetCenter 自体は依存プロシージャのない自己完結した部品ですが、実際に作図するところまで試せるよう、ポリラインを作図する DrawPolyLineAddPolyLine(と、その内部で使う Conv__ArrayXYSingle)、再作図のために既存の図形を消す DeleteShapeNameLike も含めています。下記をそのまま標準モジュールに貼り付ければ動作します。
使い方・引数
引数は3つです。
XYList(Variant)・・・座標一覧の二次元配列。1列目にX座標、2列目にY座標を入れる
CenterTop(Double)・・・原点にしたい位置のTop座標(シート上の上下位置)
CenterLeft(Double)・・・原点にしたい位置のLeft座標(シート上の左右位置)
戻り値は、変換後の座標が入った二次元配列です。1列目がLeft(左右位置)、2列目がTop(上下位置)に入れ替わっている点に注意してください。この並びは、そのまま DrawPolyLineAddPolyLine に渡せる形になっています。
呼び出し例は次のとおりです。シート上のXY座標表から座標を読み取り、名前定義した「基準セル」の左上位置を原点として作図します。
実際に使用すると、下記の様にシート上のXY座標表の値に基づいて、ポリラインが作図されます。

サンプルでは (0,0) (100,0) (100,100) (0,100) という4点を入力しているので、基準セルの左上を原点とした一辺100ポイントの四角形(コの字型に3辺)が描かれます。
仕組み(なぜ座標の変換が必要か)
この部品が必要になるのは、私たちが普段使うXY座標と、Excelがシート上の図形に使う座標とで、軸の向きが違うためです。
数学のグラフのXY座標・・・原点から見て、右がX軸のプラス方向、上がY軸のプラス方向
ワークシート上の図形の座標・・・シートの左上が原点で、右がLeftのプラス方向、下がTopのプラス方向
つまり左右方向は同じですが、上下方向だけが逆向きになっています。計算で求めたY座標をそのままTopとして渡すと、Yが大きい点ほど下に描かれてしまい、上下が反転した図形になります。
ConvXYListForSheetCenter は、この違いを次の2行で吸収しています。
TmpLeft = CenterLeft + TmpX ・・・X座標はそのまま、基準位置から右方向に足す
TmpTop = CenterTop - TmpY ・・・Y座標は符号を反転させ、基準位置から上方向に引く
Y座標を引き算にすることで「Yが大きいほど上に描かれる」状態になり、数学のグラフと同じ感覚で座標を扱えるようになります。同時に CenterTop / CenterLeft を足しているので、指定した基準セルの位置が座標の原点 (0, 0) になります。
下の図は、この変換の様子を表したものです。基準セルの左上位置が原点となり、そこからX方向(右)・Y方向(上)に座標が展開されているのが分かります。

作図の流れをまとめると、次の3ステップになります。
数式やセルからXY座標の二次元配列を用意する(このときは数学のグラフと同じ考え方でよい)
ConvXYListForSheetCenter で、シートに作図するための座標へ変換する
DrawPolyLineAddPolyLine で、変換後の座標をポリラインとして作図する
座標を「計算する処理」と「シートに描く処理」を分けておけるので、曲線の計算式を差し替えるだけで別の図形を描く、といった応用がしやすくなります。
依存プロシージャ
ConvXYListForSheetCenter 自体は自作の依存プロシージャを持たない、自己完結した部品です。上のコードブロックには、実際に作図するところまで試せるよう次の部品も含めています。
DrawPolyLineAddPolyLine:変換後の座標をポリラインとして作図する部品です。詳しくは DrawPolyLineAddPolyLine を参照してください。
Conv__ArrayXYSingle:AddPolyline に渡す配列をSingle型に変換する部品です(DrawPolyLineAddPolyLine の内部で使用)。
DeleteShapeNameLike:指定した名前で始まる図形をまとめて消す部品です。詳しくは DeleteShapeNameLike を参照してください。再作図のときに古い図形を消すのに使っています。
応用・注意点
戻り値の配列は、1列目がLeft、2列目がTopです。入力の XYList(1列目X、2列目Y)とは意味が変わっているので、変換後の配列を自分で加工するときは注意してください。
座標の単位はポイント(Excelの図形が使う単位)です。セルの幅や高さもポイントで取得できるので、「セル何個分」のような指定をしたい場合は、Range.Width / Range.Height を掛けて座標を作ってから渡してください。
図形を大きく/小さくしたい場合は、変換前のXY座標に倍率を掛けてから ConvXYListForSheetCenter に渡します。変換後の座標に倍率を掛けると、原点の位置まで一緒に動いてしまうので注意してください。
Worksheet.Shapes.AddPolyline に渡す座標配列は、Single型でなければエラーになります。DrawPolyLineAddPolyLine は内部の Conv__ArrayXYSingle でこの変換を行っているため、呼び出す側でSingle型を意識する必要はありません。AddPolyline を直接使う場合は、この型変換を忘れないようにしてください。
入力する配列のインデックスは、LBound / UBound で判定しているため1始まりでなくても動作しますが、DrawPolyLineAddPolyLine 側は1始まりの配列を前提としています。セルから Range.Value で取得した配列はそのまま使えます。
サンプルブック(ダウンロードして試せます)
コードの詳しい動きは上のコードブロックと解説のとおりですが、まず動かして試したい場合は、下記のサンプルブックをダウンロードして、XY座標表の値を書き換えながらボタンを押すだけで動作を確認できます。
まとめ
ConvXYListForSheetCenter は、数学のグラフで使うXY座標を、ワークシート上に図形を描くための座標へ変換する部品です。上下方向の軸が逆という違いを吸収し、指定したセルの位置を原点にできるので、計算で求めた座標をそのまま思ったとおりの位置・向きで作図できます。座標を計算する処理と作図する処理を分けられるため、曲線の計算式を差し替えるだけで別の図形を描く、といった応用にも使いやすい部品です。

