- ベストアンサー
エクセルシート上のマウスポインタ座標の取得方法と注意点
- エクセルシート上でマウスポインタの座標をポイント数で取得する方法について説明します。
- モニタ座標とシート上の座標は異なるため、注意が必要です。
- シート上のマウスポインタ座標を取得するためのVBAコード例も紹介します。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 >GetCursorPos それで、思い出したのですが、マウスの座標は、Applicationの左端の上が、(0,0) だから、Windowとの差を取ればよいと思ったのです。もちろん、シートは、全画面にしておきます。しかし、気が付いたのは、Applicationの左端上からシートの端の距離までが、ツールバーなどが、入ったりするので、一定ではありません。それでダメだとしました。シートの左端上を(0,0)とする方法がどうしても見つかりませんでした。 図形描画の座標位置が存在するのですから、ローカルのシートのスクリーン座標はあってよいはずだと思うのですが、いろいろやってみたのですが、出来ませんでした。VBのFormなどとは構造的には違うものなのでしょうね。APIからは届かないのです。VBだと、Formの全体と個々のローカルの位置が取れますね。 #(代用としては、大きなオートシェイプを置けば、マウスのローカルの座標は取れます) これは、コントロールツールのラベルでした。すみません。 Private Sub Label1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal y As Single) MsgBox "Y: " & y & " X: " & x End Sub ここに、X, Y がありますね。イベントは、他でよいです。大きなラベルを置いてローカル座標を使うわけですが、ただ、私にとって、お遊び程度しかないような気がしました。 ずいぶん、2年に渡って、私は挑戦したのですが、この程度しか結果は得られていません。もう少し、別の勉強が必要のようです。
その他の回答 (1)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 >マウスのモニタ座標とフォーム上での座標はなんだか色々調べたら取得することが出来た感じなのです 基本的には、モニタ座標も出来なかったと思いますね。あくまでも、アプリケーション内の位置だ、アプリケーションの左端上を0,0 だったと思います。どのような方法をおっしゃっているか分かりませんが、マウスのポインタのモニタ座標を取ろうとすると、アプリケーションが不安定になったような気がします。(代用としては、大きなオートシェイプを置けば、マウスのローカルの座標は取れます) Excelの場合、ローカル座標(その使い方は正しいと思います)は、マウスからではなくて、セルから座標をとりますね。VBとは違いますので、コントロールから直接取得できません。(できるかもしれませんが、かなり危ない) 私は、ずいぶんトライしたけれども、満足する結果が得られませんでした。もしかしたら、どなたか、出来るかもしれません。(VBでは簡単なことでも、Excel VBAでは難しいし、危険を冒すほどのこともないので、私は、諦めました。) それで、Rangeオブジェクトの、Top, Left, Width, Height から行います。
補足
こんばんは。ご回答ありがとうございます!大変参考になります。いくつかご回答いただいた内容に補足と質問をさせていただきますです。 >基本的には、モニタ座標も出来なかったと思いますね。 多分私の記述の仕方が悪かったです。エクセルとかなんとかアプリケーションに依存しない、純粋なモニタ上の座標の取得がAPI関数のGetCursorPosというのを利用してできたという感じです。失礼しました。 >大きなオートシェイプを置けば、マウスのローカルの座標は取れます これはポイントで取得できますでしょうか?昨日ちょっと調べたときに、RangeFromPointという関数を見つけたのですが、これは指定したポイントを含むセルまたはオートシェイプを返すというものでした。オートシェイプ上の座標を取得できれば、何か道が開けるかもです。可能であればご提示ください。お願いします! すみませんが、どうぞよろしくお願いいたします!
お礼
色々ありがとうございますです! なんか普通に考えてできそうなのに、微妙にどうも出来ないのは何か理由があるのかもしれないですね。 >Applicationの左端の上が、(0,0) だから、Windowとの差を取ればよいと思ったのです。 これ分かります。私もこれを考えました。方法は同じ感じなのですが、初期化として最初はSetCursorPosでマウスを0,0から1ポイントずつムリにガガーーーって動かして、さらにRangeFromPoint(なぜかこれはモニタ座標を指定する感じです)をその間ずっとチェック、してRangeFromPointにRange("a1")が帰ってきた瞬間のモニタ座標をチェックすると、これがシート上の(x,y)=(0,0)になって、これでモニタ座標から概ねのシート上の座標がとれる感じ、よっしゃなんかできそう!と思ったのですが、ウィンドウサイズや位置が変わったら駄目になってしまうし、さらにいうと、シートをスクロールしただけで駄目ですこれ。だからせめてアクティブウィンドウ上のローカル座標が分かれば良いなあって思った感じです! VBAでゲームなんかを作っている場合、コードは実際には見ていないですが、なんかマウスの座標をちゃんと取得しているような節があるので、きっと方法はあると思うのですが、ちょっと勉強することにしますです。どうもありがとうございました。