エクセルVBAでプログラムをしています。
Application.Onkeyでショートカットを指定したいのですがフォーム上ではうまく指定できません。
フォーム上での指定は不可能なんでしょうか?
ショートカットを認識するケース
標準モジュールに
Sub test2()
MsgBox "test2"
End Sub
Sub Auto_Open()
Application.OnKey "{b}", "test2"
End Sub
としてシート上で「b」を押した場合はうまくいきます。
ショートカットを認識しないケース
標準モジュールに
Sub test()
MsgBox "test"
End Sub
UserForm1フォームに
Private Sub UserForm_Initialize()
Application.OnKey "{a}", "test"
End Sub
としてフォームをロード(表示)して「a」を押しても何もおきません。
またフォームが表示されている状態で「b」を押しても何もおきません。
上記のコードはテストで作ったものなのでこれ以外はフォームを開く文以外何も書いておりませんので他との兼ね合いではないと思います。
どうすれば思ったとおりの動作になるのでしょうか?
そもそもOnkeyはユーザフォームがアクティブのときは動かないのでしょうか?
動かない場合、フォームがアクティブなときのみフォームごとに違う関数を呼ぶショートカットを作る方法はありませんでしょうか?
(コントロールごとにkey_downイベントで確認する方法はコントロールの数が各100個ほどあるのと、フォームが10個以上あるため出来ればやりたくありません。)
環境はwinXP、excel2003です。
よろしくお願いいたします。
No.7ベストアンサー
- 回答日時:
こんにちは。
> keypressまたはkeydownイベントを使用するしか方法はないのでしょうか。
基本的にはそのとおりです。
> 1000回書くのはナンセンスだと思い何か言い方法が無いか探している状況です。
VB とか Access のように Userform に KeyPreview プロパティーがあれば
話は簡単なのですが、残念ながら Excel にはありません。
# 何故 Access にあって、Excel には KeyPreview がないん
# でしょうね。。^^;
解決法としては、クラスモジュールを使うことになります。下記参考 URL
に記事があります。一度クラスを書いてしまえば、コントロール数が増え
ても減ってもコードの修正は非常に容易です。
Visual Basic 中学校
http://homepage1.nifty.com/rucio/main/main.htm
第30回 同じコードを2度書くな
http://homepage1.nifty.com/rucio/main/shokyu/jug …
その他の方法としては、
・SetWindowsHookEx api でキーボードフックする
・RegisterHotKey api でホットキーを設定する
などでも実現可能ですが、難易度は高めです。
No.6
- 回答日時:
本格的にするなら、クラス化して、イベントまで作らなければなりませんが、今回のコードはそこまで詰めていません。
当該ユーザーフォームのモジュールに
'===========================================================
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Declare Function GetAsyncKeyState Lib _
"User32.dll" (ByVal vKey As Long) As Long
Private e_l As Boolean
'===========================================================
Private Sub UserForm_Activate()
e_l = False
Do Until e_l = True
Sleep 100
DoEvents
If key_code(66) Then '{b}が押された?
' 実際には、ここに{b}が押されたときの処理を記述する
' または、ここで別のプロシジャーを呼び出す
Range("a1").Value = Range("a1").Value & "b"
' ここではセルA1にbを繋げている
End If
Loop
End Sub
'===========================================================
Function key_code(key As Long) As Boolean
' keyの値は、コントロールのKeyDownイベントのKeycodeと同値
Dim inkey As Long
key_code = False
inkey = GetAsyncKeyState(key)
If inkey <> 0 Then
key_code = True
End If
End Function
'===========================================================
Private Sub UserForm_Terminate()
e_l = True
End Sub
No.5
- 回答日時:
ああ、すみません。
#4ですが、読み落としというか、錯誤があって頓珍漢な回答(?)でした。
#3さんのご回答に私が上書きするような話はありません。
いくつか考えついたのはありますが、どれもダミーのコントロールにフォーカスを置く方法ばかりでした。
大変失礼しました。
No.4
- 回答日時:
こんにちは
詳細はよくわかりませんが、
ご要望はこういうことではないでしょうか?
Private Sub UserForm_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If KeyAscii = 98 Then Application.Run "test2"
End Sub
私自身、滅多に使わないイベントですから、詳しい訳ではありませんが、
このイベントがある以上は、
―OnKey が優先される―ことはないだろうな、とは思います。
※フォームはModal表示、コントロールにフォーカスを置かない状態で確認済。
ご回答ありがとうございます。
keypressまたはkeydownイベントを使用するしか方法はないのでしょうか。
質問にも書きましたが本番環境には、ボタンやテキストボックスなどコントロールがざっと1000以上(システム全体で)あります。
1000回書くのはナンセンスだと思い何か言い方法が無いか探している状況です。
No.3
- 回答日時:
Formヘルプの[Microsoft Forms オブジェクト モデルの全体像]
を見てもらったらわかるかもしれませんが、
ExcelとMicrosoft Formsは、言わば別Applicationなので、
FormがActiveになっている時はExcel.ApplicationのOnkeyメソッドは機能しません。
[Alt]キーとの組み合わせで良ければ、[Accelerator プロパティ]を調べてみてはいかがでしょう。
ダミーでもいいので、CommandButton を追加し、そのボタンに[Accelerator プロパティ]を設定します。
Me.CommandButton1.Accelerator = "A"
などとコードでも設定できますが、[プロパティウィンドウ]でも可。
[Alt]キー+[設定したキー]で、その CommandButton_Click イベントが実行できます。
その CommandButton はUserFormの非表示エリアに置いて、TabStopをFalseにしておけば
あまり気にならないでしょう。
その場合はクリックイベントの最後に他のコントロールにSetFocusするようにしておいたほうがいいです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) 検索のユーザーフォームの表示について 1 2023/03/27 23:31
- Access(アクセス) Accessでセレクタをダブルクリックで別フォームで詳細表示 3 2022/12/20 10:36
- JavaScript ラジオボタンによるフォームの開閉を行いたい 3 2022/03/31 21:30
- Visual Basic(VBA) エクセルで、1つのセルで上書き足し算して セルの範囲を指定できますか? パソコン初心者です。 お時間 3 2023/07/05 06:13
- その他(データベース) Accessフォームからパラメーターで表示したレコードを指定のExcelのセルへ転送する方法について 2 2022/08/22 18:04
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
このQ&Aを見た人はこんなQ&Aも見ています
-
これまでで一番「情けなかったとき」はいつですか?
これまでの人生で一番「情けない」と感じていたときはいつですか? そこからどう変化していきましたか?
-
スマホに会話を聞かれているな!?と思ったことありますか?
スマートフォンで検索はしてないのに、友達と話していた製品の広告が直後に出てきたりすることってありませんか? こんな感じでスマホに会話を聞かれているかも!?と思ったエピソードってありますか?
-
【お題】マッチョ習字
【大喜利】 「精神を鍛えるため」にと、ジムから書初めの宿題を出されたマッチョたちが半紙に書いてきたこと
-
集合写真、どこに映る?
あなたが集合写真を撮られるとき、画角のどのあたりにいることが多いですか? 私は振り返ってみると右の端にいることが多い気がします。
-
店員も客も斜め上を行くデパートの福袋
シュールを通り越して店員も客も斜め上を行くデパートの福袋に入ってそうなものを教えて下さい。 よかったらレビューもしてください。
-
Application.OnKey でマクロのショートカットキー割り当てについて
Excel(エクセル)
-
Enterキーでマクロを起動さす。
その他(ソフトウェア)
-
エクセルのVBA 特定のセルでエンターキーでマクロ実行
Excel(エクセル)
-
-
4
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
5
VBA エンターキーでイベントに入りたい。
PowerPoint(パワーポイント)
-
6
テキストボックス(VBA)でEnterを押したときに作動するマクロ
Access(アクセス)
-
7
VBA ユーザーフォームの Keypreview について
Visual Basic(VBA)
-
8
【VBA】Worksheet_changeイベントで特定のキーが押されたときだけ無効にしたい
Visual Basic(VBA)
-
9
VBA(エクセル)で自動的にボタンをクリックさせるには
その他(プログラミング・Web制作)
-
10
ユーザーフォームを表示中にシートの操作をさせるには
Excel(エクセル)
-
11
ExcelVBAでテキストボックスの表示形式を小数点第二位まで表示する方法
Visual Basic(VBA)
-
12
ユーザーフォームのSetFocusが働かない?
その他(プログラミング・Web制作)
-
13
Excel VBA あるセルでENTERを押すと特定のセルへ移動したい
Excel(エクセル)
-
14
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
15
特定のキーを押すまでループさせるにはどうすればよいですか。
Visual Basic(VBA)
-
16
VBAでユーザーフォームの表示を確認
Visual Basic(VBA)
-
17
コマンドボタンのEnterイベント後に、フォーカスを移動したい。
その他(Microsoft Office)
-
18
VBAでブックを非表示で開いて処理して閉じる方法
Excel(エクセル)
-
19
Excel VBAでのWorksheet_Changeが動作しない原因
Excel(エクセル)
-
20
array関数で格納した配列の型を変更する
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・【選手権お題その3】この画像で一言【大喜利】
- ・【お題】逆襲の桃太郎
- ・自分独自の健康法はある?
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・ちょっと先の未来クイズ第6問
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ユーザーフォームを表示中にシ...
-
フォームウィンドウを最前面に...
-
Microsoft Formsの「個人情報や...
-
ExcelVBAのユーザーフォームの...
-
Hideについて(.NET)
-
テキストボックスやラベルのクリア
-
ブックをCloseまたはQuitで閉じ...
-
Access VBA コントロールの参照...
-
ユーザーフォームのテキストボ...
-
エクセルVBA フォーム上でOnkey...
-
モーダルフォームとモードレス...
-
エクセルVBAのフォームを最...
-
VBA(エクセル)のユーザー...
-
EXCELのユーザーフォーム開くと...
-
エクセルのVBAでユーザーフォー...
-
任意のフォームが表示されてい...
-
Accessで、一つのフォーム画面...
-
Excelvbaでフォーム間での変数...
-
Excel VBA ユーザーフォーム 複...
-
VB.NETでフォームロード中のエ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ユーザーフォームを表示中にシ...
-
ExcelVBAのユーザーフォームの...
-
VBAでユーザーフォームを再表示...
-
ユーザーフォームのテキストボ...
-
クリックイベントなのに、2回ク...
-
Hideについて(.NET)
-
ACCESSのフォーム、開くんです...
-
コントロールの存在確認
-
Microsoft Formsの「個人情報や...
-
モーダルフォームとモードレス...
-
VBA(エクセル)のユーザー...
-
Form_Load と Form_Activate の...
-
フォームウィンドウを最前面に...
-
エクセルVBAのフォームを最...
-
アクセス2013 フォームが...
-
EXCEL VBA ユーザーフォームの...
-
テキストボックスやラベルのクリア
-
ユーザーフォームのコピー?
-
モードレスでユーザーフォーム...
-
C#でボタンクリックをキャンセル
おすすめ情報