Excel VBAを使って、画像上をクリックした座標を取得し、そのXY座標をシートへ記録したいという用途は、測定・画像解析・図面確認・位置マーキングなどで意外と需要があります。特に「画像を貼り付け→画像をクリック→座標取得→一覧化→画像上へ印を残す」という流れは、VBAでも工夫すれば実現可能です。この記事では、その仕組みや実装方法、実際によく使われる構成についてわかりやすく解説します。
VBAでも画像クリック座標取得は可能
結論から言うと、質問のようなツールはVBAでも実現可能です。
実際の流れとしては、以下のような構成になります。
- JPGファイルを選択
- シートへ画像貼り付け
- 画像クリックイベント取得
- 画像左上基準でXY計算
- AA列などへ座標記録
- クリック位置へマーカー描画
ポイントは「画像そのもの」ではなく、「貼り付けた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ベースの方が実装しやすく、拡張性も高くなります。


コメント