Excelでシート上に貼り付けたJPEG画像の上でクリックした座標を取得し、その座標を残したままUndoできるVBAを作成する方法について解説します。
Office 2021で動作することを前提に、ピクセル座標を取得してセルに返す手順や、Ctrl+Zで点をひとつ戻す仕組みも組み込めます。
VBAで画像上クリック座標を取得する仕組み
Excelの画像はShapesオブジェクトとして扱われます。マウスイベントを取得するにはWorksheetイベントやWindows APIを併用する必要があります。
クリックした座標は、画像のLeftとTopを原点として計算します。取得した座標はセルに書き込み、ShapeやActiveXコントロールで点を描画できます。
座標を残す・Undo可能にする方法
クリックで生成した点をShapeとして保存しておくと、後で削除可能です。
Undo機能は、点を配列やCollectionに格納しておき、Ctrl+Z押下時に最後の点を削除するイベントを作ることで再現できます。
具体的なVBAコード例
以下は基本例です(ActiveXコントロールやWindows APIで座標取得する前提):
Dim ClickPoints As CollectionPrivate Sub Worksheet_SelectionChange(ByVal Target As Range) ' 選択セルの変更ではなく画像クリック時の座標取得イベントを使用End SubSub AddClickPoint(x As Double, y As Double) Dim shp As Shape Set shp = ActiveSheet.Shapes.AddShape(msoShapeOval, x, y, 5, 5) shp.Fill.ForeColor.RGB = RGB(255, 0, 0) ClickPoints.Add shp ' 座標をシートに記録 Cells(ClickPoints.Count, 1).Value = x Cells(ClickPoints.Count, 2).Value = yEnd SubSub UndoClickPoint() If ClickPoints.Count > 0 Then ClickPoints(ClickPoints.Count).Delete ClickPoints.Remove ClickPoints.Count ' 座標も削除 Cells(ClickPoints.Count + 1, 1).ClearContents Cells(ClickPoints.Count + 1, 2).ClearContents End IfEnd Sub
上記コードではCollectionで点を管理し、AddClickPointでShapeを追加、UndoClickPointで最後の点を削除します。
ポイントと注意点
- Worksheetイベントでは画像クリックを直接取得できないため、Windows APIやImageコントロールのClickイベントを利用する
- ピクセル座標は画像のLeft/Topを原点に変換
- Collectionで管理することでCtrl+Z風のUndoが可能
- 描画する点のサイズや色は自由に調整可能
まとめ
Excel上でJPEG画像のクリック座標を記録し、点を残したままUndoできるVBAを作るには、座標取得とShape管理を組み合わせる必要があります。
Collectionや配列でShapeを管理することで、Ctrl+Z風の操作を再現でき、座標もセルに出力可能です。
Office 2021でも動作する方法として、ActiveXコントロールやWindows APIの活用を検討すると良いでしょう。


コメント