貯めたポイントで交換可能な最高額の商品を調べる
下の表のA列とB列は、交換に必要なポイント数と交換可能な商品の一覧表です。
アホな商品リストだということは承知しています。サンプルだということでお見逃しください。
送信者 OpenOfficeこの画像のファイルは、SKYDRIVEからcalc108.odsをダウンロードしてください。 |
さらに、交換後のポイント残が発生する場合、残ポイント数を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セルに適当な数字を放り込んで処理結果をお試しください。