こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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と何かほかの関数を組み合わせることになるかと思いますが。。)単価を検索することはできますでしょうか。
日付は開始日と終了日は別々のセルに入っています。

よろしくご教示お願いいたします。

投稿日時 - 2008-11-29 08:29:24

QNo.4515592

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

少しだけ変形すれば何とかいけそうです
ただし配列数式を使用しますので、配列数式がわからなければ、エクセルのヘルプや、ネットで調べてみてください。

まず、表を下記のように変形します。
(A1セルを左上として)
販売先製品コード開始日単価
AAAF12342008/11/1$1,000
BBBF12342008/11/1$1,500
AAAF12402008/11/1$2,000
BBBF12402008/11/8$3,000
AAAF12342008/11/16$900
BBBF12342008/11/16$1,100
BBBF12402008/11/16$3,300
AAAF12402008/11/20$2,200

ポイントは、開始日を単価の左に持ってきて昇順に並べ替えてください。
終了日はありませんが、考え方としては、次の単価の始まる前日までとしています。

検索データを引っ張ってくるセルですが
仮に下記のセルを使用します。
(F1セルを左上として)
販売先製品コード日付単価
BBBF124011月17日

F2セルには検索する販売先名
G2セルには検索する製品コード
H2セルには検索する日付
を入力し
I2セルに検索した単価を表示させる式を入れます。

I2セルに下記の式を入力し
=VLOOKUP(H2,IF(IF(A2:A9=F2,B2:B9,"")=G2,C2:D9,""),2)
[Ctrl]+[Shift]+[Enter]キー押下で配列数式として確定します。

投稿日時 - 2008-11-29 22:42:22

ANo.4

こういうのは関数でやろうというのは得策でない。
関数やVLOOKUP関数も本来計算用のものだと思う。True型など数値を決めるために設けられていると思われる。FALSE型も最初の1つしか見つけないし。
VLOOKUPは1つ(1列に有るということ)の検索データしか検索できないので、無理して3列のデータを1つの作業列にまとめないといけない。まとめるのも本当は、単に&でくっつけるのではなく、定桁で結合するべきである。
ーー
やる手はVBAか下記しかない。
データーフィルター
フィルタオプションの設定、をマクロの記録を取り、ボタンのクリックをキッカケに実行するのがよい。
そこまで(マクロまで)行かず、フィルタオプションの設定をつかうのもよい。
見出しと条件を入れるセル(*下記で参照)が必要だが、目立たないところに設定する手も有る。
そして自分には都合の良いセルに条件の値を入れて、=A1などを*のセルに入れて、こちらのセルに飛ばしてくる手も有る。

投稿日時 - 2008-11-29 12:20:10

ANo.3

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)

投稿日時 - 2008-11-29 09:04:36

   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)

投稿日時 - 2008-11-29 09:04:18

ANo.1

=D2&A2&B2 という列をF列に作り、下へオートフィル
F列をA列の前に切り貼りすればVLOOKUPが使えます
VLOOKUPでなくていいなら、A列の前に移動せずにINDEX、MATCH関数を使ってください。

投稿日時 - 2008-11-29 08:49:53

補足

早速の回答ありがごうございました。
開始日、販売先、製品コードを組み合わせ、ユニークなコードをつくるということがポイントですよね?

早速試してみましたが、vlookup側で仮に誤った、もしくはテーブルに存在しない製品コードや販売先でも単価を引っ張ってきます。Range_Lookupはtureにしています。存在しないものや誤ったもので検索しようとしたときはエラーを表示したいのですが。。。どうしたらいいか教えてください。よろしくお願いいたします。

投稿日時 - 2008-11-29 09:05:52

あなたにオススメの質問