
こんにちは。エクセルVBAの初心者です。
エクセルでシート上のマウスポインタの座標を取得する方法はありますか?色々やってみたのですがわからない感じです。もし分かれば教えてください。お願いします。
セルのアドレスではなくて、ポイント数で知りたい感じです。
マウスのモニタ座標とフォーム上での座標はなんだか色々調べたら取得することが出来た感じなのですが、シート上の座標をポイント数で取得することができない感じです。
なんかモニタ座標は型がLong型で、エクセルのシートのポイントはDouble型なので互いに採用しているポイントと単位が違うので全く別物だろうとは思いますが、一番うれしいのはエクセルシートのポイントが分かること、次が、ウィンドウのサイズや位置に左右されない、アクティブウィンドウのローカル座標(とか言えばいいのでしょうか?)が知れたらうれしいです。
すみません。分かる人、どうか教えてください。よろしくお願いします。
No.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年に渡って、私は挑戦したのですが、この程度しか結果は得られていません。もう少し、別の勉強が必要のようです。
色々ありがとうございますです!
なんか普通に考えてできそうなのに、微妙にどうも出来ないのは何か理由があるのかもしれないですね。
>Applicationの左端の上が、(0,0) だから、Windowとの差を取ればよいと思ったのです。
これ分かります。私もこれを考えました。方法は同じ感じなのですが、初期化として最初はSetCursorPosでマウスを0,0から1ポイントずつムリにガガーーーって動かして、さらにRangeFromPoint(なぜかこれはモニタ座標を指定する感じです)をその間ずっとチェック、してRangeFromPointにRange("a1")が帰ってきた瞬間のモニタ座標をチェックすると、これがシート上の(x,y)=(0,0)になって、これでモニタ座標から概ねのシート上の座標がとれる感じ、よっしゃなんかできそう!と思ったのですが、ウィンドウサイズや位置が変わったら駄目になってしまうし、さらにいうと、シートをスクロールしただけで駄目ですこれ。だからせめてアクティブウィンドウ上のローカル座標が分かれば良いなあって思った感じです!
VBAでゲームなんかを作っている場合、コードは実際には見ていないですが、なんかマウスの座標をちゃんと取得しているような節があるので、きっと方法はあると思うのですが、ちょっと勉強することにしますです。どうもありがとうございました。
No.1
- 回答日時:
こんばんは。
>マウスのモニタ座標とフォーム上での座標はなんだか色々調べたら取得することが出来た感じなのです
基本的には、モニタ座標も出来なかったと思いますね。あくまでも、アプリケーション内の位置だ、アプリケーションの左端上を0,0 だったと思います。どのような方法をおっしゃっているか分かりませんが、マウスのポインタのモニタ座標を取ろうとすると、アプリケーションが不安定になったような気がします。(代用としては、大きなオートシェイプを置けば、マウスのローカルの座標は取れます)
Excelの場合、ローカル座標(その使い方は正しいと思います)は、マウスからではなくて、セルから座標をとりますね。VBとは違いますので、コントロールから直接取得できません。(できるかもしれませんが、かなり危ない)
私は、ずいぶんトライしたけれども、満足する結果が得られませんでした。もしかしたら、どなたか、出来るかもしれません。(VBでは簡単なことでも、Excel VBAでは難しいし、危険を冒すほどのこともないので、私は、諦めました。)
それで、Rangeオブジェクトの、Top, Left, Width, Height から行います。
この回答への補足
こんばんは。ご回答ありがとうございます!大変参考になります。いくつかご回答いただいた内容に補足と質問をさせていただきますです。
>基本的には、モニタ座標も出来なかったと思いますね。
多分私の記述の仕方が悪かったです。エクセルとかなんとかアプリケーションに依存しない、純粋なモニタ上の座標の取得がAPI関数のGetCursorPosというのを利用してできたという感じです。失礼しました。
>大きなオートシェイプを置けば、マウスのローカルの座標は取れます
これはポイントで取得できますでしょうか?昨日ちょっと調べたときに、RangeFromPointという関数を見つけたのですが、これは指定したポイントを含むセルまたはオートシェイプを返すというものでした。オートシェイプ上の座標を取得できれば、何か道が開けるかもです。可能であればご提示ください。お願いします!
すみませんが、どうぞよろしくお願いいたします!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
グラフの交点の求め方(Excel)
-
18マスの左の方3×3のマス目を自...
-
マインクラフト(pc版)で座標...
-
シーケンサー(PLC?)で制...
-
ピクセルの座標を取得するには
-
C言語 配列で座標
-
OpenGL
-
3次元空間上の2つの座標から...
-
最小二乗平面
-
MATLABの射影変換についての質...
-
エクセルシート上のマウスポイ...
-
直線上にある点の座標の求め方
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
検索の画面がでなくなってしま...
-
コントロールの書式設定で、“コ...
-
Sendkeysのタイミング
-
ダイアログボックスのボタンコ...
-
コンボボックス内の文字サイズ変更
-
[VB.net] DataGridViewの列ヘッ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
グラフの交点の求め方(Excel)
-
マインクラフト(pc版)で座標...
-
始点、終点の二つの座標と半径...
-
3次元空間上の2つの座標から...
-
エクセルで回転する座標の出し方
-
C言語 配列で座標
-
エクセルである点からの距離で...
-
シーケンサー(PLC?)で制...
-
多角形の内部かどうか判定する方法
-
Excel VBA で自在に図形を変化...
-
最小二乗平面
-
回転する矩形同士の当たり判定...
-
VBで、開いているExcelシートの...
-
ワード上Shapeの位置情報を統一...
-
図形が重なりあっているかどうか
-
C言語で制作するピラミッドアー...
-
ガウシアンフィルタのCプログラム
-
Excel関数で指定範囲内に有るか...
-
3次元座標上の2直線の交点判...
-
ダイアログ内コントロールの位...
おすすめ情報