Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 11 Home : Excel 2016)
ComboBox2.DropDown でエラー発生
投稿日時: 24/04/27 22:01:23
投稿者: taichi

UserForm上にComboBox1、ComboBox2を配置しています。
 
1クリックの手間が面倒なので
Private Sub UserForm_Initialize()
    ComboBox1.DropDown
End Sub
これは問題なし
 
Private Sub ComboBox1_Change()
    If ComboBox1.ListIndex <> -1 Then <---@
        ComboBox2.SetFocus <---A
        ComboBox2.DropDown
    End If
End Sub
オートメーションエラーです。
起動されたオブジェクトはクライアントから切断されました。 とエラーになります。
 
@はあってもなくても動きは変わらないようですが、Aを削除すると
エラーにはなりませんが、ComboBox2.DropDown が有効になりません。
 
よろしくお願いいたします。

回答
投稿日時: 24/04/28 13:29:27
投稿者: WinArrow

一般的に
ComboBox2.DropDown
は、ComboBox2.Enter イベントで実行します
他のコントロールをアクセス中には、実行すべきではないです。

回答
投稿日時: 24/04/28 16:52:07
投稿者: hatena
投稿者のウェブサイトに移動

既に指摘がありますが、Changeイベントで無理矢フォーカス移動させたり、他のコントロールをごにょごにょするのは危険ですのでさけるべきです。
よって、Enterイベントでドロップダウンさせるべきです。
 
で、ご希望のことは、クリックの手間を省くために、下記のことをしたいと推測しました。
 
(1)フォームを開いた直後にComboBox1のリストは開いておく。
(2)ComboBox1でリスト選択した直後に、ComboBox2にフォーカス移動してリストも開く。
 
(1)について
Initializeイベントでドロップダウンはしないので、Activateイベントで実行したら実現できました。
 

Private Sub UserForm_Activate()
    ComboBox1.SetFocus
    ComboBox1.DropDown
End Sub

 
(2)がなかなか難しい。
 
とりあえず、下記でComboBox2などでフォーカス移動させるとドロップダウンはする。
Private Sub ComboBox2_Enter()
    ComboBox2.DropDown
End Sub

 
リスト選択した直後にフォーカス移動させるのがうまくいかない。
 
Changeイベントの代わりにAfter_Updateイベントで実行してみた。エラーにはならないが、リストを選択しただけでは発生しないので、EnterキーかTabキーを押す、など何らかのアクションが必要になる。
Clickだと選択だけで発火するが、Changeと同様のエラーになる。
 
いろいろ試行錯誤して、SetFocusするのは諦めて、SendKeys でTabキーを押すということでなんとかできました。
 
Private Sub ComboBox1_Click()
    If ComboBox1.ListIndex <> -1 Then
        SendKeys "{TAB}"
    End If
End Sub

 
SendKeysはできれば使いたくないのですが、他に方法が見つからなかった。

回答
投稿日時: 24/04/28 18:29:28
投稿者: WinArrow

DropDownは、当該コントロールにカーソルが移動した時、
ドロップダウンリストを見せる
機能です。
予め、見せる必要があるならば、リストボックを使えばよいでしょう。

回答
投稿日時: 24/04/28 22:35:36
投稿者: 半平太

試行錯誤の結果、こんなので行けるかも知れない
 
標準モジュールに
Sub CmBx2DrDwn()
    UserForm1.ComboBox2.DropDown
End Sub
 
UserForm1モジュールに
Private Sub ComboBox1_Change()
    ComboBox2.SetFocus
    Application.OnTime Now, "CmBx2DrDwn"
End Sub

投稿日時: 24/04/28 23:47:57
投稿者: taichi

WinArrow さん hatena さん 半平太さん ありがとうございました。
 
■ hatena さん 色々試していただきありがとうございました。
>SendKeys でTabキーを押す
このようなことは思いも付かなかったです。ありがとうございます・
 
■ 半平太 さん
これを取り入れさせていただきました。
以前 単純に ListBox1.ListIndex = -1 と記述するでけでは
うまくいかずに、同じような手法で解決できたことがありました。
ありがとうございました。
 
■ WinArrow さん
>予め、見せる必要があるならば、リストボックを使えばよいでしょう。
ComboBox1 には1-6までの学年の数字を登録。
ComboBox2 にはComboBox1 で選択された学年のある活動に
参加する学年別人数を登録し年(A列)+1000*番(B列)の4桁で
登録者全員を識別NOしています(例 1-123)
高学年では登録が10人程ですが1、2年生は登録が100を超えるので
ListBoxの代わりにComboBox を使っています。
 
今後ともよろしくお願いいたします。