2009/5/4  23:56 | 投稿者: minmax

問題に使用したシートはこれ
クリックすると元のサイズで表示します
問題の内容は
〔数式入力条件〕
数式は一種類とし、K11に入れた数式を他のセルにコピーしてください。
初期段階では全てのセルは空白となるようにしてください。
もちろんエラー表示もなしです。
計算手法として循環参照(反復計算)はありです。
〔問題〕
任意の場所(セル)で地震が発生します。
地震発生地から離れるごとに震度が1づつ減っていきます。
それを1種類の数式を使って表現して欲しい。
ちょっと簡単かな〜?ま、いいか。
なんにも難しいことを考えていませんが面白い方法も期待しています。
〔震源地入力と震度表示〕
数式を入力後の表示範囲K11からAA27のいずれかのセルに数値を入力します。
入力されたセルが震源地の震度とします。
地震を想定しているので最大7までの数値で計算出来ればOKです。(あんまり関係ないと思いますが)
入力したセルから離れるごとに震度が1ずつ減っていき、震度が無くなった部分は空白となるようにしてください。
震度は0まで表示してください。
(震度0は人は感じない程度の地震)
例はS19に震度7と入れたものです。当然あらかじめ入力されていたS19の数式は無くなり、定数7に入れ替わっています。
震度5強等の強弱は省略です。

というものだった。
……………………………………………
一番先に書いた式はこんな式だった。(文字数80)
=INDIRECT(CELL("address"))-MAX(ABS(CELL("row")-ROW()),ABS(CELL("col")-COLUMN()))
その後マイナスの場合に空白にするため作った式が、
=IF(COUNTIF(INDIRECT(CELL("address")),">0"),TEXT(INDIRECT(CELL("address"))-MAX(ABS(CELL("row")-ROW()),ABS(CELL("col")-COLUMN())),"0;;0"),"")
だった。(文字数140)

その後極めて無駄な式だと気付いて、最終的には、
=IF(ASC(CELL("contents"))>"0",TEXT(CELL("contents")-MAX(ABS(CELL("row")-ROW()),ABS(CELL("col")-COLUMN())),"0;"),"")
となった。(文字数115)
(もうちょっと減らせるけど、文字数はそんなに気にしてないから)
ただし、これだと数式を入力した時点では、循環参照になってしまう。

そこで、IF(CELL("address")=CELL("address",K11),"",・・・)と言う条件をいれて循環参照を回避することとし、最終的な式が
=IF(CELL("address")=CELL("address",K11),"",IF(CELL("contents")<"",TEXT(CELL("contents")-MAX(ABS(CELL("row")-ROW()),ABS(CELL("col")-COLUMN())),"0;"),""))
となった。(文字数152)

ということで、
CELL("address")=CELL("address",K11)
という条件が気にいっている。
何かに使えるような気がして。。
0




AutoPage最新お知らせ