- 締切済み
MS Excel 日付範囲を条件としたvlookup
以下のようなテーブルがあります。 A列___B列___C列___D列___E列 販売先___製品コード___単価___開始日___終了日 AAA___F1234___$1,000___11/01/2008___11/15/2008 BBB___F1234___$1,500___11/01/2008___11/15/2008 AAA___F1234___$900___11/16/2008___11/29/2008 BBB___F1234___$1,100___11/16/2008___11/29/2008 . . . (セルの区切り目を表す為、"___"を便宜上ここでは使っています。) 実際のテーブルは販売先、製品コードも複数存在します。同じ販売先&製品コードで日付の範囲がオーバーラップすることはありません。 このようなテーブルにおいて、 「11/18/08の販売先AAAのF1234」の単価を引っ張ってきたいとき、Vlookup関数を使って(vlookupと何かほかの関数を組み合わせることになるかと思いますが。。)単価を検索することはできますでしょうか。 日付は開始日と終了日は別々のセルに入っています。 よろしくご教示お願いいたします。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- BrueBreeze
- ベストアンサー率52% (83/159)
少しだけ変形すれば何とかいけそうです ただし配列数式を使用しますので、配列数式がわからなければ、エクセルのヘルプや、ネットで調べてみてください。 まず、表を下記のように変形します。 (A1セルを左上として) 販売先 製品コード 開始日 単価 AAA F1234 2008/11/1 $1,000 BBB F1234 2008/11/1 $1,500 AAA F1240 2008/11/1 $2,000 BBB F1240 2008/11/8 $3,000 AAA F1234 2008/11/16 $900 BBB F1234 2008/11/16 $1,100 BBB F1240 2008/11/16 $3,300 AAA F1240 2008/11/20 $2,200 ポイントは、開始日を単価の左に持ってきて昇順に並べ替えてください。 終了日はありませんが、考え方としては、次の単価の始まる前日までとしています。 検索データを引っ張ってくるセルですが 仮に下記のセルを使用します。 (F1セルを左上として) 販売先 製品コード 日付 単価 BBB F1240 11月17日 F2セルには検索する販売先名 G2セルには検索する製品コード H2セルには検索する日付 を入力し I2セルに検索した単価を表示させる式を入れます。 I2セルに下記の式を入力し =VLOOKUP(H2,IF(IF(A2:A9=F2,B2:B9,"")=G2,C2:D9,""),2) [Ctrl]+[Shift]+[Enter]キー押下で配列数式として確定します。
- imogasi
- ベストアンサー率27% (4737/17069)
こういうのは関数でやろうというのは得策でない。 関数やVLOOKUP関数も本来計算用のものだと思う。True型など数値を決めるために設けられていると思われる。FALSE型も最初の1つしか見つけないし。 VLOOKUPは1つ(1列に有るということ)の検索データしか検索できないので、無理して3列のデータを1つの作業列にまとめないといけない。まとめるのも本当は、単に&でくっつけるのではなく、定桁で結合するべきである。 ーー やる手はVBAか下記しかない。 データーフィルター フィルタオプションの設定、をマクロの記録を取り、ボタンのクリックをキッカケに実行するのがよい。 そこまで(マクロまで)行かず、フィルタオプションの設定をつかうのもよい。 見出しと条件を入れるセル(*下記で参照)が必要だが、目立たないところに設定する手も有る。 そして自分には都合の良いセルに条件の値を入れて、=A1などを*のセルに入れて、こちらのセルに飛ばしてくる手も有る。
- 某HN クロメート(Chromate)(@CoalTar)
- ベストアンサー率40% (705/1742)
11/18/08は開始日と終了日の間なんですね なので先ほどの回答は無視してください ___A___B___C___D___E 1___販売先___製品コード___単価___開始日___終了日 2___AAA___F1234___$1,000 ___11/01/2008___11/15/2008 3___BBB___F1234___$1,500 ___11/01/2008___11/15/2008 4___AAA___F1234___$900 ___11/16/2008___11/29/2008 5___BBB___F1234___$1,100 ___11/16/2008___11/29/2008 6 7___販売先___製品コード___開始日___終了日 8___AAA___F1234___<=11/18/2008___>=11/18/2008 9 10___対象の日付___11/18/2008 11___単価___900 C8セルに="<="&B10 D8セルに=">="&B10 B10セルに =DGET($A$1:$E$5,A10,$A$7:$C$8)
G H I J 1 販売日 販売先 製品コード 単価 2 11/18/08 AAA F1234 $900 3 11/03/08 BBB F1234 $1,500 4 J2: =SUMPRODUCT((D$2:D$100<=G2)*(E$2:E$100>=G2)*(A$2:A$100=H2)*(B$2:B$100=I2),C$2:C$100)
- 某HN クロメート(Chromate)(@CoalTar)
- ベストアンサー率40% (705/1742)
=D2&A2&B2 という列をF列に作り、下へオートフィル F列をA列の前に切り貼りすればVLOOKUPが使えます VLOOKUPでなくていいなら、A列の前に移動せずにINDEX、MATCH関数を使ってください。
補足
早速の回答ありがごうございました。 開始日、販売先、製品コードを組み合わせ、ユニークなコードをつくるということがポイントですよね? 早速試してみましたが、vlookup側で仮に誤った、もしくはテーブルに存在しない製品コードや販売先でも単価を引っ張ってきます。Range_Lookupはtureにしています。存在しないものや誤ったもので検索しようとしたときはエラーを表示したいのですが。。。どうしたらいいか教えてください。よろしくお願いいたします。