[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ユーザーフォームのエンターが押された時の動作』(たかまや)
あるユーザーフォームが起動しているとき、
エンターが押された時に特定のコマンドボタンが押されたという状態にしたいのですが、どのように記載すればよいでしょうか?
具体的には、ユーザーフォーム内にテキストボックスやコンボボックスなどが複数あり、コマンドボタンに実行の役割を持たせ、
テキストボックスやコンボボックスの値などを取得し、あらゆる処理が行われます。
ここでエンターを押すとコマンドボタンが押されたとみなされるようにしたいです。
< 使用 Excel:unknown、使用 OS:unknown >
(わけわからない) 2023/10/26(木) 11:31:34
DefaultプロパティをTrueに設定してください。
CommandButton.Default プロパティ (Access) | Microsoft Learn https://learn.microsoft.com/ja-jp/office/vba/api/access.commandbutton.default
(hatena) 2023/10/26(木) 11:37:48
「ここで」に具体性がないので何とも・・・
Enter押して、フォーカスが移ったとき?
(tkit) 2023/10/26(木) 11:44:39
テキストボックスやコンボボックス上だと仮定して、
コマンドボタンのClickイベントで実行しいる内容を「ソレ」と定義し、 KeyDownイベントで KeyCode.Value が vbKeyReturn だったら「ソレ」をCallする
...みたいに考えてみるのも手のひとつですかね。 何なら Clickイベントのプロシージャには引数が無い為、 他のプロシージャ内からそのままCallする事も出来ますし。
>だったらコマンドボタンいらないですよね。 いやいや、んな事ぁないですよ。 案外その辺は設計方針やユーザーからの要望対応で事情が変わってくるもんです。
(白茶) 2023/10/26(木) 11:48:20
DefaultプロパティとCancelプロパティについて簡単に解説しておきます。
Windowsの標準UIとして、既定のボタンとキャンセルボタンというものがあります。
ダイアログフォームなどの入力フォームにおいて、[OK]、[Cancel]のボタンがありますが、それが該当します。
そのフォームにフォーカスがあるときにEnterキーを押すと既定のボタンをクリックしたとみなされます。 Escキーを押すとキャンセルボタンがクリックされたとみなされます。
CommandButton.Cancel プロパティ (Access) | Microsoft Learn https://learn.microsoft.com/ja-jp/office/vba/api/access.commandbutton.cancel
質問者さんは、たぶんこの標準UIを実装したいのかな、と推測しました。 (hatena) 2023/10/26(木) 11:56:49
hatena様>
実行処理が記載されているコマンドボタンのDefaultをtrueにしてみたのですが、
同じユーザーフォームに配置されている別のコマンドボタンが動作してしまいました。
(たかまや) 2023/10/26(木) 12:59:08
だいたい↓こんな感じでしょうか...
Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) If KeyCode.Value = vbKeyReturn Then KeyCode.Value = 0 Call CommandButton1_Click ' または Call ソレ実行 End If End Sub
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) If KeyCode.Value = vbKeyReturn Then KeyCode.Value = 0 Call ソレ実行 ' または Call CommandButton1_Click End If End Sub
Private Sub CommandButton1_Click() Call ソレ実行 End Sub Private Sub ソレ実行() Debug.Print "ソレ" End Sub
(白茶) 2023/10/26(木) 13:16:07
まさかスルーされるとは・・・
TextBoxやComboBoxで入力後にEnterを押すと フォーカスが次のオブジェクト (他のTextBoxやComboBoxやCommandButton) に移動しますよね。 移動前に処理出来るよう、イベントが用意されています。
で、白茶さんのように、イベント内でCallすればいいだけで。
ただ、上記想定の話なので、具体的にどういった操作か 聞いたんですけど。
(tkit) 2023/10/26(木) 13:20:43
> 実行処理が記載されているコマンドボタンのDefaultをtrueにしてみたのですが、 > 同じユーザーフォームに配置されている別のコマンドボタンが動作してしまいました。
そんなはずはない。 そのコマンドボタンのDefaultがTrueになっているかもう一度確認してみてください。 あるいは、初期化時にDefaultをTrueにしてみてください。
Private Sub UserForm_Initialize() Me.CommandButton1.Default = True End Sub
(hatena) 2023/10/26(木) 14:26:12
確かめてみました ・フォーカスがTextBoxコントロールにあるとき、Enter押下 DefaultプロパティがTrueに設定されたCommandButtonがない場合 => 次のコントルールにフォーカス(TabIndexの番号順) DefaultプロパティがTrueに設定されたCommandButtonがある場合 => DefaultのCommandButtonのクリックイベントが発火
・TextBox以外のコントロールにフォーカスがあるとき、Enter押下 DefaultプロパティがTrueに設定されたCommandButtonがない場合 => なにも起こりません DefaultプロパティがTrueに設定されたCommandButtonがある場合 => DefaultのCommandButtonのクリックイベントが発火
・CommandButtonコントロールにフォーカスがあるとき、Enter押下 フォーカスのあるCommandButtonのクリックイベントが発火
DefalutプロパティをTrueに設定したCommandButtonがあっても、他のCommandButtonにフォーカスがあると Defalutのコマンドボタンは実行されません (´・ω・`) 2023/10/27(金) 10:13:52
> DefalutプロパティをTrueに設定したCommandButtonがあっても、他のCommandButtonにフォーカスがあると > Defalutのコマンドボタンは実行されません
なるほど。こちらでも確認できました。 Defalut以外のコマンドボタンにフォーカスがあったということですね。
UIとしてはまっとうな仕様だと思いますが、 Defalut以外のコマンドボタンにフォーカスがあるときでもEnterキーで Defalutを実行したいとなると、 白茶さんの回答のコードをDefalut以外のコマンドボタンに設定することになりますね。 (hatena) 2023/10/27(金) 11:00:19
OKボタンとキャンセルボタンの2つしかないダイアログのようなUserFormなら便利な機能なのですが。
DefaultのCommandButton以外のCommandButtonコントロールは TabStopプロパティとTakeFocusOnClikcプロパティをFalseにしておくと フォーカスが当たらないのでいいかもしれません(絶対大丈夫とはいえませんが) (´・ω・`) 2023/10/27(金) 11:14:45
訂正 絶対大丈夫とはいえませんが ← 全然大丈夫じゃない
カーソルキー ↑↓←→でもフォーカスを移動できるので全然駄目です (´・ω・`) 2023/10/27(金) 11:27:01
テキストボックス1 テキストボックス2 コンボボックス1 コンボボックス2 コマンドボタン1 コマンドボタン2
この様な感じで配置されているのでしょうか。
(IT) 2023/10/27(金) 11:49:05
皆さん、質問のような処理します?
CommandButtonの処理がどのようなものか 分かりませんが、 何かしら入力したTextBox、ComboBoxの値に 対して処理するのに、複数あるTextBox、ComboBox上での Enterで処理を走らせます?
ブランクや想定外の値などのチェックが必要でしょうし、 そのチェックを入力毎に実行されるって、 処理が複雑になるだけだと思いますが。
CommandButtonにフォーカスがあればEnterで押せるので、 オブジェクトの配置でカバーがシンプルかと。
(tkit) 2023/10/27(金) 12:10:18
しないとも言い切れないです
ちょっとちがうけど、Excelの置換ダイアログは、検索する文字列のテキストボックスに入力中も 常に[次を検索]のボタンにフォーカスがあって、Enterキーで検索が走ります そういう作りにしたい場合がないとも限らないです
そのユーザーフォームに実装する機能に依るとしかいいようがありません (´・ω・`) 2023/10/27(金) 12:46:36
あ、余談ですが、
今回の質問のような場合、Enterキーに割り当てられている機能を ユーザーに誤解なく伝えるのはなかなか難しいような気がするので、 アクセラレーターキーを設定して、Alt+ショートカットキーで 実行するのが、実装が一番楽で、かつ、ユーザーの混乱もないと思いマス (´・ω・`) 2023/10/27(金) 13:04:37
Windowsの標準UI、ExcelなどのOfficeソフトも標準UIを採用してます。
例えば、Excelの置換ダイアログで話をすると、 「次を検索」ボタンが既定のコマンドボタンになります。「閉じる」がキャンセルボタンです。 既定のボタンは強調表示されて分かるようになってます。 テキストボックスなどのコマンドボタン以外のコントロールにフォーカスかあるときにEnterキーを押すと、 「次を検索」が実行されます。Escキーを押すと閉じます。
規定とキャンセル以外のボタン、例えば「置換」にフォーカスがあるときに、 Enterキーを押すと置換が実行されます。 「置換」にフォーカスがあるときは「置換」が強調表示されて、Enterでそれが実行されるとわかります。
マウスが使えない環境や、キーボードだけで操作したいときにも対応できるように考えられている仕様だと思います。 各コマンドボタンにはアクセラレーターキーも設定されているので、それで操作することもできますが。
ユーザーフォームの Defaultプロパティ、Cancelプロパティはこの仕様に合わせて設計されているのでしょう。
WindowsのUIを十分理解していないユーザーもいると思いますが、 既定のボタン、キャンセルボタンを設定したうえで、アクセラレーターキーも設定しておくという Windowsの標準UIに沿った設計にしておくのが王道だと私は思います。 (hatena) 2023/10/27(金) 14:19:39
入力チェックに関しては、 既定のボタンのクリックイベントでチェックして、不足があればメッセージで警告するか、 テキストボックスなどの入力コントロールのBeforeUpdateイベントでチェックするか、 複数のコントロールが関係してくる場合は、実行可能になるまでは 既定のボタンのEnabledをFalseに設定しておく、 というような設計を状況や要件に合わせて選択するようにしてます。 (hatena) 2023/10/27(金) 14:27:23
(´・ω・`)さん、hatenaさん ありがとうございます。 勉強になります。
検索、置き換えダイアログや、1つしか入力がないFormなら、 あり、とは思っていました。
今回のような複数の入力が必要なオブジェクトが多数存在して、 マウス操作やtabキー連打が面倒という思いからなら、 フォーカスをCommandButtonに移動するなら、ありかな、と 考えていたところでした。
たかまやさんには、スレ汚し失礼いたしました。
(tkit) 2023/10/27(金) 17:30:53
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.