VBAフォームのテキストボックスで1文字検索、候補を表示する方法について

このQ&Aのポイント
  • VBAフォーム上のテキストボックスに文字列を入力した際、リストから候補が表示される方法について教えてください。
  • シート1のA列には名前のリストがあり、1文字入力すると該当する候補が表示されるようにしたいです。
  • 具体的には、テキストボックスに「木」と入力した場合には、「木村かりん」と「木村ひろし」という候補が表示されるようにしたいです。
回答を見る
  • ベストアンサー

VBA フォームのテキストボックス 1文字検索

お世話になります。 フォーム上にあるテキストボックスに 文字列を入力したら、リスト?が出るようにしたいです。 シート1のA列に名前リストがあり、 そのリストを参照して、1文字入力したら候補が表示されるよう 組みたいと思っています。 シート1 田中 麻美 佐藤 たける 加藤 美佐 佐々木 瞳 竹井 まどか 木村 かりん 木村 ひろし 佐藤 圭 菊地 美優 田中 麻美 佐藤 たける 加藤 美佐 佐々木 瞳 竹井 まどか 木村 かりん 木村 ひろし 佐藤 圭 菊地 美優 ------------- 上記のようなリストがあったとします。 (リスト内で必ず重複します。) 木 と入力したら、 木村かりん、木村ひろし という候補が出て欲しいと思っています。 http://d.hatena.ne.jp/language_and_engineering/20081125/1227571724 ワークシート上でのプログラムは 上記リンクを参考にすればできるかとは思うのですが、 フォーム上ではできないでしょうか? また、コンボボックスならやり方は何となくわかりますが、 どうしても、テキストボックスでやりたいと思っています。 テキストボックスでも可能かどうか、教えて下さい!

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

  • ベストアンサー
  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.3

#1です。更に遊んでいました。テキストボックスをリストに合わせて自動拡張にしてみました。また、意図しない入力への対応を盛り込んでみました。その場しのぎの対応なので、論理的ではないかもしれません。 ADOを使っているので、半角の%を入力すると全リストが表示されます。また、変換しにくいですが%藤とかを入れると、先頭以外もヒットします。 添付画像のCommandButtonはZOrderの試験用です。 Dim listSetFlag As Boolean Dim lineCount As Long Const initialHeight As Single = 18 Const lineWidth As Single = 9 Private Sub TextBox1_Change() Dim myText As String If Not listSetFlag Then myText = getUniqueList(Me.TextBox1.Value) If myText = "" Then Me.TextBox1.Value = "" Else listSetFlag = True With Me.TextBox1 .Value = myText .Height = initialHeight + lineWidth * (lineCount - 1) .SelStart = 1 End With End If End If End Sub Private Sub TextBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) Dim buf1 As String, buf2 As String Dim myList As Variant Dim selectedline As Long If Me.TextBox1.Value = "" Then Exit Sub buf1 = Replace(Me.TextBox1.Text, vbCrLf, vbCr) '-A buf2 = Left(buf1, TextBox1.SelStart) selectedline = UBound(Split(buf2, vbCr)) myList = Split(buf1, vbCr) MsgBox "選択されたのは " & myList(selectedline) & "です。" 'initialize Me.TextBox1.Value = "" Me.TextBox1.Height = initialHeight lineCount = 0 listSetFlag = False End Sub Private Sub UserForm_Initialize() With Me.TextBox1 .MultiLine = True .WordWrap = False .ZOrder fmZOrderFront .IMEMode = fmIMEModeOn .Height = initialHeight End With listSetFlag = False lineCount = 0 End Sub Function getUniqueList(key As String) As String Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim mySQL As String If key = "" Then getUniqueList = "" Exit Function End If Set cn = New ADODB.Connection 'xl2007以降対応です。2003以前は、自ワークブックへの接続に関してメモリリークの問題が '改善されていないので、別の方法をとるべきでしょう。 With cn .Provider = "Microsoft.ace.OLEDB.12.0" .ConnectionString = "Data Source=" & ThisWorkbook.FullName & ";" & _ "Extended Properties='Excel 12.0; HDR=Yes'" '見出し無しの時はここをNoに .Open End With Set rs = New ADODB.Recordset rs.CursorLocation = adUseClient '見出し無しの時はここの氏名に代えてF1を入れる mySQL = Replace("select distinct 氏名 from [Sheet1$] where 氏名 like 'key%';", "key", key) rs.Open mySQL, cn, adOpenDynamic lineCount = rs.RecordCount If lineCount > 0 Then '改行をvbCrやvbLfで行っても動く(Aの文字数調整不要となる)が、変にちらつく getUniqueList = rs.GetString(adClipString, , , vbCrLf) Else MsgBox "みつかりません" getUniqueList = "" End If rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Function

satoron666
質問者

お礼

回答ありがとうございます! 返信おくれて申し訳ありません。 おぉお、すばらしい機能が…! ありがとうございます! 試してみます^^

その他の回答 (2)

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.2

#1です 肝腎なことを書き落としていました。 Sheet1のリストの一行目には「氏名」という見出しを入れておいて下さい。 入れない場合でも対応は可能ですが、分かり易い方策をとっています。 失礼致しました。

satoron666
質問者

お礼

回答ありがとうございます!!

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.1

>どうしても、テキストボックスでやりたいと思っています。 こういうこだわりの世界はご自分で解決する方が楽しいと思いますが、試しにやってみました。 あくまで考え方の例として好き放題やっておりますので、質問者様の環境に合わないかもしれませんが、ご了解願います。 UserFormにTextBoxを一個だけ置いています。高さはリスト表示に必要なだけ確保して下さい。ADOに参照設定が必要です。likeで抽出しているので、「佐」でも「佐藤」でも抽出可能です。 Dim listSetFlag As Boolean Private Sub TextBox1_Change() If Not listSetFlag Then listSetFlag = True Me.TextBox1.Value = getUniqueList(Me.TextBox1.Value) End If End Sub Private Sub TextBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) Dim buf1 As String, buf2 As String Dim myList As Variant Dim selectedline As Long If Me.TextBox1.Value = "" Then Exit Sub buf1 = Replace(Me.TextBox1.Text, vbCrLf, vbCr) '-A buf2 = Left(buf1, TextBox1.SelStart) selectedline = UBound(Split(buf2, vbCr)) myList = Split(buf1, vbCr) MsgBox "選択されたのは " & myList(selectedline) & "です。" Me.TextBox1.Value = "" listSetFlag = False End Sub Private Sub UserForm_Initialize() Me.TextBox1.MultiLine = True Me.TextBox1.WordWrap = False listSetFlag = False End Sub Function getUniqueList(key As String) As String Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim startTime As Long Dim mySQL As String Set cn = New ADODB.Connection 'xl2007以降対応です。2003以前は、自ワークブックへの接続に関してメモリリークの問題が '改善されていないので、別の方法をとるべきでしょう。 With cn .Provider = "Microsoft.ace.OLEDB.12.0" .ConnectionString = "Data Source=" & ThisWorkbook.FullName & ";" & _ "Extended Properties='Excel 12.0; HDR=Yes'" .Open End With Set rs = New ADODB.Recordset mySQL = Replace("select distinct 氏名 from [Sheet1$] where 氏名 like 'key%';", "key", key) rs.Open mySQL, cn, adOpenDynamic '改行をvbCrやvbLfで行っても動く(Aの文字数調整不要となる)が、変にちらつく getUniqueList = rs.GetString(adClipString, , , vbCrLf) rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Function

satoron666
質問者

お礼

回答ありがとうございます! 参考に頑張ります^^

関連するQ&A

  • ユーザーフォームに入力したデータとリストを照合

    お世話になります。 A列に番号、B列に名字、C列に名前が入力されています(500近いデータがあり、データ量は増減あり) 例 A列    B列   C列  1     阿藤   海 2     加藤    山 3 木村   一  4     齋藤   十三 5     佐藤   まさる ・ ・ ・ 最終行  渡辺   慎吾 ユーザーフォームを使い、名字と名前(2つのテキストボックスに別々に)を入力すると、リストからその人が何番なのか(A列の番号)を教えてくれるようにしたいと思っています。  そういったことは可能でしょうか? よろしくお願いいたします。

  • VBA あるフォームのあるテキストボックスへ飛びたい

    教えてください エクセルのVBAで簡単な1問1答形式のプログラムを作っています フォームにある「次の問」を押したときに そのフォーム上に解答用のテキストボックスに 自動的に行く方法を教えてください 今は、「次の問」を押して マウスでそのテキストボックスをさらにクリックして 解答を入力するという状態です 上記の「マウスでテキストボックスをさらにクリックして」 という部分をなくしたいのです どうぞよろしくお願いします

  • VBAユーザーフォーム内のテキストボックスで検索

    http://oshiete.homes.jp/qa3451770.html こちらで質問した者なのですが (benelli様ありがとうございました) VBAでユーザーフォームでの検索を作成し このユーザーフォーム内にテキストボックスを作成して そのテキストボックスに入力した数字を検索できるようにしたいです。 よろしくお願い致します。

  • Access 選択クエリでAND検索

    現在、フォーム1にはリストボックスが3つあり、それぞれ食べ物の区分に分かれており、それぞれのリストボックスに食べ物の種類が表示されています。 区分は、麺類、肉系、ご飯系と分かれており、 それぞれの、ラーメン、冷やし中華、焼き肉、しゃぶしゃぶ、カツどん、カレーライス等と入力されています。 そして、それぞれのリストボックスで選択した項目は、[表示]ボタンを押すことでテーブル1に値が保存されるようになっています。 そして、現在、テーブル1には、下記のように、食べ物の種類が入力されています。 テーブル1 ---------- 焼き肉 ---------- ラーメン ---------- カレーライス ---------- そして、別のテーブル2には下記のように、マスターテーブルとしてそれぞれの名前と好きな食べ物の種類が入力されています。 佐藤|焼き肉|カレーライス 鈴木|ラーメン|カレーライス 田中|焼き肉|ラーメン|カレーライス (構造) 名前ID テキスト型 FoodID 数値型 (実データ) NameID FoodID 佐藤  1 佐藤  3 鈴木  2 鈴木  3 田中  1 田中  2 田中  3 上記のテーブル1とテーブル2を比較し、選択クエリで抽出させると、焼き肉、ラーメン、カレーライスを含む社員を抽出するため、佐藤、鈴木、田中の全員が抽出されてしまいます。 これを、焼き肉、ラーメン、カレーライスの3つすべてを好きな人を抽出させたいと思っています。 (結果は、田中となるようにしたいです。) ちょっと分かりづらいかもしれませんが、 上記のようにすべてを含む人を抽出させるにはどのようにしたらよいでしょうか? 宜しくお願いします。

  • Dlookupで結果が表示されたりされなかったりする

    いつもお世話になっております Access2007を最近使い始め、以下のようなことをしようとしております。 フォームを作成して、IDという名前のついたリストボックス内にテーブルのデータが2列分表示されるようにしました。 <テーブル> ID 名前 詳細 1 山田 東京都 2 佐藤 神奈川県 3 田中 千葉県 その後、同じフォーム上にテキストボックスを作成して リストボックスで選択したデータの詳細部分が表示されるように テキストボックス内に以下の式を入れました。 =DLookUp("[詳細] ","テーブル","[ID]= " & [Forms]![フォーム]![ID]) すると、テキストボックス内に結果が表示される行とされない行があります。 式のどこかが悪いと思うのですが、どこが悪いのか分かりません。 お手数ですが、ご教示願えればと思っております。 足りない情報がありましたら提示いたしますのでお申し付けください。 よろしくお願いいたします。

  • EXCELで入金処理を!(出直してみました)

    受注No. - 枝番 現場名  入金日 A12300 - 01 佐藤様  07/05/05 A12500 - 01 田中様       A12300 - 02 佐藤様       D14600 - 01 木村様  07/05/03 A14700 - 01 松本様         (excelワークシート) 以上のようなデータベースから No.がA12300かつ枝番が02を抽出し、"佐藤様"を呼び出す方法を教えてください。このデータベースは次々と追加されていきます。 excelで作ってます。No.(No)と枝番(eda)をそれぞれユーザーフォームのテキストボックスに入力し検索ボタン(Sarch)を押してサーチし、抽出された値をユーザーフォームのラベル(genba)に表示し、また、入金日(Hiduke)をテキストボックスに入力して登録ボタン(Touroku)を押すと入力された日付がワークシートの該当するセルに反映されるようにしたいのですが。 説明が下手ですみません。 自分なりに頑張って書きましたので宜しくお願いします。

  • エクセル、フォームのテキストボックスから検索

    あるフォルダに、CSVファイルが沢山あります。例 23148662.CSV そこで、フォームに配置したテキストボックスに、「23148662」と入力し 登録ボタンを押せば、該当のCSVファイルがシートに取り込まれるようにするには どうすればよいでしょうか? 有識者のみなさん、どうぞよろしくお願いいたします。

  • Excel VBA テキストボックスを検索

    テキストボックス3に数値を入力し ExcelのA列にあるか検索をかける。 ある場合は、B列の同じ行に 「みーつけた!」と入力。 その設定で組んでみたのですが、 テキストボックス3にデータを6桁入力しようとすると 6桁目にオーバーフローエラーが出ます。 このプログラムの何処がおかしいのでしょうか? Private Sub TextBox3_Change() Dim Number As Integer If TextBox3.Value <> "" Then '空じゃない場合 Number = TextBox3.Value Call 検索(Number) MsgBox TextBox3.Value End If End Sub Sub 検索(ByVal Number As Variant) Dim FoundCell As Range Set FoundCell = Range("A:A").Cells.Find(What:=Number, lookat:=xlPart) If FoundCell Is Nothing Then Else FoundCell.Activate Range("O" & ActiveCell.Row).Value = "みーつけた!" End If End Sub

  • VBA 非連結テキストボックスからの検索

    検索用フォームのテキストボックスからの検索についてご教授ください。 OS:Windows7Pro(32Bit) Ver:Access2010 DB:MySQL5.6 Windows版 ◎検索フォームの非連結テキストボックス txt顧客ID txt顧客カナ(先頭一致) 上記いずれかで、検索したい場合のSQL文の書き方。 ソース Private Sub cmd検索_Click() '顧客情報検索 'Mysql接続変数定義 Dim con As New ADODB.Connection Dim rs As ADODB.Recordset Dim stSQL As String 'DB接続 con.Open "Driver={mySQL ODBC 5.3 Unicode Driver}; Server=localhost; Database=jinq; Uid=jinq_a; Pwd=jinqadmin; " On Error GoTo Err 'SQL文 stSQL = "SELECT * FROM t_kokyaku" stSQL = stSQL & " WHERE(CusID =" & Me!txt顧客ID & ")" stSQL = stSQL & " OR(kana Like ’" & Me!txtお客様カナ & "'%);" Debug.Print "SQL: [" & stSQL & "]" 'SQL文実行&レコードセット代入 Set rs = con.Execute(stSQL) 上記のプロジージャーを実行した結果、当然ですが、エラーとなります。 stSQL:SELECT * FROM t_kokyaku WHERE(CusID =) or(Kana Like 'txt顧客カナ%'); [MySQL][ODBC 5.3(w) Driver][mysqld-5.6.22-enterprise-commercial-advanced-log]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') OR(kana Like 'txt顧客カナ%')' at line 1 複数のテキストボックスの値で検索する場合、どういった書き方をすればよいのでしょうか? 最終的には、顧客ID、顧客名、顧客カナ、電話番号でいずれかの条件で検索できればと考えています。 アドバイス頂けましたら、幸いです。

    • ベストアンサー
    • MySQL
  • フォームのテキストボックスで・・。

    数字を入力し次のテキストボックスに移るときに自動的に「:」をつけた形にしてaccess上に記憶させるというものを作ってます。たとえばフォームのテキストで「1300」といれたら次のテキストボックスに移るときに自動的に「13:00」とテキストボックスに収められそれをaccess上に残すという形です。うまくいかずに困ってまして大変説明が曖昧ですがどなたか回答くださいますようお願いします。

専門家に質問してみよう