• 締切済み

VBA API WM_KEYDOWN

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

みんなの回答

  • masnoske
  • ベストアンサー率35% (67/190)
回答No.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

tanakanono
質問者

お礼

なかなか回答がつかない中、回答ありがとうございます。 しかし、ユーザーが図形を新規作成した際にイベントが発生しないので、図形作成後にセル選択などをしないと新規図形を検知できないです。。。 ループ処理でCPUが変わるか見てみましたが、sleep 50くらいにするとほとんど使用しないようです。無駄なループは翻訳してイベント待ちになっているのかもしれません。VBAは謎が多い言語(コンパイラ?)ですので。。

関連するQ&A