- ベストアンサー
VLOOKUP もしくは違う方法で検索
今、会社で車の年式表を作っています。 VLOOKUPで検索できるように、車の号機を入れて、年式を出すようにしています。<=VLOOKUP(B3,B10:C65536,2,0)という関数で> でも、データの量が多く、シートのサイズ65,536行では足りなくなってしまいました。 VLOOKUP関数でも、他のやり方でも結構ですので、 良い方法を教えて戴けますか? 宜しくお願い致します。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 次のようにしても出来ると思いますよ。 65536を超える分は、新しいシート、例えば、Sheet2のB10:C65536に入れるとした場合 =IF(ISERROR(VLOOKUP(B3,B10:C65536,2,0)),VLOOKUP(B3,Sheet2!B10:C65536,2,0),VLOOKUP(B3,B10:C35536,2,0)) 現在のシートになかった場合はエラーになりますので、それを利用して、エラーであれば、Sheet2の表を検索するようにすれば出来るはずです。 また、超えた分を新しいシートに作るのが拙ければ 同じシートの未使用の部分に、超えた分の表を作る方法もありですね。 例えば同じシートの、E10:F65536に超えた分の表を作成した場合。 =IF(ISERROR(VLOOKUP(B3,B10:C65536,2,0)),VLOOKUP(B3,E10:F65536,2,0),VLOOKUP(B3,B10:C35536,2,0)) 以上です。
その他の回答 (6)
s_husky です。 ・Access で見積書データを管理しています。 ・ユーザーがカスタマイズできるようにExcel でも表示できます。 ・以下は、Access から Excel へ取り込むコードです。 dbsCurrent.OpenRecordset("見積書印刷データ") "見積書印刷データ"---> Select * from XXXX Where Kubun1="XXX" And Kubun2="XXX" と改造すべきかと。 Public Sub Import(ByVal strMDBName As String) On Error GoTo Import_ERR Dim isClick As Boolean Dim I As Integer Dim strFields(14) As String Dim strDatabase As String Dim dbsCurrent As dao.Database Dim rstEstimate As dao.Recordset If Not isClick Then isClick = True Set dbsCurrent = DBEngine.Workspaces(0).OpenDatabase(strMDBName) Set rstEstimate = dbsCurrent.OpenRecordset("見積書印刷データ") For I = 1 To 24 Worksheets(1).Cells(I, 1) = rstEstimate.Fields("品名_" & Format(I, "00")) Worksheets(1).Cells(I, 2) = rstEstimate.Fields("規格_" & Format(I, "00")) Worksheets(1).Cells(I, 3) = rstEstimate.Fields("数量_" & Format(I, "00")) Worksheets(1).Cells(I, 4) = rstEstimate.Fields("単位_" & Format(I, "00")) Worksheets(1).Cells(I, 5) = rstEstimate.Fields("単価_" & Format(I, "00")) Worksheets(1).Cells(I, 6) = rstEstimate.Fields("金額_" & Format(I, "00")) Next I ' ヘッダー部見出し strFields(1) = "見積書管理番号" strFields(2) = "日付" strFields(3) = "住所" strFields(4) = "ビル等" strFields(5) = "会社名" strFields(6) = "店名" strFields(7) = "電話等" strFields(8) = "責任者名" strFields(9) = "件名" strFields(10) = "宛先名" strFields(11) = "受渡期日" strFields(12) = "受渡場所" strFields(13) = "取引方法" strFields(14) = "有効期限" For I = 1 To 14 Worksheets(2).Cells(I, 1) = strFields(I) Worksheets(2).Cells(I, 2) = rstEstimate.Fields(strFields(I)) Next I isClick = False End If Import_END: On Error Resume Next rstEstimate.Close dbsCurrent.Close Exit Sub Import_ERR: MsgBox Err.Description Resume Import_END End Sub
- mshr1962
- ベストアンサー率39% (7417/18945)
エクセルで出来なくもありませんが#1の方の言うとおりでアクセスなどのデータベースへの移行をお勧めします。 現状のエクセルでなら 号機 年式 号機 年式 と複数列に展開して置く =VLOOKUP(B3,IF(COUNTIF(B10:B60000,B3),B10:C60000,D10:E60000),2,0)
お礼
ありがとうございます。 やはり、アクセスでやる方がいいですよね・・・。 アクセスは今勉強中で、まだまだ分からないことがたくさんあるんです。なので、しばらくはエクセルで対応していこうと思っています。
- mu2011
- ベストアンサー率38% (1910/4994)
例えば、車の号機内容が不明ですが、車種-枝番の様に関連付けできるのであれば、表を2次元にする事でよりコンパクトになると思いますが如何でしょうか。 検索は、OFFSET関数とMATCH関数の組み合わせで以下の通りです。 (例)仮に行を車種、列を枝番とした表でその交点が年式とした場合、=OFFSET(基準セル,MATCH(車種,基準セル:最終行,FALSE)-1,MATCH(枝番,基準セル:最終列,FALSE)-1))で取り出しが可能です。 因みに基準セルは表の先頭行の最左セルを指します。
こういう場合、[メーカー][車種][排気量]などの管理区分データを入力し、区分によってデータを呼び出すと扱うデータが限定されてくると思います。 例えば、[メーカー]が4社、[車種]と[排気量]が3区分で、平均的にデータが登録されていれば、該当するデータは1820程度ということになります。 Excelは、一度しか使ったことがありません。 ですから、私が、示す改善要領は、非常に、初歩的なものでExcelの機能を利用したもでではありません。 1、一度、全体のデータを区分けする方法を考える。 2、区分に基づいてデータを区分数だけのファイルに出力する。 3、Excel では、指定された区分のデータを呼び込んで表示し編集する。 Access等へ転送し、Excelで抽出表示するというのが一般的と思いますが、その前段としての提案です。 ※ファイル出力、ファイル入力が至難であれば、区分毎の別シートをクリエイトし、区分毎に検索してもOKかと!
補足
ありがとうございます。 今、アクセスは超初心者で、本当に勉強不足なんです。でも、よろしければ、"Accessへ転送し、Excelで抽出表示する"というのを、もう少し詳しく教えて戴けますか?Accessへ転送するやり方だけは分かります。 宜しくお願い致します。
- sou999
- ベストアンサー率21% (15/69)
あまりいい方法ではないかもですが、号機・年式を別シート2枚にしてVlookupを二行作って幅0にしてもう一行IFで拾っていくというのはどうでしょうか?処理重そうですけど
ACCESSへ移行された方がよいかと思いますよ。
お礼
ありがとうございます! 教えて戴いた関数でちゃんと出来たので、これで 当分はやっていきます。