• 締切済み

ユーザーフォームでの任意の文字を含む検索について

初心者の質問で申し訳ございません。 ユーザーフォームを利用して検索ボタンを作りました。 ユーザーフォームでテキストボックスを2個と コマンドボタン1個を作成し、 テキストボックス1に検索したい氏名を入力して コマンドボタンを押すと、 ワークシートに作成されたデータのD列から 一致するものを検索し、 一致したデータのA列にある「番号」をテキストボックス2、 表示する。 このサイトで教えていただき、以下のようなプログラムで 検索することができました。 しかし、テキストボックス1の文字が完全に一致すれば結果は出るのですが、 文字を含むものを検索するように改良したいのですがどのようにすればいいのか 分からず困っています。 よろしくお願いいたします。 ************************** Private Sub CommandButton1_Click() Dim res  If TextBox1.Text <> "" Then   res = Application.Match(TextBox1.Text, Sheets("データ").Columns(4), 0)   If IsNumeric(res) Then    TextBox2.Text = Sheets("データ").Cells(res, "A").Value   Else    TextBox2.Text = "Not Found"   End If  Else   TextBox2.Text = ""  End If End Sub

みんなの回答

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

(1)Match関数は見つかった最初のものしか返さないはずです (2)(VBAでない)Matchの解説書ではMatch関数はワイルドカードが使えるとある。(照合の型を0、文字列のみ対象) (1)に対する対策は、Find、FindNextメソッドに切り替えることです。 ワイルドカードは http://www.vbalab.net/vbaqa/data/excel/log/tree_892.htm の >Set MyRange = Range("B:B").Find("~*COUNT", , xlValue, xlWhole) でできると紹介があります。 Findの方はxlPartがその役をすると思います。 http://www.moug.net/tech/exvba/0050116.htm?PRINT のLookAtを参照。 http://oshiete1.goo.ne.jp/qa1768919.html ここの回答に、Find、FindNextメソッドを使った例が出ていました。

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.1

こんな感じでしょう。前の質問をたなざらしのまま別の質問をされるのは以下がと思いますが… Private Sub CommandButton1_Click() Dim res As Range  If TextBox1.Text <> "" Then   Set res = Columns(4).Find(TextBox1.Text, LookIn:=xlValues, lookat:=xlPart)   If res Is Nothing Then     TextBox2.Text = "Not Found"   Else     TextBox2.Text = res.Offset(0, -3).Value   End If  Else    TextBox2.Text = ""  End If End Sub ただこの場合も注意が必要です。D列に XXXXA1 XXXXA2 XA のデータがあるとき、「XA」で検索すると、当然ながら先頭の行がヒットして、2行目、3行目のデータは表示されません。このような複数候補がヒットする場合は、1件目を見つけた後にFindNextメソッドで次の候補を探すのが常套手段です VBAのHELPでFineメソッドを見ると、その例が載っていますのでご覧ください

関連するQ&A