Excel VBAで画像クリック座標を取得する方法|JPG貼り付け・XY記録・プロット作成を実現する考え方

Excel

Excel VBAを使って、画像上をクリックした座標を取得し、そのXY座標をシートへ記録したいという用途は、測定・画像解析・図面確認・位置マーキングなどで意外と需要があります。特に「画像を貼り付け→画像をクリック→座標取得→一覧化→画像上へ印を残す」という流れは、VBAでも工夫すれば実現可能です。この記事では、その仕組みや実装方法、実際によく使われる構成についてわかりやすく解説します。

VBAでも画像クリック座標取得は可能

結論から言うと、質問のようなツールはVBAでも実現可能です。

実際の流れとしては、以下のような構成になります。

  1. JPGファイルを選択
  2. シートへ画像貼り付け
  3. 画像クリックイベント取得
  4. 画像左上基準でXY計算
  5. AA列などへ座標記録
  6. クリック位置へマーカー描画

ポイントは「画像そのもの」ではなく、「貼り付けたShape」を利用することです。

画像貼り付けは比較的簡単

画像選択と貼り付け自体は、VBAでは定番処理です。

よく使われるのは以下のような構成です。

処理 内容
FileDialog JPG選択
Shapes.AddPicture 画像貼り付け
Left / Top 貼り付け位置指定

例えばA1セル付近へ固定配置するケースが多いです。

難しいのは「クリック座標取得」部分

VBAで最も工夫が必要なのがここです。

通常のExcelでは、画像上クリック時の座標を直接取得する仕組みが弱いため、以下のような方法を使います。

MouseDownイベントを利用する

UserForm上なら比較的簡単です。

ImageコントロールのMouseDownイベントで、

  • X座標
  • Y座標

を取得できます。

ただし、シート上Shapeでは少し工夫が必要になります。

シート上の場合は疑似的に取得する

シートへ貼り付けた画像の場合、

  • マウス位置取得API
  • Shape.Left / Top
  • Application.Caller

などを組み合わせるケースがあります。

少し中級者向けですが十分可能です。

画像左上を原点にする考え方

質問内容では「画像左上が原点」とあります。

これは非常に扱いやすい方法です。

例えば、

  • 画像Left = 20
  • クリックX = 150

なら、

150 – 20 = 130

として画像内部座標へ変換できます。

Y方向も同様です。

クリックした点を画像へ残す方法

これもVBAで実装可能です。

一般的には、小さい円Shapeを追加します。

方法 内容
Shapes.AddShape 小円を追加
Fill.ForeColor 赤色などへ変更
位置指定 クリック座標へ配置

これで「ポチッとした点」を視覚的に残せます。

座標一覧をAA列へ出力する方法

これは比較的簡単です。

例えば、

  • AA列 → X座標
  • AB列 → Y座標

のように書き込めます。

最終行取得には以下のような考え方を使います。

Cells(Rows.Count, “AA”).End(xlUp).Row + 1

これで次の空行へ追記できます。

UserFormを使うとかなり作りやすい

実は、この手のツールはUserFormベースの方がかなり楽です。

理由は、

  • マウスイベント取得しやすい
  • 座標制御が簡単
  • 画像管理しやすい
  • 拡大縮小対応しやすい

からです。

本格的に作るなら、UserForm + Imageコントロール構成が定番です。

画像拡大縮小時は座標補正が必要

実務で意外とハマるのがこれです。

画像サイズを変更している場合、クリック座標と元画像座標がズレます。

例えば、

  • 元画像1000px
  • 表示500px

なら2倍補正が必要です。

後から画像解析へ使う場合、この補正は重要になります。

実際によくある用途

この種のVBAツールは、以下用途で使われます。

  • 測定ポイント記録
  • 図面確認
  • 検査位置管理
  • 部品マーキング
  • 画像アノテーション

Excelだけで完結できるため、社内ツールとして人気があります。

まとめ

Excel VBAでも、JPGを貼り付けてクリック座標を取得し、XY一覧化や画像上マーキングを行うツールは十分実現可能です。

特に、

  • 画像貼り付け
  • クリック座標取得
  • Shapeによるマーキング
  • AA列への座標記録

という構成は、VBAでも比較的定番です。

本格的に作るなら、シート上よりUserFormベースの方が実装しやすく、拡張性も高くなります。

コメント

タイトルとURLをコピーしました