プロが教える店舗&オフィスのセキュリティ対策術

いつもお世話になっております
下記のコードは
ListBox1をClickしたときに
ListBox2に担当のお客様が表示されるというものです。
ここでListBox1をマルチセレクトしたときに
ListBox2に表示させることは可能でしょうか

添付ファイルを2回に分けます。

わかる方おしえてくれませんでしょうか
無理なのでしょうか。

よろしくお願いいたします。

Private Sub ListBox1_Click()
Dim dic As Object
Set dic = CreateObject("Scripting.dictionary")

ListBox2.Clear
For i = 2 To Cells(Rows.Count, 2).End(xlUp).Row
If Cells(i, "H").Value = ListBox1.List(ListBox1.ListIndex) Then
If Not dic.Exists(Cells(i, "H").Value) Then

With ListBox2
.AddItem ""
.List(.ListCount - 1, 0) = Cells(i, 3).Value
End With

End If
End If
Next

Set dic = Nothing
End Sub

Private Sub UserForm_initialize()

With ListBox1
.AddItem "近藤"
.AddItem "工藤"
.AddItem "遠藤"
.AddItem "加藤"
End With

End Sub

「ListBox1をClickしたときのイ」の質問画像

質問者からの補足コメント

  • 添付はデータの表です。
    よろしくお願いいたします。

    「ListBox1をClickしたときのイ」の補足画像1
      補足日時:2022/12/11 19:47
  • うーん・・・

    下記の部分のところなんとかすれば
    いけるのかもしれないのですが
    If Cells(i, "H").Value = ListBox1.List(ListBox1.ListIndex) Then

      補足日時:2022/12/11 19:49

A 回答 (5件)

clickイベントはマルチセレクトの場合、発生しないので


Private Sub ListBox1_Click()を
Private Sub ListBox1_Change() に変えます。

以下のようにようにしてください。
不明点があれば、補足してください。
----------------------------------------------------
Private Sub ListBox1_Change()
Dim dic As Object
Dim i As Long

Set dic = CreateObject("Scripting.dictionary")
ListBox2.Clear
For i = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(i) = True Then
dic(ListBox1.List(i)) = True
End If
Next
For i = 2 To Cells(Rows.Count, 2).End(xlUp).Row
If dic(Cells(i, "H").Value) = True Then
With ListBox2
.AddItem ""
.List(.ListCount - 1, 0) = Cells(i, 3).Value
End With
End If
Next
Set dic = Nothing
End Sub
    • good
    • 0
この回答へのお礼

いつもありがとうございます。
思い通りに動作いたしました。
ありがとうございました。

お礼日時:2022/12/13 12:56

こんばんは


dictionaryのロジックはすでに指摘されている通り
UserForm_initializeで実行した方が理に適っています
担当者別データ(担当者リスト)が欲しく、重複担当者の値が有る列対象なのでListBox1.AddItem(作成時)が理想かと
.AddItem "近藤" などとするなら dicの使用意図がわからないです
選択されている値は一意ですよね・・(一意でないと困りけれど)
あと
ListBox1.MultiSelect = fmMultiSelectMulti も忘れずに・・

これも指摘されていますね
Private Sub ListBox1_Click()についてはMultiSelectにするとClickイベントが上手く動かないので Private Sub ListBox1_Change() にします

ListBox1_Changeの内容ですが
先ず ListBox2.Clear
ListBox1が選択されている値を使うのでListBox1リストをループ
ListBox1.Selected(インデックス) = True で
選択されているかを判断して選択されていれば
シートの対応する範囲をループ処理をして
ListBox1.Selected(インデックス)=Hセル ならば
ListBox2.List(j, 0) にListBox1.Selected(インデックス)の値
n = n + 1 ()ヒットごとに
ListBox2.List(j, n) = 該当Cセルテキスト
jはSelected(インデックス) = True ごとに j = j + 1
ListBox2.ColumnCountの設定は少し工夫が必要かな・・

コードを書いた方が判り易いと思いますが・・
取り合えず、、下手な日本語で書いて見ましたがめどは立ちますでしょうか

不明な点は追記してください‥Unique関数って使えますか?
すぐに閉じると間違い訂正や回答しようとしている場合に出来ない場合があります
    • good
    • 6
この回答へのお礼

いつもありがとうございます。
参考にいたします。

お礼日時:2022/12/13 12:50

No.3 です。



訂正。

>ListBox1を弄るたびにdicを組み替えるのは確かにデータ数が多ければ有利かもですけど、

ListBox1を弄るたびにdicを組み替えるのは確かにデータ数が少なければ有利かもですけど、

でした。
選択する項目のON・OFFの度にイベント発生しませんでしたっけ。
それなら選択後にCommandButtonを使う等の方が良いかなと。
今回とは逆にListBox2をクリックし、呼び込みをするって案もありそう。
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2022/12/13 12:50

個人的には、



Private Sub UserForm_initialize()

にてdicに担当をkey・名前セルをitemとして格納する。

その後keysを基にListBox1.AddItem~を追加作成。

あとはListBox1で選択された値を基にListBox2にdic("担当者名")のitemを吐き出す。

とかかな?
ListBox1を弄るたびにdicを組み替えるのは確かにデータ数が多ければ有利かもですけど、吐き出す回数が多いなら先に入れてしまうって方法は以前回答したと思いましたけど、近年回答してもスル~でしたので眺めるだけにしてました。

でも、

With ListBox2
.AddItem ""
.List(.ListCount - 1, 0) = Cells(i, 3).Value
End With

これって複数列を入れるって事の前段階な気もしちゃいますけど。
itemには複数のデータを格納できますって回答しようとして切られちゃったからかな?
key:item = 1:1に限らず(= 1:多 ですよ)。
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2022/12/13 12:50

元々得たい結果が不明ですが、1担当につき1顧客で宜しいのですかね?


>If Not dic.Exists(Cells(i, "H").Value) Then

にしては変数:dicは使われていないのに、存在の有無を判定してますけど?

マルチセレクトの場合、全てのリストを調べ選択されているかどうかを比較し処理判断する必要があるのでは?
2~3年前にそんな質問上げてませんでしたっけ?(当時のIDは違いましたけど)。
うろ覚えなので勘違いならすいません。

https://kosapi.com/post-4040/

選択されてたらその値でH列にフィルタをかけて、可視されている顧客名を順に取得するとか?
これは近年見かけたような気もします。

別の質問で別の回答者が仰ってたと思いましたが、既に作成できるスキルはあると思うのですが何をどう使うかって点は、そのやりたい事を検索してみるとヒントは見つかるかなと。
あとは過去の質疑の回答と照らし合わせ応用していく。
単に回答を得て動いたら質問を閉じるってやり方では、伸びないと思いますよ。

と、この時間は寝ぼけているので回答がメチャクチャかもしれませんけど。
まぁ指がメチャクチャに潰れるよりは良いですが?
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2022/12/13 12:49

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!