Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


8776 / 13644 ツリー ←次へ | 前へ→

【31212】キーボードの操作 boku 05/11/14(月) 18:18 質問[未読]
【31213】Re:キーボードの操作 Kein 05/11/14(月) 19:41 発言[未読]
【31224】Re:キーボードの操作 boku 05/11/15(火) 10:38 お礼[未読]
【31230】Re:キーボードの操作 Kein 05/11/15(火) 12:59 回答[未読]
【31237】Re:キーボードの操作 boku 05/11/15(火) 13:50 質問[未読]
【31239】Re:キーボードの操作 Kein 05/11/15(火) 14:02 回答[未読]
【31241】Re:キーボードの操作 boku 05/11/15(火) 14:47 お礼[未読]
【31256】Re:キーボードの操作 boku 05/11/15(火) 17:15 質問[未読]
【31257】Re:キーボードの操作 Kein 05/11/15(火) 17:33 発言[未読]
【31260】Re:キーボードの操作 boku 05/11/15(火) 18:08 お礼[未読]

【31212】キーボードの操作
質問  boku  - 05/11/14(月) 18:18 -

引用なし
パスワード
   いつも参考にさせていただいてます。
使用環境は Win98SE Excel2000 です。

Declare Function GetAsyncKeyState Lib "User32.dll" (ByVal vKey As Long) As Long

を使用すればキーボード操作を確認出来るんですよね?

シートモジュルールに下記を記述しました。

Private Sub Worksheet_Change(ByVal Target As Range)

Range("C6").Select

'[Enter]キーを押されたか判断する
If GetAsyncKeyState(13) <> 0 Then
 
    MsgBox "確認しました!"

Else

  MsgBox "もう一回試してください。"

End If 

End Sub

「C6」セルに適当に値を入力し、[Enter]キーを押したら

"もう一回試してください。"

が表示されました。
3回ほど、値を入力、[Enter]キーを押す動作を繰り返し
していたら、

"確認しました!"

が表示されました。

"確認しました!"
が表示された後は安定期に動作してくれていますが
bookを閉じて、次の日改めて起動するとまた不具合が
生じます。

上記のような症状がなく、普通に動く時もあるんですが、
一定のパターンもなく、安定的に動いてくれません。

同じような症状が出た方おられませんか?
解決策をご存知の方おられましたら助けていただけたらと
思います。

よろしくお願いします。

【31213】Re:キーボードの操作
発言  Kein  - 05/11/14(月) 19:41 -

引用なし
パスワード
   Win32APIを使わなくても、Excelの OnKeyプロパティを 使って同様のことが
出来ると思いますが、試してみましたか ?

【31224】Re:キーボードの操作
お礼  boku  - 05/11/15(火) 10:38 -

引用なし
パスワード
   ▼Kein さん:

返信ありがとうございました。
早速試してみました。

シートモジュール
Private Sub Worksheet_Change(ByVal Target As Range)

XXX

End Sub

標準モジュール
Sub AAA()

MsgBox "押しました"

End Sub

Sub XXX()

Application.OnKey "{DELETE}", "AAA"

End Sub

動いたんですけど、BOOK立ち上げて初めの1回目に{DELETE}キー
押したら無反応で、2回目以降はちゃんと動いてくれました。
試しに違うPCでもしてみたんですけど一緒でした。
どこがダメなんでしょう…。
このHP内で検索したら、OnKey使っておられる方もいらっしゃる
みたいですね。他の方はうまく動いておられるんでしょうね、きっと…。

【31230】Re:キーボードの操作
回答  Kein  - 05/11/15(火) 12:59 -

引用なし
パスワード
   Private Sub Worksheet_Change(ByVal Target As Range)

XXX

End Sub
というイベントが適切ではないからです。
あるシートを特定してOnKeyプロパティの設定をするなら

Private Sub Worksheet_Activate()
  Application.OnKey "{DELETE}", "AAA"
End Sub

Private Sub Worksheet_Deactivate()
  Application.OnKey "{DELETE}"
End Sub

とします。また、ヘンなところでキーイベントが走らないように

Sub AAA()
  If TypeName(Selection) <> "Range" Then Exit Sub
  MsgBox "押しました"
End Sub

などと制限をつけたりする工夫も、必要でしょう。

【31237】Re:キーボードの操作
質問  boku  - 05/11/15(火) 13:50 -

引用なし
パスワード
   ▼Kein さん:

返信ありがとうございました。
動くようになりました。

もう一つ質問なのですが、Sheet1のA列で{DELETE}キーを
押された場合のみ実行させたいと考えてます。
ちなみに下記を作ってみたのですが、どこで押しても

"押しました"

になってしまいます。
どう直せば実現できますでしょうか?

シートモジュール
Private Sub Worksheet_Activate()

If Not Application.Intersect(Target, Range("a2:a65536")) Is Nothing Then
  
  Application.OnKey "{DELETE}", "AAA"

End If

End Sub

標準モジュール
Sub AAA()
MsgBox "押しました" 
End Sub

【31239】Re:キーボードの操作
回答  Kein  - 05/11/15(火) 14:02 -

引用なし
パスワード
   それは、OnKeyプロパティ の設定時に行うのではなく、OnKey で「呼び出す」方の
プロシージャで判定・処理をするようにします。
即ちシートのアクティブイベントは、あくまで

Private Sub Worksheet_Activate()
  Application.OnKey "{DELETE}", "AAA"
End If

のままにして、呼び出すプロシージャ AAA のコードを

Sub AAA()
  If TypeName(Selection) <> "Range" Then Exit Sub
  If Selection.Column > 1 Then Exit Sub
  MsgBox "押しました" 
End Sub

などと条件分岐すれば良いのです。
他にも処理の条件や内容を変えたいときは、AAA の中身だけを変更するように
して下さい。それがこの仕組みの基本的な組み方です。

【31241】Re:キーボードの操作
お礼  boku  - 05/11/15(火) 14:47 -

引用なし
パスワード
   ▼Kein さん:

プロシージャ内で制御していけばよいのですね。

教えていただいたコードも私の思っていた通りの
動きをしてくれました。

大変助かりました。
ありがとうございました。

【31256】Re:キーボードの操作
質問  boku  - 05/11/15(火) 17:15 -

引用なし
パスワード
   すいません。
もう一度質問させてください。

教えていただいたプロシージャを改良して
A列以外で"{DELETE}"キーを押されたら

Application.OnKey "{DELETE}"

にして"{DELETE}"キー本来の動きをしてほしくて
考えたのですが…。

動作確認の為、下記のようなプロシージャにして
sub AAA()
If Selection.Column > 1 Then
  MsgBox "範囲外"
Else
  MsgBox "範囲内"
End If
end sub

ちゃんと動いたのを確認し、
sub AAA()
If Selection.Column > 1 Then
  Application.OnKey "{DELETE}"
Else
  MsgBox "範囲内"
End If
end sub
としました。

一度範囲外で{DELETE}キーを押して
A列で{DELETE}キーを押したら無反応、というより

Application.OnKey "{DELETE}", "AAA"

がちゃんと実行されていないようです。

Application.OnKey "{DELETE}", "AAA" は
WorksheetがActivateになった時に実行されるので

sub AAA()
If Selection.Column > 1 Then
    Application.OnKey "{DELETE}"
  Else
    MsgBox "範囲内"
    Sheet1.Activate  
  End If
end sub

としてみたのですが、どうもダメです。
どうすれば範囲以外で{DELETE}キーを押せば
{DELETE}キー本来の動き、
範囲内で{DELETE}キーを押せば任意の処理と
うまく切り替えることが出来ますでしょうか?

【31257】Re:キーボードの操作
発言  Kein  - 05/11/15(火) 17:33 -

引用なし
パスワード
   0nKeyプロパティ自体を制御したければ、設定するイベントマクロを変更した
方がいいでしょう。例えば

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If Target.Column = 1 Then
   Application.OnKey "{DELETE}", "AAA"
  Else
   Application.OnKey "{DELETE}"
  End If
End Sub

などとします。これをシートモジュールに入れる代わりに

Private Sub Worksheet_Activate()

のマクロは削除して下さい。別にバッティングするからではないですが、
シートをアクティブにすることと、OnKeyプロパティの設定とが関係無くなる
からです。なお、Private Sub Worksheet_Deactivate() で設定を解除する
コードは、残しておいた方が良いでしょう。仮に A列を選択したまま他のシートに
移ると、OnKeyが解除されていない状態のままなので、そのシート上でもイベント
が発生するからです。
あと、当然ですが呼び出される側の AAA は、元のコードに戻しておいて下さい。
今回の件は

1 OnKey の設定に関しては適切なイベントマクロを使う。
2 処理の内容については全て、呼び出した普通のプロシージャのコードで行う。

という方針で組み立てることを、お勧めしています。良くご理解下さい。

【31260】Re:キーボードの操作
お礼  boku  - 05/11/15(火) 18:08 -

引用なし
パスワード
   ▼Kein さん:

返信ありがとうございました。
教えていただいた通り作成して、うまく動いてくれました。
ありがとうございます。

これでWin32APIで作成した物を改造していきます。

Win32APIはなんだったんでしょう…。

検索をしてOnKeyを先に見つけていたらこちらで作成してた
と思います。

でも両方勉強出来ました。(苦笑)

8776 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free