貯めたポイントで交換可能な最高額の商品を調べる

下の表のA列とB列は、交換に必要なポイント数と交換可能な商品の一覧表です。
アホな商品リストだということは承知しています。サンプルだということでお見逃しください。

送信者 OpenOfficeこの画像のファイルは、SKYDRIVEからcalc108.odsをダウンロードしてください。
さて、この表では、D2セルに現在の獲得ポイントを入力すると、そのポイントで獲得可能な商品の内で最高額の商品をE列に表示し、交換したときの消費ポイントをF列に表示します。
さらに、交換後のポイント残が発生する場合、残ポイント数をD列に表示します。残を使用して交換可能な商品があるかどうかを調べて、あれば同様に最高額の商品をE列に表示し、交換したときの消費ポイントをF列に表示します。

獲得可能な商品がなくなるまでこの処理を繰り返し、なくなればE列には空白を返し、以下の行には何も表示されません。
この例の場合は、車検が通る車を6台とほか3台の車に交換可能だということが分かります。

E2セルに入力されている数式は、次の通りです。
==IF(COUNTIF($A$3:$A$9,"<="&D2)<1,"",VLOOKUP(D2,$A$3:$B$9,2,1))
D2の値以下のセルが、A3セルからA9セルの間で何個あるかを数え、1未満の場合、空白を返します
1以上の場合、VLOOKUP関数でA列からD2の値から、D2の値を超えない最大値を探し、その行の2列目を返します。

F2セルに入力されている数式は、次の通りです。
=IF(NOT(E2=""),INDIRECT(ADDRESS(MATCH(E2,$B$1:$B$9,0),1)),"")
この数式では、もしもE2セルが空白ではないとき、
B1;B9からE2セルの値と同じデータが入っている行を、MATCH関数で探します。
 MATCH(E2,$B$1:$B$9,0),1)
その値をADDRESS関数に当てはめます。列は、1列めなので1を入れます。
 ADDRESS(MATCH(E2,$B$1:$B$9,0),1)
ADDRESS関数で得られたアドレスをINDIRECT関数に当てはめます。
 INDIRECT(ADDRESS(MATCH(E2,$B$1:$B$9,0),1))
これで、交換した場合の消費ポイントが返されます。

D3セルに入力されている数式は、次の通りです。
=IF(NOT(F2=""),D2-F2,"")
この数式では、もしもF2セルが空白ではないとき、D2セルの値からF2セルの値を引きます。
これで、交換後の残ポイントが表示されます。
E3セルとF3セルではE2とF2セルと同じ処理を繰り返します。

このサンプルでは、20行目まで上の数式を入力してあります。
D2セルに適当な数字を放り込んで処理結果をお試しください。

この記事をクリップ!