- ベストアンサー
エクセルで入力途中でも抽出できますか
シート1に名簿(A:氏名、B:ふりがな、C:性別、…)を入力しておき、シート2でふりがなを入力すると、該当する行が抽出できるようにしたいのですが…。 たとえば… シート1で「日本太郎(にほんたろう)」という人が入力されている名簿があるとして、シート2で検索する際、「に」の段階でふりがなの頭に「に」がついている人が表示(リストボックスのように)され、その中ですぐに発見できれば該当項目をマウス等で選択して抽出。数が多く、すぐに発見できないようであれば、続けて「ほ」と入力(表示上は「にほ」)して、同じように頭に「にほ」がついている人を表示(リストボックスのように)、その中ですぐに発見できれば該当項目をマウス等で選択し抽出。といったように、どんどん該当するものを絞っていき、抽出する方法です。中には、同じ名前の方もいるので、最後まで入力した後、氏名の漢字等で選択するようになりますが、こんなことはできますか。 ちなみにエクセルは2002です。わかりにくい説明で申し訳ありませんが、よろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
(1)私の場合Sheet6にテキストボックス1つを貼りつけ、あとリストボックスを1つ貼りつけました。(メニューの余白を右クリックして、出てくるツールバーの「コントロールツールボックス」からテキストボックスリストボックスを直接ワークシートに貼りつけました。) (2)サンプルデータ A1:B13に 近藤 こんどう 今野 こんの 岡嶋 おかしま 岡野 おかの 金沢 かなざわ 金井 かない 熊野 くまの 熊谷 くまがい 来栖 くるす 来島 くるしま 国元 くにもと 小杉 こすぎ 小杉谷 こすぎや を入れました。順序はどうでも良いです。 ------ (3)ALTキーを押しながらF11キーを押す。 するとVBE画面になります。 左のフレームのVBAProjectのSheet6をクリックする。 右のフレームの「(General)」をクリックして TextBox1をクリックする。 次に(Declarations)をクリックして、Changeをクリック。 Private Sub TextBox1_Change() v = TextBox1.Text Worksheets("sheet6").ListBox1.Clear For i = 1 To 14 c = Worksheets("sheet6").Cells(i, "B") If v = Left(c, Len(v)) Then Worksheets("sheet6").ListBox1.AddItem Cells(i, "A") End If Next i End Sub の最初と最後のが出ますので、上記コードの中間部分(本体)行をコピペする。 右のフレームの「(General)」をクリックして Listbox1をクリック、(Declarations)を クリックして、Clickをクリック。 Private Sub ListBox1_Click() ActiveCell = ListBox1.List(ListBox1.ListIndex) End Sub の最初と最後行が出ますので、中間行をコピペする。 ----- (操作) 実行モードにして、テキストボックスに「こ」と入れると、 近藤 今野 小杉 小杉谷 がでます。 「こす」になると 小杉 小杉谷に減ります。どこかの適当な段階で、 セットしたいセルをクリックし、リストボックスの中の名前をクリックして選択してください。 クリックした「セル」に、漢字名がセット出来ます。 #2のご回答とCangeイベントを使う骨子は同じですが、実例の説明とリストボックスの説明を加え、Findメソッドを使わず、ForNextで全行毎回総なめして聞いています。初歩的ですが、判りやすくまた、1000行ぐらいなら、レスポンスが遅くて、いやになると言うこともないでしょう。
その他の回答 (2)
- ja7awu
- ベストアンサー率62% (292/464)
シート2の「セル」に抽出する先頭部分の文字列を入れるとすぐ抽出するように することは出来ないと思います。 入力したら、コマンドボタンを押すなど、イベントにより処理する必要があります。 そのことから、ユーザーフォームに配置したテキストボックスのChangeイベントを 使用すれば、1文字入力する毎にそれだけで絞り込んで抽出していくことができます。 (Changeイベントは、1字毎に発生します。) 要望通りのことを実現するためには、VBAが必須です。 参考までに主要部分だけですが、コードを書いてみましたので、宜しかったらテスト してみてください。 フォームに「TextBox1」と「ListBox1」が配置されているとして、「TextBox1」の Changeイベントに下記のコードを記述します。 これでTextBox1に文字を入れる毎に絞られて、リストボックスにSheet1のB列から 該当する氏名(ふりがな)が、リストアップされます。 (このあと、どうしたいのか解りませんので、そこまでの部分のコードです。 最初、「シート1」にフィルタを次々掛けるのかな? と思ったのですが、シート2で条件入力 していますので、そうでもなさそうです。 フィルタの方が、簡単なんですが・・・) Private Sub TextBox1_Change() Dim Rng As Range Dim First As String ListBox1.Clear If Len(Trim(Me.TextBox1.Text)) = 0 Then Exit Sub With Worksheets("Sheet1") ' <--- 住所録のシート名 B列が「ふりがな」 Set Rng = .Range("B:B").Find(Me.TextBox1.Text, lookat:=xlPart) If Not Rng Is Nothing Then First = Rng.Address Do If Left(Rng.Value, Len(Me.TextBox1.Text)) = _ Me.TextBox1.Text Then ListBox1.AddItem Rng.Value End If Set Rng = .Range("B:B").FindNext(Rng) Loop Until Rng Is Nothing Or Rng.Address = First End If End With End Sub
お礼
ご回答ありがとうございます。 VBAは超初心者で、解読には時間がかかりそうですが、お教えいただいたことでやってみたいと思います。 やっぱり、関数では無理ですよね…(汗)
- tatata716
- ベストアンサー率18% (63/344)
「日本太郎」と入力してその人のデータ(性別等)を 抽出するのか可能かと思います。 そのリストボックスというかプルダウンメニューというか・・ アクセスで作った方が簡単かな、と思います。 できるかできないか判断できない私がすいません。 回答になってなくてすいません。
お礼
ありがとうございます。早速、やってみたいと思います。