- ベストアンサー
検索画面の作り方
今、エクセルマクロでユーザーフォームをつくり、その中にシートから引っ張ってきた項目をリストボックスに表示させてあるのですが、新たにテキストボックスをつくりそこにリストボックスにある項目と一致した場合、(もしくは一部が一致)した場合に強調表示させることは出来るのでしょうか。 そして、選んだ項目をコマンドボタンだけでなくダブルクリックで特定のセルに入れることは可能でしょうか。よろしくお願いします。
- みんなの回答 (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)
(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)
効率の良い方法では無いですが、、、こんな感じでしょうか? 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