• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBAにてリストボックスで選択すると別ブックにあるデータを個別の窓へ表示させるには?)

VBAリストボックスで選択したデータを別ブックの窓に表示させる方法

このQ&Aのポイント
  • VBAを使用して、UserForm1から別のシートにあるデータを検索し、抽出されたリストをListBox1で選択した際に関連する詳細をTextBox2に表示する方法を教えてください。
  • 顧客データが別のシートにあり、担当者名、氏名、カタカナ、住所、電話番号などのデータがA列に並んでいます。現在、進めている状況ではありますが、問題が発生しています。どなたか助けてください。
  • また、検索結果をユーザーフォームに表示させる際に、ListBox1で選択したデータに関連する詳細情報をTextBox2に表示するためのコードも教えていただけると助かります。

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

  • ベストアンサー
回答No.1

こんな方法はどうでしょうか? 見つけた名前をリストに追加する時に、その行も記録します。 .ListBox1.AddItem (ListNamae) の次の行に .ListBox1.List(.ListBox1.ListCount - 1, 1) = i を追加します。 これで、名前リストを見つけた行も記録します。 List()の引数は0から始まるので.ListBox1.ListCount-1に記録します。 プロパティウインドウでTextBox2のMultiLineをTrueにして、ListBox1_Click()の部分を以下にしてみてください。 Private Sub ListBox1_Click() Dim r As Long With ListBox1 If .ListIndex > -1 Then r = .List(.ListIndex, 1) '選択した名前の行 TextBox2.Value = Worksheets("顧客データ").Cells(r, 4) & vbCrLf & Worksheets("顧客データ").Cells(r, 5) End If End With End Sub p.s. Dim MeNamae As Object Dim kensaku As Object Public Sub 検索(ByVal Namae As String, ByRef MeNamae As Object) の、As Objectは、できるだけ避けた方がいいと思います。 Dim MeNamae As UserForm Dim kensaku As Worksheet Public Sub 検索(ByVal Namae As String, ByRef MeNamae As UserForm) にすれば、VBEの入力支援機能が機能して、入力が楽になり、エラーも見つけやすくなると思います。

shosin999
質問者

お礼

こちらの手違いでした。動作は完璧です。まさに理想通りにうごきました。動かないと思っていたのはテキストボックスが小さかった為見えなかったからでした。大変失礼いたしました。すみませんでした。また、大変感謝いたしております。

shosin999
質問者

補足

早速のお返事とても感謝いたしております。 記述を以下のように変更いたしましたが、「TextBox2」に表示もされずまた、終了もされません。まだ何か間違いなどありますでしょうか? 大変お手数ですが、再度お返事よろしくお願い致します。 Private Sub CommandButton1_Click() Dim Namae As String Dim MeNamae As UserForm Dim ken As String Namae = TextBox1.Text Set MeNamae = UserForm1 Call 検索(Namae, MeNamae) End Sub Public Sub 検索(ByVal Namae As String, ByRef MeNamae As UserForm) Dim Nagasa As Integer Dim i As Long Dim MaxRows As Long Dim kensaku As Worksheet Dim KensakuChar As String Dim ListNamae As String Dim ListChar As String Dim KBanme As Integer Dim LBanme As Integer Set kensaku = Worksheets("顧客データ") MaxRows = kensaku.UsedRange.Rows.Count Nagasa = Len(Namae) MeNamae.ListBox1.Clear For i = 3 To MaxRows ListNamae = kensaku.Cells(i, 3) KBanme = 0 LBanme = 0 Do Do While Nagasa >= KBanme KBanme = KBanme + 1 KensakuChar = Mid(Namae, KBanme, 1) If KensakuChar <> " " Then Exit Do End If Loop Do While Nagasa >= LBanme LBanme = LBanme + 1 ListChar = Mid(ListNamae, LBanme, 1) If ListChar <> " " Then Exit Do End If Loop If KensakuChar = ListChar Then If Nagasa = KBanme Then With MeNamae .ListBox1.AddItem (ListNamae) .ListBox1.List(.ListBox1.ListCount - 1, 1) = i End With End If Else Exit Do End If Loop Until Nagasa <= KBanme Next End Sub Private Sub ListBox1_Click() Dim r As Long With ListBox1 If .ListIndex > -1 Then r = .List(.ListIndex, 1) '選択した名前の行 TextBox2.Value = Worksheets("顧客データ").Cells(r, 4) & vbCrLf & Worksheets("顧客データ").Cells(r, 5) End If End With End Sub

その他の回答 (1)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

もう判ったようだが、折角やってみたので載せておく。 自分の作ったコードのコピーを貼り付けて、読者に読み解かせるのでなく 下記のような解説が必要と思う。 ーー 顧客データシート 担当 会社 所在地 業種 年商 係A 山田産業 喜多町 衣類販売 20 係B 小池商事 本町 食料品卸 35 課長 北野 新宿町 紙製品 15 係C 近藤組 諏訪町 建設解体 10 係A 北村機械 北公園 輸送機械 25 課長 南塗料 新町 塗料卸 8 係B 島田製菓 八幡町 菓子製造 15 係A 北モータス 学園町 クルマ修理 7 係A 西食品 本郷 食品加工 25 ーーーー (道具だて) UserForm1を1つ挿入する。 その上のコントロールは 検索語を入力用ーーーテキストボックス 選択用アイテム表示ーリストボックス 検索開始のトリガーーコマンドボタン リストボックス選択後の内容表示用ーーテキストボックス3つ ーーーー (処理の流れ) textBox1に検索語を入れる コマンドボタンクリック 顧客データシート検索 候補リストをリストボックスのアイテムとして表示 リストボックスにリストから選択 決定内容(顧客データ)の特定の行の項目をテキスト ボックスに表示 ーーー (コード) 標準モジュールに Public gyo(10) を入れる ーーー リストボックスの選択の前まで Private Sub CommandButton1_Click() Dim Namae As String Dim MeNamae As Object Dim ken As String Namae = TextBox1.Text Set MeNamae = UserForm1 Call 検索(Namae, MeNamae) End Sub '--- Public Sub 検索(ByVal Namae As String, ByRef MeNamae As Object) Dim Nagasa As Integer Dim i As Long Dim MaxRows As Long Dim kensaku As Worksheet Dim KensakuChar As String Dim ListNamae As String Dim ListChar As String Dim KBanme As Integer Dim LBanme As Integer Set kensaku = Worksheets("顧客データ") MaxRows = kensaku.UsedRange.Rows.Count Nagasa = Len(Namae) MsgBox MaxRows MeNamae.ListBox1.Clear j = 0 For i = 2 To MaxRows + 1 If kensaku.Cells(i, "A") = Namae Then With MeNamae.ListBox1 .AddItem .List(j, 0) = kensaku.Cells(i, "B") .List(j, 1) = kensaku.Cells(i, "C") ' & kensaku.Cells(i, "B") & kensaku.Cells(i, "C") j = j + 1 End With End If Next i End Sub ーーー 選択後の詳細データ表示は (1)再検索法 (2)Public変数に保持法 (3)ListBoxの列に保持法 (4)配列データ引数引渡し など考えられるが、本件は(2)でやった。 ーー Private Sub ListBox1_Click() Set kensaku = Worksheets("顧客データ") With ListBox1 If .ListIndex > -1 Then x = ListBox1.ListIndex 'MsgBox x MsgBox gyo(x + 1) TextBox2.Value = .List(.ListIndex, 0) TextBox3.Value = .List(.ListIndex, 1) TextBox4.Value = kensaku.Cells(gyo(x + 1), 4) TextBox5.Value = kensaku.Cells(gyo(x + 1), 5) End If End With End Sub ーーー (操作例) テキストに「係A」と入力 リストボックスに 山田産業 北村機機械 北モータース 西食品 が出る 例えば北村機械をクリックすると、各テキストボックスに 北村機械 北公園 輸送機械 25 が出る。

shosin999
質問者

お礼

親切な回答ありがとうございます。詳しければ詳しいほど初心者である私には今後につなげることができます。これからも詳しい回答を期待しております。この度はありがとうございました。

関連するQ&A

専門家に質問してみよう