• ベストアンサー

検索画面の作り方

 今、エクセルマクロでユーザーフォームをつくり、その中にシートから引っ張ってきた項目をリストボックスに表示させてあるのですが、新たにテキストボックスをつくりそこにリストボックスにある項目と一致した場合、(もしくは一部が一致)した場合に強調表示させることは出来るのでしょうか。  そして、選んだ項目をコマンドボタンだけでなくダブルクリックで特定のセルに入れることは可能でしょうか。よろしくお願いします。

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

  • ベストアンサー
  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.3

#1です。 > 既回答よりコードが大幅に少なく出来ました。 先の回答での Initialize はテスト用に書いただけなので、Initialize、変数宣言、エラー処理を除けばそう変わらないと思いますけど、、、 また、「シートから引っ張ってきた項目をリストボックスに表示させてある」って事なので、もともと RowSource を使われているでは? それよりも aadfg aadfgx aadfgz とある場合に、私のコードだと aadfgx を入力しても aadfg を選んでしまい、#2さんのコードだと aadfg と入力しても、aadfgz を入力してしまいます。 と言う事で、効率悪いですが完全マッチをしてから補完選択させるために Change を修正しました。 また、Enterで ListBox の選んだ値を入力出来た方が便利なので KeyPress も追加してみました。 参考になれば。 '------------------------------------------------------------ Private Sub TextBox1_Change() Dim s As String, i As Long On Error GoTo ER  For i = 0 To ListBox1.ListCount - 1   If TextBox1.Value = ListBox1.List(i) Then     ListBox1.ListIndex = i     Exit Sub   End If  Next i  For i = 0 To ListBox1.ListCount - 1   s = Left(ListBox1.List(i), Len(TextBox1.Value)) & "*"   If TextBox1.Value Like s Then     ListBox1.ListIndex = i     Exit For   End If  Next i ER: End Sub '------------------------------------------------------------ Private Sub ListBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) If KeyAscii = 13 Then   ActiveSheet.Range("C5").Value = ListBox1.List(ListBox1.ListIndex) End If End Sub

その他の回答 (2)

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

(1)ツール-マクロ-VBE-挿入-ユーザーフォームでユーザーフォームを作る。 (2)コントロールツールバーを出し、リストボックスのアイコンをユーザーフォーム上にD&D。 リストボックス内で右クリックして「プロパティ」をクリック。 RowSourceの行にSheet1!A1:A4を入力(ここがポイント。アイテムを設定するコードが不要になる) Sheet1のA1:A4に例えば aadfg bbfg ccxcv ddxcb をいれる。 また「ControlSource」行にSheet1!C5とか入力すると選択したアイテムがC5にセットされる。 (3)コントロールツールバーを出し、テキストボックスのアイコンをフォーム上にD&D。 (4)テキストボックスをダブルクリックしてVBEの画面に行き、 Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean) Sub Endのイベントを選んで出す。(ここがポイント。エンタを押した後のタイミングで動作してくれる) そしてコードを Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean) s1 = UserForm1.TextBox1.Text For i = 0 To UserForm1.ListBox1.ListCount - 1 s2 = UserForm1.ListBox1.List(i) p = InStr(s2, s1) If p <> 0 Then UserForm1.ListBox1.ListIndex = i End If Next i End Sub (5)操作 テキストボックスに例えば、「dx」と入力しEnterを押すと リストボックスのddxcbが選ばれ(濃い青色で黒白反転し)、C5セルにはddxcbがセットされる。 問題の意味を捉えるのに苦労しました(例えばなぜテキストボックスを介する必要があるかなど)ので、ずれている点、不充足の点があっるかも知れませんが、近くまでは来ているかと思いますのでよろしく。 既回答よりコードが大幅に少なく出来ました。

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.1

効率の良い方法では無いですが、、、こんな感じでしょうか? UserForm に ListBox と TextBox を1個ずつ置いて試しました。(Excel2000) '------------------------------------------------------------ Private Sub UserForm_Initialize() Dim i As Integer, j As Integer, k As Integer  For i = 97 To 100   For j = 97 To 100    For k = 97 To 100     ListBox1.AddItem Chr(i) & Chr(j) & Chr(k)    Next k   Next j  Next i  TextBox1.SetFocus End Sub '------------------------------------------------------------ Private Sub TextBox1_Change() Dim s As String, i As Long On Error GoTo ER  For i = 0 To ListBox1.ListCount - 1   s = Left(ListBox1.List(i), Len(TextBox1.Value)) & "*"   If TextBox1.Value Like s Then     ListBox1.ListIndex = i     Exit For   End If  Next i ER: End Sub '------------------------------------------------------------ Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)   ActiveSheet.Range("A1").Value = ListBox1.List(ListBox1.ListIndex) End Sub

関連するQ&A