• ベストアンサー

検索画面の作り方

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

  • feilu
  • お礼率12% (11/87)

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

  • ベストアンサー
  • 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/17068)
回答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

  • Excel VBA 条件検索について

    ExcelVBAで 「データ検索後リスト表示をして、そのリストから該当するシートを選べば表示される」 というユーザーフォームを作成したいのですが、やり方がよく解りません。どなたか教えて下さい。 具体的には 「コマンドボタンが押された時に、ユーザーフォーム内のテキストボックスに入力された値(名称、日付等)と、複数のシート内のセルの値(名称、日付等)を比較して、一致(全一致、一部一致)した場合、ユーザーフォーム内のリストボックスに表示させる」 というものと 「リストボックスに表示されたものの中から見たいシートを選択すると、そのシートを表示する」 というものです。 リストの表示形式は シート名   名称  日付等 Sheet1    りんご  2013.01.01 Sheet2    りんご  2013.01.02 という具合にしたいと思っています。 ちなみに複数のシートと言いましたが、マスターシートを作りコピーして使用しますので、同一形式のものになります。 以上になります。 色々やってみましたが、うまくいきませんので、どなたか解る方は教えて下さい。 よろしくお願いします。

  • Excelユーザーフォームでのデータ検索

    初心者の質問で申し訳ございません。 ユーザーフォームを利用して検索ボタンを作ろうと考えています。 ユーザーフォームでテキストボックスを2個と コマンドボタン1個を作成し、 テキストボックス1に検索したい氏名を入力して コマンドボタンを押すと、 ワークシート(ワークシート名、データ)に作成されたデータのD列から 一致するものを検索し、 一致したデータのA列にある「番号」をテキストボックス2、 表示する。 というマクロが書けず困っています。 よろしくお願いします。

  • エクセルのVBAマクロで検索と結果表示(抽出)

    エクセルのVBAマクロで検索と結果表示(抽出)を行いたいです。 業務で使用している膨大なリストデータから、特定のキーワードで情報の絞り込みを行いたいのですが、上手くマクロが組めません。 機能としては、シート1で特定のキーワード(テキストボックスに)を入力し検索ボタンを押下すると、 シート2のリストデータから検索に引っかかったセルの"行"を、シート1にリストアップ(貼り付け)していくようなマクロを作りたいのです。 シート2にはB列~AH列xn行のリストデータがあり、シート2のK列のセル内から「シート1のテキストボックスで入力したキーワードを含む」検索を行い、 HITした行をシート1のA9の行から結果として表示を行いたいんです。 簡単に言えばオートフィルタ機能の部分一致版を作りたいのですが・・・。 (オートフィルタでは完全一致でしか抽出が出来ないので) そして、検索ボタンを押下すると前回結果はクリアしたいです。 ネット上のサンプル等も参考にしながらやってみたのですが上手く行きません。。。 どなたか上記のマクロ文をご教授願えないでしょうか。 必要な情報(シート2の特定の列)のみ表示させたいとも思いましたが、むずかしくて断念・・・。 もし可能でしたらこちらもお願い致します。 よろしくお願いいたします。

  • セルの値をテキストボックスに表示したい

    excelマクロ初心者です。教えてください。 <やりたいこと> 選択したセルと同じ行のうち特定の列のセルの値をフォームの テキストボックスに表示し、そのフォーム上で表示したテキスト ボックスの値をコマンドボタンでコピーしたい。 また、もうひとうつのコマンドボタンをおすと選択したセルと 同じ行の別のセルに"完了"と入力できるようにしたい。

  • Excelユーザーフォームでのデータ検索

    現在Excelマクロの勉強中ですが、ユーザーフォームでテキストボックスを4個とコマンドボタン1個を作成し、テキストボックス1にコードを入力してコマンドボタンを押すと、ワークシート(ワークシート名、住所録)に作成されたデータのA列からコードを検索(データは2行目から始まる)し、一致したデータのB列にある「名前」をテキストボックス2、C列の「住所」をテキストボックス3、D列の「電話番号」をテキストボックス4に表示する。 というマクロが書けず困っています。 わかる方教えてください。

  • Access フォームからの検索について

    初歩的な質問で申し訳ありませんが教えて下さい。 Access2000を使っています。 フォームに作ったテキストボックスに、入力した値又は文字と、特定のフィールドと比較し一致した場合にそのレコードをフォームに表示する方法はないでしょうか? いろいろと、web上のQ&Aなども見ましたが、思った動作をしませでした。 考えているのは、   ・テキストボックスにある値を入力し、『Enter』を押すとテキストボックスに入力した値と特定のフィールドと一致したレコードをフォームに表示 ・一致しない場合はメッセージボックスで一致しない旨を表示 です。 ・完全一致のみ表示 VBAでの動作を考えていますが、合わせて他の方法があれば教示頂ければと思います。 以上、お手数をお掛け致しますがよろしくお願い致します。

  • エクセル2007VBAで検索するコードを知りたい。

    エクセル2007(Excel2007)のVBAで【検索と置換】と同等の機能をもった検索アプリケーションを作りたいのですが、 そのコード(コマンドボタンを実行したときのコード)を教えていただけないでしょうか。 (おそらくですが、リストボックスのコードも必要だと思います。) 正しくは、【検索と置換】から【置換】機能を無くしたものとイメージしていただきたいです。 ●設置するもの ユーザーフォーム(UserForm1) テキストボックス(TextBox1) コマンドボタン(CommandButton1) リストボックス(ListBox1) ●仕様 ユーザーフォームのテキストボックスに入力してコマンドボタンを押すと、検索対象を見つけ、 リストボックスにその対象一覧を行ごとに表示するものになります。 ●検索するときの条件 (1)大文字と小文字を区別しない (2)半角と全角を区別しない (3)部分一致すれば(一部でも一致すれば)検索対象にする (4)今、開いているワークシート上の「全てのセルが検索対象(列や行を指定しない)」 ※検索されたセルの存在する行ごとに、ユーザーフォームのリストボックスに(1行ずつ)表示したいです。 そして、リストボックスに表示されたデータのうち、どれか1つを選ぶと、その選択対象の行の【D列】にアクティブセルを移動するようにしたいです(画面もアクティブセルが見える位置にスクロールします)。 ●リストボックスに(1行ごとに)表示するもの● ↓↓↓ (左から)I列の値、D列の値、O列の値、Q列の値(→4列の値になります) ※リストボックスにQ列の値が表示された場合のみ(Q列に何かしらのデータがある場合のみ)、 リストボックス上の【その行の(I列の値、D列の値、O列の値、Q列の値の)文字すべてを赤色】にして表示していただきたいです。 分かる方がいましたらよろしくお願いいたします。

  • エクセルマクロによる顧客リスト検索

     エクセルで作成している顧客リストの検索をするマクロを作成したいと考えています。具体的には、ユーザーフォームに顧客名・勤務先・役職のテキストボックスを作り、顧客名を入力してコマンドボタンを押すと勤務先などがテキストボックスに表示されるものを作ろうとしています。  ユーザーフォームにテキストボックスやコマンドボタンを作る方法はわかりましたが、それらを顧客リストと結び付ける方法がわかりません。ネットで「エクセルマクロ講座」を探してみましたが、こうした事例にあてはまる講座もみつかりませんでした。  どなたかマクロに詳しい方は教えていただけないでしょうか。あるは上記の事例にあてはまるエクセルマクロの講座がWeb上にあれば、それを教えていただけないでしょうか。

  • EXCEL ユーザーフォームを使ったマクロ

    データの登録をするのにユーザーフォームを使おうと思うのですが、なかなかうまくいきません。教えてください。 ユーザーフォームにはコンボボックス、テキストボックス、コマンドボタンが貼り付けてあります。(コンボボックスのリストには呼び出したいシートの名前が入っています) コンボボックスのリストの中から呼び出したいシートを選択し、テキストボックスに入力した内容を、コマンドボタンを押すことで選択されたシート上の、あるセルに登録したいのですがどうすればよいでしょうか?

  • エクセルVBAマクロで、一度テキストポックスに入力した値がコピーされて

    エクセルVBAマクロで、一度テキストポックスに入力した値がコピーされてしまう VBAマクロ初心者です。 エクセルVBAマクロで、以下の様なプログラムを作成し計算させていますが、 一度入力した値がテキストポックスに残ってしまい、なんとかならないかなと 思っています。 (1)複数シートにそれぞれコマンドボタンを配置し、クリックすると同じユーザー フォームが立ち上がるようになっています。 (2)そのユーザーフォーム内に、テキストボックスが複数あり、それぞれ値を入力 して計算スタートさせると、ワークシートの1行目から数千行目まで計算して 各行に計算結果を表示します。 (計算は、既に各行に入力済みのデータとこのテキストボックスの値を元に算出されます) (3)次に、別のシートでコマンドボタンをクリックし、ユーザーフォームを立ち上げると、 前のシートで入力した値がそのまま各テキストボックスに入ってしまいます。 (これは、必ず起こる訳ではなく、時々起こるのですが、起こる場合は、コマンドボタン をクリックしてからユーザーフォームが立ち上がるまでの時間が若干短い感じがします) ※一度、上記の計算をさせるとテキストボックスの値がそのシートの特定のセルに入り、 次回ユーザーフォームを立ち上げた際に、テキストボックスに入るようになっています。 (Private Sub UserForm Initialize を使っています) パソコンの構造を、私はよく知らないのですが、おそらく、一度テキストボックスに値 を入力して計算させると、どこかのメモリにそれが残っていて、次にユーザーフォーム を立ち上げた際にそれが入ってしまうのかな、と思っています。 (ただし、もし前の値が入ってしまったとしても、一度そのユーザーフォームを消して から、再度立ち上げると、正常な値(そのシートの特定のセルを参照)が必ず入ります) 何か、プログラムにより、このメモリ?を消す?、あるいはうまく解決する方法など 考えられませんでしょうか? もし、詳しい方がおられましたら、御教示いただけませんでしょうか。 よろしくお願いいたします。

専門家に質問してみよう