エクセルでランダムに隠しホールを設定する方法No2

このQ&Aのポイント
  • エクセルでゴルフの隠しホールをランダムに設定する方法を質問させていただきましたが、うまくいかずに問題が発生しています。
  • 特定の条件でランダムな番号を選ぶ方法を試してみましたが、結果に問題があります。
  • 問題の原因を特定し、解決策を見つけるために検証を行いましたが、まだ解決できていません。
回答を見る
  • ベストアンサー

エクセルでランダムに隠しホールを設定する方法No2

数日前にゴルフの新ぺリア方式のときの隠しホールをエクセルで ランダムに設定する方法を質問させていただいたものです。 IF関数で対象ホールを絞り込みSMALL関数で抽出し、 その後、MOD関数でホールNoを切り出す方法をここで 教えていただいたのですが、どうしてもうまくいかず、 #VALUE! が帰ってきてしまいます。 簡便化するため以下のように検定してみました。 A列に1-9までの番号。 B列には2-5までの任意の数。 仮にB列の数字が"4"であるものの中から どれか一つを選ぶという条件を付け、 D列のD2にその番号(1-9)を返す。 というサンプルにいたしました。 しかし、やはりD2の結果には#VALUE!が帰ってきます。 ただ、B2が"4"で有った場合のみ#VALUE!ではなく 数値が表示されますが、この場合も、B列に"4"が 割り当てられている番号だけでなく、A列の番号の どの番号でも再計算のたびに表示されます。 A列 B列 1 3 2 2 3 5 4 3 5 4 6 3 7 5 8 2 9 4 C列には抽選のためのランダム数を割り当てるため C2=RANDBETWEEN(1,99)*100+A2 D2には抽選の結果当選した番号を表示するため D2=MOD(SMALL(IF(B2:B10=4,C2:C10,""),1),100) と入力しました。 検証していただき、訂正の必要がある箇所がありましたら ご指摘いただきたく存じます。

質問者が選んだベストアンサー

  • ベストアンサー
  • bunjii
  • ベストアンサー率43% (3589/8248)
回答No.2

>検証していただき、訂正の必要がある箇所がありましたらご指摘いただきたく存じます。 式はそれで良いのですが入力後にCtrl+Shift+Enterで確定してください。 前回の質問でも説明しましたが入れ子のIF関数は配列を返す必要がありますので普通にEnterで確定するとエラーになります。 抽選数が1つの場合はIF関数で返った数列から1番小さい値のみで良いことになりますので変数にする必要はありません。 2つ以上を選ぶときはSMALL関数で何番目を取り出すかを変数で指定すると同じ列の下の行へコピーすることで入力の手数を省けます。 但し、コピーする場合はセル位置を絶対アドレスで指定する必要があるヶ所に$マークを付けます。 提示の式は応用性に欠けるだけで単独セルに対する式としては正しいと言えます。 式の確定時にCtrl+Shift+Enterの打鍵を忘れないようにしてください。

ama-chin
質問者

お礼

前回に引き続き、今回の質問においてもご面倒をおかけし 誠に申し訳ございません。 #VALUE!のエラーが返ってくる理由は、1回目の質問で Bunjiiさんがすでに記載してくださっておりました。 それを見逃し、首をひねっていた自分を非常に情けなく思います。 Bunjiiさん、MackyNo1さん、本当にご迷惑をおかけ いたしました。 ご回答いただいた方すべてにベストアンサーとしたいのですが 今回の質問内容と前回の質問にあまりに重複が多く、 引き続きご回答いただいたということで、Bunjiiさんの 回答をベストアンサーとさせていただきたく存じます。

その他の回答 (2)

  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.3

参考までに。 提示された数式に対する回答はすでにNo1に示した通りですが、Ctrl+Shift+Enterで確定しなくても配列数式と認識させるには、IF関数を使わずに加減乗除した配列にして、それをINDEX関数を利用して通常の範囲とする方法があります。 たとえば例示されたデータなら以下のような数式にします。 (SMALL関数で一番小さい値はMIN関数と同じなので変更してみました) =MOD(MIN(INDEX((B2:B10<>4)*10000+C2:C10,)),100) 数式の意味は、B列のデータが4以外なら10000を掛けて(4の場合は0になる)、この値とC列のデータを加えた値の中の最小値の下一桁の数字を取得しています。 例示の式はC列に補助列を設けていますが、A列とB列の値だけで該当のデータをランダムに抽出したいなら、以下のような関数にするほうが無駄がなく合理的です。 =LARGE(INDEX((B2:B10=4)*A2:A10,),RANDBETWEEN(1,COUNTIF(B2:B10,4))) 上記の数式の意味は、まずINDEX((B2:B10=4)*A2:A10,)でB列が4の場合はA列の値、それ以外の場合は0の配列(範囲)を取得しています。その配列の中から、大きい順に数えて、RANDBETWEEN関数で「1~B列が4のセルの個数」の値の中からランダムに求められた順位の数値を取得しています。

ama-chin
質問者

お礼

先ほどの回答に加え、非常に合理的な提案をしていただき 誠にありがとうございます。 今回は質問内容にある方法でかなりのデータを組み上げて しまっていますので、ご提案頂きました方法は、今後の 参考にさせていただこうと考えております。 みなさまの理解の深さに驚愕するっともに、自分の理解の 浅さが恥ずかしくなります。 本当にご教授感謝いたします。

  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.1

D2=MOD(SMALL(IF(B2:B10=4,C2:C10,""),1),100) 上記の数式は配列数式ですので、入力後Ctrl+Shift+Enterのキー操作で確定する必要があります。 数式の意味は、B2:B10セルが4の場合は、対応する行のC列の値を返し、それ以外の場合は「””」の配列を返しますので、その中で最小値のC列の値の下一桁を取得する式になっています。 一方、配列数式にしない場合は、B列に4が入力されている場合のみ、C2:C10のセル範囲を返しますので、単純にC列の一番小さい数字の末尾が求められることになるわけです(4以外の場合はVALUEエラーになります)。

ama-chin
質問者

お礼

非常に詳しい説明ありがとうございます。 おかげでなぜエラー表示が返ってくるか理解できました。

関連するQ&A

  • EXCEL、ランダム表示の発展系?

    EXCELのSheet1には A列にサイトタイトル、B列にURL、C列にカテゴリのデータがあるとします。 そして、D列には「=IF(B2="","",RAND())」このようなランダムの関数があります。 また、Sheet2のA列には =IF(ROW(A1)>COUNT(Sheet1!$D:$D),"",INDEX(Sheet1!$A:$B,MATCH(LARGE(Sheet1!$D$2:INDIRECT("Sheet1!D"&COUNT(Sheet1!$D:$D)+1),ROW(A1)),Sheet1!$D:$D,0),COLUMN(A1))) B列には =IF(ROW(B1)>COUNT(Sheet1!$D:$D),"",INDEX(Sheet1!$A:$B,MATCH(LARGE(Sheet1!$D$2:INDIRECT("Sheet1!D"&COUNT(Sheet1!$D:$D)+1),ROW(B1)),Sheet1!$D:$D,0),COLUMN(B1))) がA2,B2~A6,B6の5行に書かれています。 すると、Sheet2のA2,B2~A6,B6にはランダムに表示されます。 (以前教えてもらった方法です) そこで今回の質問ですが2つあります。 1つ目は、C列のカテゴリを指定して、その中からランダムに表示させたい。 2つ目は、同じドメインは表示しないようにしたい。 ちょっと、分かり難いかもしれませんが、このようにするにはどうすればいいでしょうか? 恐れ入りますが、教えていただけないでしょうか? よろしくお願いします。

  • エクセルでランダムに並び替える方法

      A  B  C 1 A組 石井 1 2 A組 伊藤 2 3 B組 山下 3 4 B組 佐藤 1 5 C組 吉田 2 6 D組 鈴木 3 と記載したシートで、AとB列をランダムに並べ替えて   A  B  C 1 B組 佐藤 1 2 C組 吉田 2 3 D組 鈴木 3 4 A組 伊藤 1 5 A組 石井 2 6 B組 山下 3 のように班を決定することは関数では可能ですか? 過去ログを色々見たのですが、いまいちよくわからなかったので、トピ作成してしまいました。

  • EXCELを使って抽選

    400人程度から250人程度をEXCELで抽選する問題です。 A列:受付順に氏名を記入 B列:A列の氏名を「あいうえお」順に並べ替え C列:RAND()でランダム数を表示 D列:一度C列をコピーし、RANK関数で順位づけ これでB列とD列を対比すれば誰が何位かがわかりますが、D列は順位が 入れ乱れていて大変見づらいのでE列にD列の1位,2位,3位,・・・・ の順に対応するB列の氏名を上から順に表示したいのですがうまくいきません。  E列にはどんな関数を使えばいいのか、どなたか教えてください。

  • エクセルで一致しないものを抜き出す方法

     またエクセル関数の質問があります。 セルA1:A6にA~Fがランダムに入力されています。 セルB1:B6にA~Fの一部がランダムに入力されています。空白もあります。 別なセルに一致しない記号を表示させたいのですが.... 例   A B C D 1 F C B 2 D   D 3 B A 4 A F 5 E 6 C E 別なセル(上記ではC1、C2)に表示させられますか? A列とB列の記号は変化します。  よろしくお願いします。

  • エクセルからランダムに抽出する方法

    お世話になります。 以前、似たような質問があったのですが探すことができなかったので質問させてください。 エクセルのA列に社員番号、B列に氏名の入ったファイル(約7,000名)があります。今回、全社的にアンケートをとることになり、ランダムに対象者を300人抽出したいと思います。できればC列に『○』表示したいのですが、=rand()で乱数を発生させるまではできますが、その中から抽出する関数がわかりません。 また、統計をとる上で必要な人数とは何人ぐらいなのでしょうか? OSはXP、エクセル2003を使用しています。 よろしくお願いします。

  • Excelで集計に関する関数の質問です

    添付した図を基に質問します。4行目をウィンドウ枠固定して表示してあります。 行列番号を見てもらえたら分かると思いますが、要所でセルを結合してあります。 セルB6に=IF(B5="","",(IF(B5>1999,0,IF(E5<501,0,IF(AND(B5>499,E5<2001),(TIME(INT(E5/100),MOD(E5,100),0)-TIME(INT(B5/100),MOD(B5,100),0)),IF(B5<500,TIME(INT(E5/100),MOD(E5,100),0)-(TIME(INT(500/100),MOD(500,100),0)),IF(E5>2000,TIME(INT(2000/100),MOD(2000,100),0)-TIME(INT(B5/100),MOD(B5,100),0),0))))))*24) D6に=IF(B5="","",IF(AND(B5<500,E5>500),(TIME(INT(500/100),MOD(500,100),0)-TIME(INT(B5/100),MOD(B5,100),0)),IF(AND(B5<2000,E5>2000),(TIME(INT(E5/100),MOD(E5,100),0)-TIME(INT(2000/100),MOD(2000,100),0)),IF(AND(B5>499,E5<2001),0,(TIME(INT(E5/100),MOD(E5,100),0)-TIME(INT(B5/100),MOD(B5,100),0)))))*24) これは、項目A列5行目を参照しています。以下オートフィルします。 例えば7時から10時10分の差を求める場合、B6セルに700、D6セルに1010と1分単位で入力し、表示形式は0.0" H"です。 項目C,Dも同様で、項目C内E列には1時間30分の場合1.5と入力し30分単位です。表示形式は同様。 A列の日付欄には、1月1日の場合1/1と記入します。表示形式は日付の月/日です。 上記内容で添付図の上の表(A3:S30)項目B~D列のデータを下の表(A32:S39)で集計しようと思います。 1、F35~F38に月ごとの時間の計を表示させる関数 2、J35~J38には、月ごとの時間*単価を項目別に計算した値の計を表示させる関数 3、P35~P38にも上記同様の計を表示させる関数 以上、1,2,3に入力する関数が知りたいので、宜しくお願いします。 なお不明な点がありましたら随時補足していこうと思います。

  • エクセルの関数について

    A列に1,2,3・・・と回数があり、B列に一桁の数字(0~9)がランダムにあり、C列(C1)には『=IF(B1=1,"○","")』とあり、C2以降オートフィルでコピーされています。 B列の数値が『1』の時にだけC列に『○』が入りますが、D列に『C列の○と○の間隔』を数字で表示したいのですが、『=IF(B10=1,COUNTBLANK(C2:C9)+1,"")』としても、オートフィルで全てのD列にコピーしても参照セル範囲がランダムなので上手く行きません。 ○印が出現したら直前回の○印からの出現間隔を関数で自動表示したいのですが、関数が分かりません。あるいは関数の組合せ方法が思い浮かびません。 分かりやすく言うと、例えばナンバーズなどのある桁の0から9までの数字のうち、任意の数字が出現するたびにその横の列に○印を付け、さらにその横の列に出現した間隔を自動で表示できる関数が知りたいのです。 言葉で上手く表現できませんが、分かる方教えて下さい。お願いします。

  • EXELで条件抽出をしたい…

    教えて下さい。EXELで作った下のような表(データ)がありその条件に合う人を抽出したいんですが…       A   B   C   D 1 Aさん 1234  2345  3456  4567 2 Bさん 6788  1234  5556  7778 3 Cさん 7788  7778  5443  7789 A~Dのセルにランダムに並んだ数字を入力している(ここでは、番号(1234)と入力している)人を関数を使い一発表示したいんですが。  A列だけに1234という数字を入力している人を抽出し、条件にあえば「○」という表示をできるようにはIF関数を使いできましたが、 AさんのA列、B列、C列全てを検索範囲に入れた、(たとえば「1234」と入力しているなら「○」等で表示(抽出)したいんですが…それができる関数を教えて下さい。列ごとしかできないのか…??? 分かりにくいですか? (^_^; 宜敷お願いします。

  • エクセル IF関数 初心者です。。

    A    B   C  D Aさん 9:00  1  9:00 Bさん 10:00 2  9:30 Cさん 11:00 3  10:00 Dさん 12:00 4  10:30 Eさん 9:00  1  9:00 A列氏名 B列時間 C列 B列IF関数 9:00からは1、10時からは2、 11からは3・・・ D列はC列のVLOOKUP関数 1=9:00、2=9:30、3=10:00・・・ そこでお聞きしたいのですが・・ A    B   C  D Aさん 9:00  1  9:00 Bさん 10:00 3  10:00 Cさん 11:00 4  10:30 Dさん 12:00 5  11:00 Eさん 9:00  2  9:30 IF関数を用いて IF(B1>=0.375),1,if(B1>=0.416666666666667),2,IF(B1>=0.458333333333333),3・・・ Eさんが2になるような数式がわかりません。 よろしくお願いします。。

  • エクセル 間違いを教えてください。

    間違いを教えてください。 D列に最終の計算結果を得るようにしました。 B8に「 =IF(A8="","",(B7+A8)) 」を入れています。 D8に「 =SUM(B8-(10000-C8)*300) 」を入れています。 このようにすると、D列には#VALUE!と表示されますが、AとCに数値を入れると、Dには正しい計算結果が表示されます。 #VALUE!となる原因を教えて下さい。 エクセルについては全くの初心者なので、質問の仕方そのものが間違っているかもしれませんが、よろしくお願いします。

専門家に質問してみよう