プロが教える店舗&オフィスのセキュリティ対策術

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列(会社名)の内容で検索する予定です。
そして同じ会社でも部署が違えば、別のコードを採用している為、
検索結果が複数ある場合があります。


注文が多くて申し訳ありませんが、よろしくお願いします。

A 回答 (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イベントコードも必要になります。
    • good
    • 0

類似の事をされた方がいらっしゃいますので、ご参考にどうぞ。


テキストボックスの入力確定はチェンジイベントを用いず、ご質問にある様にボタンを用いる方が良いでしょう。
http://okwave.jp/qa/q7309041.html

ご自分の要件に合わせてアレンジしたコードをご提示の上、不明点を御質問いただけると回答もつきやすいと存じます。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!