• 締切済み

VBA 検索ボックスの作成について

VBA初心者です。 エクセルで、ある列(仮にA列)のみに限定し、ショートカットキーを押した時に、 別シートにあるデータベースから検索、 検索結果をショートカットキーを押したセルに反映させるマクロを組みたいと思っています。 具体的には、 シート1→(請求明細用シート) A列→コード B列→企業名 C列→部署名 D列→請求内容 E列→金額 etc シート2→データベース(全コード一覧) A列→コード B列→企業名 C列→部署名、のみが記載。 検索ボックスは、 ユーザーフォームにテキストボックスひとつ、ボタン1つ、リストボックス1つ。 テキストボックスに文字を入力し、ボタン(検索用)を押すと、 リストボックスにシート2上のAーC列の結果が表示され(検索条件:部分一致)、 検索結果をリストボックス上でダブルクリックすると、 ショートカットキーを押したA列のセル(及びB-C列)に検索結果を出力することができる、 といったプログラムを考えています。 (B-C列への出力はVLOOKUPだけで大丈夫なので、マクロ上で組む必要はないです。 また、テキストボックスで検索する時は、基本的にB列(会社名)の内容で検索する予定です。 そして同じ会社でも部署が違えば、別のコードを採用している為、 検索結果が複数ある場合があります。 注文が多くて申し訳ありませんが、よろしくお願いします。

みんなの回答

  • end-u
  • ベストアンサー率79% (496/625)
回答No.2

どうしてもUserFormを使いたい場合は参考にならないかもしれませんが、 以下は、Excelの基本機能 AutoFilter を使った例です。 こんな感じのが簡単だと思うんですけどね.. 定数ws1とws2の設定は該当シート名に変更しなければいけません。 また、マクロについては共用で、キーは[Shift]+[Enter]キー。 ws1とws2とも ActiveCellがA:C列の範囲内ならマクロが稼働します。 #初回はWindowをDeactivate/Activateが必要です。 #OnKeyでマクロが登録されます。 '標準モジュールに記述 Option Explicit Public Const ws1 = "Sheet1" '請求明細用シートの名前をセット Public Const ws2 = "Sheet2" '全コード一覧の名前をセット '------------------------------------------------- Sub keySet()   Application.OnKey "+~", "test" End Sub '------------------------------------------------- Sub keyReset()   Application.OnKey "+~" End Sub '------------------------------------------------- Sub test()   If Intersect(ActiveCell, Columns("A:C")) Is Nothing Then Exit Sub   Dim x   Select Case ActiveSheet.Name   Case ws1     Call ws2_ShowAll     With Sheets(ws2)       Application.Goto .Range("A1")       x = InputBox("?")       If Len(x) = 0 Then         Sheets(ws1).Activate         Exit Sub       End If       .Range("A1").AutoFilter Field:=2, _                   Criteria1:="=*" & x & "*"     End With   Case ws2     If Len(ActiveCell.Value) > 0 Then       If Not Sheets(ws2).FilterMode Then Exit Sub       x = ActiveCell.EntireRow.Range("A1:C1").Value       Sheets(ws1).Activate       ActiveCell.EntireRow.Range("A1:C1").Value = x       Call ws2_ShowAll     End If   End Select End Sub '------------------------------------------------- Sub ws2_ShowAll()   With Sheets(ws2)     If .AutoFilterMode Then       If .FilterMode Then         .ShowAllData       End If     Else       .Range("A1").CurrentRegion.Resize(, 3).AutoFilter     End If   End With End Sub 'ThisWorkbookモジュールに記述 Option Explicit '------------------------------------------------- Private Sub Workbook_WindowActivate(ByVal Wn As Window)   keySet End Sub '------------------------------------------------- Private Sub Workbook_WindowDeactivate(ByVal Wn As Window)   keyReset End Sub #Sub test でActiveSheet.Nameによる分岐をしてますから、 #他シートでのOnKey解除はしてません。 #場合によってはSheetActivate/SheetDeactivateイベントコードも必要になります。

すると、全ての回答が全文表示されます。
  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.1

類似の事をされた方がいらっしゃいますので、ご参考にどうぞ。 テキストボックスの入力確定はチェンジイベントを用いず、ご質問にある様にボタンを用いる方が良いでしょう。 http://okwave.jp/qa/q7309041.html ご自分の要件に合わせてアレンジしたコードをご提示の上、不明点を御質問いただけると回答もつきやすいと存じます。

すると、全ての回答が全文表示されます。

関連するQ&A