- ベストアンサー
コンボボックスのドロップダウン表示に関する質問
- Excel2003で複数のコンボボックスのドロップダウン表示をしたいがうまくいかない
- フォーカスが移っているがドロップダウンが表示されず、カーソルのみが表示される
- コンボボックス1にEnterイベントでドロップダウン表示し、選択した項目が次のコンボボックスに移って同様に表示したい
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 > フォーカスは移っている様なのですが、ドロップダウン表示されずカーソルのみ表示された状態になるのですが。 確かに、一旦はComboBox2にフォーカスが移り、ComboBox2_Enter()が呼び出され実行されますが、 ComboBox1_Change の一連の処理が未だ完了していませんから、 再度、ComboBox1にハンドルが戻って(その後、End Subを通って)しまう為、 > ComboBox2.DropDown は、実行後、すぐにキャンセルされることになります。 ある意味、矛盾したコマンドになっていますので、ややリスキーな方法です。 実際、私の環境で、ご提示の記述のまま繰り返しテストしましたが、 何度かExcelが落ちてしまいました。 > 項目をクリックし選択した後 > 次のコンボボックスに移り同じようにドロップダウン表示したいのです。 > どうにか出来ないものでしょうか? 要するに コンボボックス入力時に、「選択→確定」という操作を省略して、 「選択」だけしたら自動的に「確定」して次のコントロールにフォーカス という風なことをなさりたい、のだと思いますが、 キーボード操作でコンボボックスの項目選択ができない 誤入力(コンボボックスの項目選択ミス)に気が付き難い 等の難点があることを確認しておいてください。 キーボード操作でコンボボックスの項目選択をしようとして、 [↓方向キー]を押すだけで次のコントロールにフォーカスが移ることになりますから、 常に先頭項目しか選択できないことになります。 #実は私も似たような設計を使ったことありますが、 その時は、キーボードが置かれていない環境での使用を前提にしていましたし、 誤入力への対策にも相当に骨を折った覚えがあります。 本来は、「次のコンボボックスに移り」という部分は、 UseFromのデザイン時に、TabIndexを指定しておけば、 各コントロールを「確定」したタイミングで 次のコントロールにフォーカスが移るように使うものですから、 「確定」操作を省略しなければ、 ' ' 〓〓〓 Enterキーで確定する場合 〓〓〓 Private Sub ComboBox1_Enter() ComboBox1.DropDown End Sub Private Sub ComboBox2_Enter() ComboBox2.DropDown End Sub ' ' 〓〓〓〓〓〓〓〓〓〓〓〓〓 これ↑だけで済む話ではあります。 何れにしても、各コントロールのTabIndexは、 TextBox1 .TabIndex = 0 TextBox2 .TabIndex = 1 ComboBox1 .TabIndex = 2 ComboBox2 .TabIndex = 3 (デザイン時にタブの順番にコントロールを挿入したのなら、そのまま) という状態を維持しておいてください。 そういう前提で、 > どうにか出来ないものでしょうか? 直接的な答として、2例挙げておきます。 ' ' 〓〓〓 SendKeys版 〓〓〓 Private Sub ComboBox1_Enter() ComboBox1.DropDown End Sub Private Sub ComboBox1_Change() SendKeys "{Enter}", True End Sub Private Sub ComboBox2_Enter() ComboBox2.DropDown End Sub ' ' 〓〓〓〓〓〓〓〓〓〓〓〓〓 ' ' 〓〓〓 OnTime版 〓〓〓 ' ' === 以下、UserFormモジュール === Private Sub ComboBox1_Enter() ComboBox1.DropDown End Sub Private Sub ComboBox1_Change() Application.OnTime Now(), "'CBX_Update_Next ""ComboBox2""'" End Sub Private Sub ComboBox2_Enter() ComboBox2.DropDown End Sub ' ' === 以上、UserFormモジュール === ' ' === 以下、標準モジュール === Public Sub CBX_Update_Next(ByVal Destination As String) UserForm1.Controls(Destination).SetFocus End Sub ' ' === 以上、標準モジュール === ' ' 〓〓〓〓〓〓〓〓〓〓〓〓
お礼
丁寧な回答有難うございます。 使用者がパソコンと製品について余り知識が無い為、混乱と効率を上げるためにこのような仕様にしたのですが、中々上手くいかず困っていました。 入力箇所が結構な数になる為このようにしましたが、指摘された通り入力ミスに気が付き難いと言う不安もありますね。その辺はまた考えなければいけません。 回答の方ですが、上の方法は自分の環境では上手くいきませんでした。 Combobox1選択状態で止まってしまいます。 下の方法だと希望通りの動きが出来ました。 実際はもっとComboboxがあるのでクリックのみでどんどん選択して行きたかったのです。 初めて質問サイトを利用して不安でしたが、丁寧な回答とアドバイスを頂けてとてもうれしく思います。 どうも有難うございました。