今更にも程がある、とは思ったが、せっかくなので書き残しておこう。
[Excel関数]
=IFERROR(IF(MATCH("ドコ",OFFSET(A1,-5,0,5),0)=5,"キ・ヨ・シ!",NA),
IFERROR(T(FIND(OFFSET(A1,-1,0),"キ・ヨ・シ!")),
IF(RAND()<0.5,"ズン","ドコ")))
[使い方]
- A1セルに上記を入力
- そのセルを選択し、下方のセル範囲(2〜30行程度)にコピーペースト(またはフィル)する (コード中の A1 となっているところは、A2、A3・・・と自セルのアドレスになるはず)
- F9キーを押すたびに、再計算で結果が変わります
[説明]
■1行目
IFERROR(IF(MATCH("ドコ",OFFSET(自セル,-5,0,5),0)=5,"キ・ヨ・シ!",NA),
「ここで"キ・ヨ・シ!"と叫ぶかどうか」を判断している
叫ぶ条件に当てはまらない場合はエラーとなり、IFERROR関数の第2引数(2行目以降の記述)を表示することになる
OFFSET関数で「自セルの5行前から5行分(つまり直近の5つ)」の範囲を指定して、その範囲内で、"ドコ"という値が何個目に登場するかをMATCH関数で調べる
- 自セルが1〜5行目の場合、「直近の5つ」が存在しないので、OFFSET関数でエラーになる
- 直近の5つの中に"ドコ"が1つもない場合は、MATCH関数がエラーになる
- 5個目(ズン・ズン・ズン・ズン・ドコ)なら、"キ・ヨ・シ!"を返す
- 1〜4個目の場合、NA関数を使ってわざとエラーにしている
■2行目
IFERROR(T(FIND(OFFSET(自セル,-1,0),"キ・ヨ・シ!")),
ここでは、「"キ・ヨ・シ!"が既に登場済みかどうか」を判断している
一つ上のセルが、"キ・ヨ・シ!"または空文字なら、登場済みということになるし、"ズン"や"ドコ"なら、未登場ということになる
登場済みなら自セルは空文字にする(未登場の時はエラーとなり、IFERROR関数の第2引数(3行目の記述)へ移る)
一つ上のセルをOFFSET関数を再び使って取得し、それを検索値として、FIND関数で、文字列"キ・ヨ・シ!"の中を検索する
セル値は"ズン","ドコ","キ・ヨ・シ!",空文字 のどれかなので、
- 検索値が"ズン"や"ドコ"の場合はヒットしないのでFIND関数がエラーになる(それによって後述のT関数もエラーになる)
- 検索値が"キ・ヨ・シ!"の場合は1桁目でヒット
- 検索値が空文字の場合も、1桁目でヒットしたという扱いになる
この戻り値を、T関数(引数が文字列以外の場合は空文字を返す)に与えている
■3行目
IF(RAND()<0.5,"ズン","ドコ")
ここは、キヨシ未登場の場合の記述
"ズン"か"ドコ"をランダムで表示するために、RAND関数(0〜1の範囲での乱数を返す)を利用している
■追記(18.11.17)
以下のようにすれば全てのセルが同じ数式で行ける
=IFERROR(IF(MATCH("ドコ",OFFSET($A$1,ROW()-6,0,5),0)=5,"キ・ヨ・シ!",NA),IFERROR(T(FIND(OFFSET($A$1,ROW()-2,0),"キ・ヨ・シ!")),IF(RAND()<0.5,"ズン","ドコ")))