アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんにちは。エクセルVBAの初心者です。

エクセルでシート上のマウスポインタの座標を取得する方法はありますか?色々やってみたのですがわからない感じです。もし分かれば教えてください。お願いします。

セルのアドレスではなくて、ポイント数で知りたい感じです。

マウスのモニタ座標とフォーム上での座標はなんだか色々調べたら取得することが出来た感じなのですが、シート上の座標をポイント数で取得することができない感じです。

なんかモニタ座標は型がLong型で、エクセルのシートのポイントはDouble型なので互いに採用しているポイントと単位が違うので全く別物だろうとは思いますが、一番うれしいのはエクセルシートのポイントが分かること、次が、ウィンドウのサイズや位置に左右されない、アクティブウィンドウのローカル座標(とか言えばいいのでしょうか?)が知れたらうれしいです。

すみません。分かる人、どうか教えてください。よろしくお願いします。

A 回答 (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年に渡って、私は挑戦したのですが、この程度しか結果は得られていません。もう少し、別の勉強が必要のようです。
    • good
    • 0
この回答へのお礼

色々ありがとうございますです!

なんか普通に考えてできそうなのに、微妙にどうも出来ないのは何か理由があるのかもしれないですね。

>Applicationの左端の上が、(0,0) だから、Windowとの差を取ればよいと思ったのです。

これ分かります。私もこれを考えました。方法は同じ感じなのですが、初期化として最初はSetCursorPosでマウスを0,0から1ポイントずつムリにガガーーーって動かして、さらにRangeFromPoint(なぜかこれはモニタ座標を指定する感じです)をその間ずっとチェック、してRangeFromPointにRange("a1")が帰ってきた瞬間のモニタ座標をチェックすると、これがシート上の(x,y)=(0,0)になって、これでモニタ座標から概ねのシート上の座標がとれる感じ、よっしゃなんかできそう!と思ったのですが、ウィンドウサイズや位置が変わったら駄目になってしまうし、さらにいうと、シートをスクロールしただけで駄目ですこれ。だからせめてアクティブウィンドウ上のローカル座標が分かれば良いなあって思った感じです!

VBAでゲームなんかを作っている場合、コードは実際には見ていないですが、なんかマウスの座標をちゃんと取得しているような節があるので、きっと方法はあると思うのですが、ちょっと勉強することにしますです。どうもありがとうございました。

お礼日時:2007/03/26 22:20

こんばんは。



>マウスのモニタ座標とフォーム上での座標はなんだか色々調べたら取得することが出来た感じなのです

基本的には、モニタ座標も出来なかったと思いますね。あくまでも、アプリケーション内の位置だ、アプリケーションの左端上を0,0 だったと思います。どのような方法をおっしゃっているか分かりませんが、マウスのポインタのモニタ座標を取ろうとすると、アプリケーションが不安定になったような気がします。(代用としては、大きなオートシェイプを置けば、マウスのローカルの座標は取れます)

Excelの場合、ローカル座標(その使い方は正しいと思います)は、マウスからではなくて、セルから座標をとりますね。VBとは違いますので、コントロールから直接取得できません。(できるかもしれませんが、かなり危ない)

私は、ずいぶんトライしたけれども、満足する結果が得られませんでした。もしかしたら、どなたか、出来るかもしれません。(VBでは簡単なことでも、Excel VBAでは難しいし、危険を冒すほどのこともないので、私は、諦めました。)

それで、Rangeオブジェクトの、Top, Left, Width, Height から行います。

この回答への補足

こんばんは。ご回答ありがとうございます!大変参考になります。いくつかご回答いただいた内容に補足と質問をさせていただきますです。

>基本的には、モニタ座標も出来なかったと思いますね。

多分私の記述の仕方が悪かったです。エクセルとかなんとかアプリケーションに依存しない、純粋なモニタ上の座標の取得がAPI関数のGetCursorPosというのを利用してできたという感じです。失礼しました。

>大きなオートシェイプを置けば、マウスのローカルの座標は取れます

これはポイントで取得できますでしょうか?昨日ちょっと調べたときに、RangeFromPointという関数を見つけたのですが、これは指定したポイントを含むセルまたはオートシェイプを返すというものでした。オートシェイプ上の座標を取得できれば、何か道が開けるかもです。可能であればご提示ください。お願いします!

すみませんが、どうぞよろしくお願いいたします!

補足日時:2007/03/26 19:33
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています