VBA(マクロ)での回答は余計かな?
Sheet1に検索するデータがあるとして、こんな風だとします。
セルの区切りを , カンマで表しています。
日付,車種,部品,番号
4月3日,ムーヴ,タイヤ,BS1
2007/4/3,ムーヴ,タイヤ,TY2
2007/4/3,タント,タイヤ,DL1
2007/4/3,タント,タイヤ,BS2
2007/4/3,エッセ,タイヤ,YH1
2007/4/3,エッセ,タイヤ,YH2
2007/4/4,タント,タイヤ,BS3
4月4日,ムーヴ,タイヤ,DL3
4月5日,ミラ,タイヤ,BS2
4月5日,ミラ,タイヤ,BS1
4月5日,エッセ,タイヤ,DL1
4月5日,タント,タイヤ,TY2
でSheet2が
A,B,C,D
1 日付,車種,部品,番号
として
2行目に検索したいデータを入れるとします。こうなります。
A,B,C,D
1 日付,車種,部品,番号
2 4月3日,タント,タイヤ
名前をつけて一旦保存して下さい。
Alt + F11 を押して VBE のウィンドウに切り替えます
メニューの挿入から標準モジュールを選びます
新しいウィンドウが開きますので下記をコピペ
Sub ListUp()
Dim cnXL As Object
Dim rsXL As Object
Dim strSql As String
Dim wS1 As Worksheet, wS2 As Worksheet
Const adOpenForwardOnly = 0
Set wS1 = Worksheets("sheet1") '検索データのあるシート
Set wS2 = Worksheets("sheet2") '検索作業をするシート
If WorksheetFunction.CountA(wS2.Range("A2:C2")) < 3 Then
MsgBox "検索内容に未記入があります"
Exit Sub
End If
'以前の検索結果をクリア
Range(wS2.Range("A3:D3"), wS2.Range("A3:D3").End(xlDown)).ClearContents
Set cnXL = CreateObject("ADODB.Connection") '←↓ADOで接続するおまじない
With cnXL
.Provider = "MSDASQL"
.ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};" & _
"DBQ=" & ThisWorkbook.FullName & "; ReadOnly=True;"
.Open
End With
Set rsXL = CreateObject("ADODB.Recordset")
strSql = "select 日付,車種,部品,番号 from [" & wS1.Name & "$]" _
& " where 日付 = #" & wS2.Cells(2, 1) & "#" _
& " and 車種 like '%" & wS2.Cells(2, 2) & "%'" _
& " and 部品 like '%" & wS2.Cells(2, 3) & "%'"
'↑車種と部品は部分一致検索なので完全一致なら like を = に、% は削除
rsXL.Open strSql, cnXL, adOpenForwardOnly
wS2.Cells(3, 1).CopyFromRecordset rsXL 'レコードセットをCells(3, 1)を起点にしてコピー
wS1.Range("A:A").NumberFormatLocal = "m""月""d""日"";@" Sheet1 A列の書式を復元
rsXL.Close: Set rsXL = Nothing
cnXL.Close: Set cnXL = Nothing
End Sub
で、Alt + F11 を押して Excel のウィンドウに切り替えます
Alt + F8 を押すと ListUp というのが有りますので、「実行」をクリック
下記のような結果が得られると思います。
日付,車種,部品,番号
2007/4/3,タント,タイヤ ←検索値
2007/4/3,タント,タイヤ,DL1 ←結果
2007/4/3,タント,タイヤ,BS2 ←結果
Sheet2の
A,B,C,D
1 日付,車種,部品,番号
2 4月3日,タント,タイヤ ←日付、車種、部品を変えてAlt + F8 実行で色々お試しを
※提示された例題では、ミ ラ となっていますがミラとスペースを削除しています
おそらく表示上のためかと思いますが
品名の前後や間にスペースがあると期待した結果は得られません。ご注意を。
また、
Sheet1 の 日付が 4月3日 → 2007/4/3 と変わってしまうのを防ぐ手立ては分かりません
wS1.Range("A:A").NumberFormatLocal = "m""月""d""日"";@" で元に戻しています
補足
回答有難うございます。 解説いただいた方法を自分でも試行したのですが、上手くタイヤ番号を表示させられませんでした。 日付セルの表示(標準、数値,文字列)に問題があるのではないかと色々変えてはしていますが、困ったことに、質問の納品ベース表と別に現場用の実際の生産予定表とは1日のズレがあり、(4/3 ムーヴ タイヤ BS1では納品は4月3日なのですが、現場で使われるのは4月4日になるため、日付を-1にして完全一致したいのですが、日付を2007/4/3,4/3,39175のシリアルにしたりしていますが、上手く行きません。納品予定表と現場生産予定表は項目、順序、種類は全く同じなのですが、1日のズレがあるために、手を焼いています。