見出し画像

エクセルごはんおまけ回(3匹のオバケが現れる場所)

こんにちは。
エクセルごはんです。
 
今回はおまけ回です。
おまけ回というより、ちょっとした遊び回です。
 
下図のような10×10マスのセルがあります。

この100箇所のどこかから3匹のオバケが現れます。
3匹のオバケは、出現する場所が被って、2匹しか現れないこともあれば、1匹しか現れないこともあります。100箇所も出現場所があれば被ることは稀だと思いますが。
3匹がちゃんとバラけて現れることもあります。
さて、今日は、3匹のオバケが現れる場所はどこになるのでしょうか?
F9の更新ボタンを押すたびに現れる場所が変わります。 

今日は、そんなExcelのご紹介です。
 
100箇所以外の適当なセルに、私の場合は、セルK1に、
=TEXTJOIN(",",TRUE,CHAR(RANDBETWEEN(IF($A$11:$A$13=$A$11:$A$13,65),73))&TEXT(RANDBETWEEN(IF($A$11:$A$13=$A$11:$A$13,1),10),"00"))
と入力し、CtrlとShiftとEnterキーを押します。
 
続いて、セルA1からセルI10を選択して、
=IF(IFERROR(FIND(CHAR(64+COLUMN())&TEXT(ROW(),"00"),$K$1),0),"オバケ","")
と入力し、CtrlとEnterキーを押します。
こちらは配列数式ではありません。
また、複数のセルへの一括入力をするため、CtrlとEnterキーを押します。
先程、適当なセルに、セルK1を選んだので、FIND関数の対象に、セルK1を選んでいます。
これで出来上がりです。
 
3匹のオバケが現れますよ。時に現れる場所が被って、2匹のオバケ。時に現れる場所が被りまくって、1匹のオバケ。
 
どういう仕組みになっているのか、詳しく見ていきましょう。
 
まず、
=TEXTJOIN(",",TRUE,CHAR(RANDBETWEEN(IF($A$11:$A$13=$A$11:$A$13,65),73))&TEXT(RANDBETWEEN(IF($A$11:$A$13=$A$11:$A$13,1),10),"00"))
太字の箇所を見ていきます。
CHAR(RANDBETWEEN(IF($A$11:$A$13=$A$11:$A$13,65),73))
ですが、アルファベットAからIまでのランダムなアルファベットを3文字分取得しています。
RANDBETWEEN関数の内にIF関数を含ませることがポイントです。
こうすることで、ランダムなAからIまでのアルファベットを3回分得ることができます。IF関数がRANDBETWEEN関数の外だと、ランダムな同じAからIまでのアルファベットを3回分得ることになってしまいます。
IF関数の中の数式、$A$11:$A$13=$A$11:$A$13は特に意味はありません。RANDBETWEN関数を3回動かすためにしています。ここは、絶対、条件が真になる数式なら、他の数式でも構いません。
また、$A$1:$A$3ではなく、$A$11:$A$13としているのは、10×10のセルに、セルA1からセルA3が含まれているためです。
 
次に、
=TEXTJOIN(",",TRUE,CHAR(RANDBETWEEN(IF($A$11:$A$13=$A$11:$A$13,65),73))&TEXT(RANDBETWEEN(IF($A$11:$A$13=$A$11:$A$13,1),10),"00"))
太字の箇所を見ていきます。
TEXT(RANDBETWEEN(IF($A$11:$A$13=$A$11:$A$13,1),10),"00")
ですが、01から10までのランダムな数字を3文字分取得しています。
TEXT関数は表示形式を揃える関数になります。表示形式に”00”とすることで、1が01に、2が02になります。これは後ほど、FIND関数で数字を探すのに、01、02、03…10と探していくためです。FIND関数で、1で探すと、10のときにも1が見つかってしまうため、このように工夫しています。
 
続いて、
=TEXTJOIN(",",TRUE,CHAR(RANDBETWEEN(IF($A$11:$A$13=$A$11:$A$13,65),73))&TEXT(RANDBETWEEN(IF($A$11:$A$13=$A$11:$A$13,1),10),"00"))
全体を見ます。
&で、アルファベットAからIまでのランダムなアルファベット3文字と、数字01から10までのランダムな数字3文字とを連結しています。
これで、A01、B01のような各セルに対応する値が取得できました。
 
残りは、
セルA1からセルI10を選択して、
=IF(IFERROR(FIND(CHAR(64+COLUMN())&TEXT(ROW(),"00"),$K$1),0),"オバケ","")
と入力し、CtrlとEnterを押して一括入力します。
 
こちらの仕組みも見ていきましょう。
=IF(IFERROR(FIND(CHAR(64+COLUMN())&TEXT(ROW(),"00"),$K$1),0),"オバケ","")
太字の箇所から見ていきます。
CHAR(64+COLUMN())
ですが、これで各列に対応したA、B、C…が取得できます。
 
続いて、
=IF(IFERROR(FIND(CHAR(64+COLUMN())&TEXT(ROW(),"00"),$K$1),0),"オバケ","")
太字の箇所から見ていきます。
TEXT(ROW(),"00")
ですが、これで各行に対応した01、02、03…を得ます。
TEXT関数で取得した行1、2、3…が01、02、03の表示形式に揃えられます。
 
あとは、これを&で組み合わせて、FIND関数の検索文字に渡しています。FIND関数の対象には、先程、100箇所以外の適当なセルに入力した、適当なセルを選択します。私は、セルK1を選択したので、対象をセルK1にしています。
 
そして、
=IF(IFERROR(FIND(CHAR(64+COLUMN())&TEXT(ROW(),"00"),$K$1),0),"オバケ","")
全体を見ます。
IFERROR関数で、FIND関数が対象に検索文字列が見つからなかったときにエラー値を返すため、その時は0にするという処理をしています。
また、IF関数でFIND関数で検索値が見つかったときの場合(FIND関数で検索値が見つかると1以上の値が返る)、オバケを表示し、見つからなかった場合は空白にするとしています。
 
おつかれさまでした。
今回はおまけ回、いや、遊び回として、「3匹のオバケが現れる場所」を紹介しました。
エクセルごはんでは、皆様に、役立つ情報や、楽しめる問題を提供していきますので、読んでいただけると嬉しいです。
それでは。
 
 

いいなと思ったら応援しよう!