こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

エクセルVBA ユーザーフォームのリストボックス

エクセルVBAのユーザーフォームのリストボックスについて教えてください。
現在、以下のようにコードがされています。

Private Sub UserForm_Initialize()
With UserForm.ListBox1
.AddItem "ABC"
.AddItem "DEF"
.AddItem "GHI"
.ListIndex = 0
End With
End Sub


Private Sub ListBox1_Click()
With ListBox2
.Clear
Select Case UserForm.ListBox1.List(ListBox1.ListIndex)
Case "ABC"
.AddItem "123"
.AddItem "456"
.AddItem "789"
Case "DEF"
.AddItem "456"
.AddItem "789"
Case "GHI"
.AddItem "789"
End Select
.ListIndex = 0
End With
End Sub

それで、ユーザーフォームを起動した時点で、ListBox1には"ABC"、ListBox2には"789"を選択し、青く色がついている状態にすることは可能でしょうか。
よろしくお願いします。

投稿日時 - 2013-09-19 22:45:15

QNo.8271545

困ってます

質問者が選んだベストアンサー

こんにちは。

こちらの場合も、_Click ではなく _Change を使うのが妥当です。

それと、.Listプロパティを使う方が(Clearする必要もなくなり)
スッキリ書けますので、Array() 関数と合わせて、
使い方をVBAのヘルプなどで調べて確認してみてください。


Private Sub UserForm_Initialize()
  With ListBox1
    .List = Array("ABC", "DEF", "GHI")
    .ListIndex = 0
  End With
  With ListBox2
    .List = Array("123", "456", "789")
    .ListIndex = 2
  End With
End Sub

Private Sub ListBox1_Change()
  With ListBox2
    Select Case ListBox1.Value
    Case "ABC"
      .List = Array("123", "456", "789")
    Case "DEF"
      .List = Array("456", "789")
    Case "GHI"
      .List = Array("789")
    End Select
    .ListIndex = 0
  End With
End Sub

投稿日時 - 2013-09-20 02:53:58

お礼

Arrayですっきりしました
ありがとうございます

Changeで作り直してみたんですが、結果的に動作は同じになるのでしょうか
なぜChangeの方が妥当なのでしょうか

ClickでもChangeでもListboxのスクロールをクリックしただけで、反応してしまうんですね
できれば、具体的に何か選択した場合のみ反応させたかったのですが

投稿日時 - 2013-09-21 00:58:07

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

> Changeで作り直してみたんですが、結果的に動作は同じになるのでしょうか
> なぜChangeの方が妥当なのでしょうか
ListBoxが現在お使いのように、シングルセレクトであれば、同じ様に反応しますが、
Changeイベントが先です。
マルチセレクトに設定してある場合は、Clickイベントは無視されます。
汎用性が低いClickイベントを薦める理由はないでしょう。
妥当、という言い方をしたのは、
Clickイベントでも条件によっては間違いではない、ということも含みにして、
一方で、Clickを教えずChangeしか教えないサイトもあるほど、認知度に差があることや、
基本、イベントは先に発生するものを選ぶものですし、汎用的なものを薦めたいしし、
などなど、ひとつひとつは決定的な理由とまでは言えないのかもしれないけれど、
Clickを薦める理由は見つけられない、というような意味になるでしょうか。

> ClickでもChangeでもListboxのスクロールをクリックしただけで、反応してしまうんですね
"スクロールをクリック"というのがよく解りませんけれど、
仮にListBoxにスクロールバーが表示されていたとしても、
これをクリックした時にはClickもChangeも発生しません。
> できれば、具体的に何か選択した場合のみ反応させたかったのですが
そういった要求に応える為には、普通は、確定ボタンを別に設けるとか、
_KeyUpイベントなどでEnterキーを拾うとかします。
また、キーボードの方向キーだけで操作しているような場合は、
{HOME} {END} {PGUP} {PGDN} キーなどを活用すれば、
ある程度、緩和されるのではないですか?

投稿日時 - 2013-09-21 03:12:40

お礼

追加で回答ありがとうございます

確かに汎用性がある方が優先されますね
納得しました

スクロールについては突然話がとんですみません
実は、今回の質問とは関係がないのですが、Listboxを選択することで、別のチェックボックスをtrue→Falseにするようしていました

Private Sub ListBox1_Enter()
CheckBox1.Value = False
End Sub

ListBox1には複数の候補があるので、3つまで表示できるようにしており、残りはスクロールバーを使うことで表示しているのですが、そのスクロールバーをクリックするだけでCheckBox1がtrue→Falseになってしまったので、実際に何か候補を選択した場合のみCheckBox1を変化できるよう悩んでいたわけです
確定ボタンを別に設けて解消できるか挑戦してみます

ありがとうございました

投稿日時 - 2013-09-21 22:14:06

ANo.1

>起動した時点で、ListBox1には"ABC"、ListBox2には"789"を選択

>Private Sub UserForm_Initialize()
>With UserForm.ListBox1
>.AddItem "ABC"
>.AddItem "DEF"
>.AddItem "GHI"
>.ListIndex = 0
>End With
Me.ListBox2.ListIndex = 2
>End Sub

投稿日時 - 2013-09-19 23:09:07

お礼

早速の回答ありがとうございます

無事できました
助かりました

投稿日時 - 2013-09-21 00:30:26

あなたにオススメの質問