GetXYDocumentFromCursor|マウスでクリックした座標(ドキュメント座標)を取得する | Excel VBA
- yuji fukami
- 6 日前
- 読了時間: 4分

<概要 マウスでクリック位置の座標取得>
GetXYDocumentFromCursorは、現在のマウスカーソル位置から、Excelシート上のドキュメント座標(Left / Top基準)を取得するための汎用プロシージャです。
スクリーン座標として取得したカーソル位置を、カーソルが乗っているセルの四隅のスクリーン座標とドキュメント座標の対応関係から補間計算し、セル内の正確な位置をドキュメント座標として算出します。
図形配置、マウス操作連動処理、独自UI制御など、セル単位では足りない精度の座標処理を行いたい場面で利用できます。
<ドキュメント座標の解説>
本プロシージャ GetXYDocumentFromCursor を理解するために、事前知識として 「ドキュメント座標」 について説明します。
Excelには、位置を表す座標系が大きく分けて 2種類 存在します。
1. スクリーン座標
スクリーン座標は、表示されているモニターの左上を原点 (0, 0) とする座標系です。
マウスカーソルの位置
Windows API(GetCursorPos など)で取得できる座標
これらはすべて スクリーン座標 で表されます。
図中では(Sx, Sy) がスクリーン座標に該当します。
2. ドキュメント座標
一方、ドキュメント座標は、Excelワークシート全体を基準とした座標系 です。
原点は シート全体の A1 セル左上
スクロールやウィンドウ位置の影響を受けない
図形・Shape・OLEObject の配置基準になる座標
図中では(Dx, Dy) がドキュメント座標に該当します。
スクリーン座標とドキュメント座標は「別物」
重要なポイントとして、
Windows API で取得できるのは スクリーン座標
Excelの図形配置で使われるのは ドキュメント座標
というように、両者は完全に別の座標系 です。
そのため、
マウスカーソルの位置を基準にExcelシート上で正確に図形を配置したい
といった処理を行う場合、スクリーン座標 → ドキュメント座標への変換 が必須になります。

座標の向きについての補足
なお、座標の向きについて補足しておきます。
一般的な数学の座標系では、左右方向が X 軸方向、上下方向が Y 軸方向、というイメージが一般的です。
一方で本記事では、以降の説明や補間計算を分かりやすくするために、「下方向を X の正方向」「右方向を Y の正方向」という向きで座標を捉えて説明します。
このように座標の向きを整理することで、一般的な数学の座標系と比べると、XY 平面を −90 度回転させたような見え方になります。
ただし本記事では、補間計算や座標変換の式をできるだけ単純に保つため、X・Y ともに正方向の値として扱える向きで説明しています。
これにより、符号の反転や条件分岐を増やすことなく、座標計算の流れを直感的に追えるようになります。
<実行例>
実行例のサンプルコードは次の通りです
本サンプルコードは、ワークシート上でセルを選択したタイミング をトリガーとして処理が実行されます。ワークシートのコードウィンドウに実行サンプルのコードをそのまま貼り付けてみてください。
ちなみに、ワークシートのコードウィンドウは、下記の図のような手順で簡単に表示ができるので試してみてください。

コードは、対象となるワークシートのWorksheet_SelectionChange イベントプロシージャ に記述します。そのため、どのセルを選択してもイベントが発動します。
実際の動作としては、シート上の任意のセルをクリックすると、クリックしたマウスカーソル位置を中心として円が作図されます。
この円の作図位置は、セルの中央ではなく、実際にクリックしたカーソル位置 を基準にしている点が特徴です。
そのため、同じセルをクリックした場合でも、クリックする位置によって円の表示位置が微妙に変わることが確認できます。
下記動画は、シート上のさまざまな位置をクリックした結果、それぞれのカーソル位置を中心に円が作図されている例です。
このように、GetXYDocumentFromCursor を使用することで、セル単位ではなく、より細かな座標単位での作図やUI制御 が可能になります。
<関連記事>
今回紹介しているような汎用プロシージャを部品として一元管理する方法は別記事で紹介していますので、是非このノウハウも参考にしてみてください。
コーディングを効率化する上でどんどん増やしていった汎用プロシージャ(部品)をいくら増やしても簡単に流用ができるような仕組みの構築が可能になります。



