こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

VBA API WM_KEYDOWN

エクセル内のオブジェクトの移動を判定するため、マウスアップを検出しようと考えています。
GetAsyncKeyStateでできるのですが、エクセルが受け取るWM_KEYDOWNを受け取る方法はないのでしょうか?
そもそもWindowsがイベント待ちで動いているのに、GetAsyncKeyStateだとループ処理で監視することになるので、すっきりしません。私だけでしょうか?

ちなみに、新規に図形を作ったり、図形を移動したりしたときに処理したいですが、このイベントは準備されていないですよね?

投稿日時 - 2020-03-05 08:39:07

QNo.9719864

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.1

アイデアだけで、うまくできるかどうか分かりませんが。。。
シェイプにマクロを割り当てておくと、クリックできることを利用します。
はじめにシェイプがシート上に配置されてる状態で SetMacro を実行します。
これで全てのシェイプに ShapeClick マクロが割り当てられます。
以降は、シェイプをクリックすると選択状態になります。

あとはマウスの位置に合わせてシェイプを擬似的に移動させる(笑)

Public ClickObj As String

' オートシェイプにマクロを割り当てる
Sub SetMacro()
Dim shp As Shape
For Each shp In ActiveSheet.Shapes
shp.OnAction = "ShapeClick"
Next
Set shp = Nothing
End Sub

' オートシェイプがクリックされたら選択状態にする
Sub ShapeClick()
Dim shp As Shape
ClickObj = Application.Caller
Set shp = ActiveSheet.Shapes(ClickObj)
shp.Select
End Sub

同じような事を考える人がいるのか。。。
https://blog.goo.ne.jp/end-u/e/e05cc38782bd685f5661c53bc93b1620

投稿日時 - 2020-03-12 16:01:50

お礼

なかなか回答がつかない中、回答ありがとうございます。
しかし、ユーザーが図形を新規作成した際にイベントが発生しないので、図形作成後にセル選択などをしないと新規図形を検知できないです。。。

ループ処理でCPUが変わるか見てみましたが、sleep 50くらいにするとほとんど使用しないようです。無駄なループは翻訳してイベント待ちになっているのかもしれません。VBAは謎が多い言語(コンパイラ?)ですので。。

投稿日時 - 2020-03-14 20:40:20

あなたにオススメの質問