[[20231026110438]] 『ユーザーフォームのエンターが押された時の動作』(たかまや) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『ユーザーフォームのエンターが押された時の動作』(たかまや)

あるユーザーフォームが起動しているとき、
エンターが押された時に特定のコマンドボタンが押されたという状態にしたいのですが、どのように記載すればよいでしょうか?

具体的には、ユーザーフォーム内にテキストボックスやコンボボックスなどが複数あり、コマンドボタンに実行の役割を持たせ、
テキストボックスやコンボボックスの値などを取得し、あらゆる処理が行われます。

ここでエンターを押すとコマンドボタンが押されたとみなされるようにしたいです。

< 使用 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

白茶様>
それに近いです。
コマンドボタンが押された時に行われる処理はcallで呼び出ししての動作でも問題ありません。
なので、「 KeyDownイベントで KeyCode.Value が vbKeyReturn だったら「ソレ」をCallする」の
コードが知りたいです。

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.