• ベストアンサー

エクセルでシャッフル

こんばんは。エクセルのことについてお伺いします。以下の画像のように、3/6(月)の1階がAさん、同じ日の2階がBさん・・・と言うように振り分けたとします。 このそれぞれ、Aさん・Bさん・Cさんをシャッフルするにはどのようにすればよいのでしょうか。乱数のようにF9キーで、シャッフルできるといいのですが。

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

  • ベストアンサー
  • Nouble
  • ベストアンサー率18% (330/1783)
回答No.2

VBAの方が良いでしょうね 書けますか? データ構造として 三つの、要素数の 相互接続リスト形式 加えて、 入り口、出口の、 ノードを、持たせる と、し リストは Type 1ノード  後方 As Long  自身 As Long  前方 As Long  氏名 As String END Type type ノードズ  Dim ノード(4) As 1ノード End type また、氏名を 定数で、定義しておく Const 一人目 As String = 一人目の氏名を此処に記載 Const 二人目 As String = 二人目の氏名を此処に記載 Const 三人目 As String = 三人目の氏名を此処に記載 アルゴリズムとして 先ず、リスト構造の、変数構造体 "リスト"を、"ノードズ"のtypeで、作成 カウンターを、Long形式で作成 カウンターに、1を入れる 構造体"リスト"の、値初期化のため …甲 リスト.ノード(カウンター).前方 に、-1 + カウンター を、入れる リスト.ノード(カウンター).自身 に、0 + カウンター を、入れる リスト.ノード(カウンター).後方 に、1 + カウンター を、入れる カウンターを調べ、 5以上なら、次の処理へ そうで無いなら、カウンターに1を足して、甲へ戻る リスト.ノード(1).氏名 に、"入口"を、入れる リスト.ノード(2).氏名 に、一人目を、入れる リスト.ノード(3).氏名 に、二人目を、入れる リスト.ノード(4).氏名 に、三人目を、入れる リスト.ノード(5).氏名 に、"出口"を、入れる リスト.ノード(1).前方 に、-99999を、入れる リスト.ノード(5).後方 に、-99999を、入れる '            此で、リストの初期化終了 1~3の整数の、偽乱数を求め コピーの 入り口ノードから、入り 先に得た、偽乱数値だけ リスト構造の、リンクを辿る たどり着いたノード(以降、甲という)の 手前のノードの 前方を指す、リンクの値を 甲の、前方のノードを 指し示すように、書き換える 甲の前方にあるノードの 後方を示すリンクを 甲の後方のノードを 指し示すように書き換える 甲の、全貌、及び後方のリンクを 何も、指し示していない事を 表す値に、書き換える 甲の値を、セルに書き込む セルを一つ下に移動し 偽乱数を求める最大値を一つ減らし 上記を繰り返す もう一度、 セルを一つ下に移動し 偽乱数を求める最大値を一つ減らし 上記を繰り返す コピーしたデータを、破棄する 以上を、一日分のアルゴリズム と、し 1日から、同月月末日まで 繰り返し 作業を、適用させる

sunsetroad
質問者

お礼

ご回答ありがとうございました。

その他の回答 (1)

回答No.1

「シャッフル」がどうなるかはわかりませんが、 乱数を発生させる関数に 「RAND関数」「RANDBETWEEN関数」というのがあります。 乱数の範囲が決まっているなら、RANDBETWEENのほうが使い易いかもです。   =RANDBETWEEN(1,3) というような感じで使い、上記だと1~3の整数をランダムに返します。 例えばA~Cさんに割り振るのであれば、 それぞれに1~3を当てる形で対応表を作成し(図参照)、 乱数を取りつつ、VLOOKUP関数で抽出しているのがG列です。   G2セル:=VLOOKUP(RANDBETWEEN(1,3),$A$2:$B$4,2,FALSE) こんな感じで「乱数を発生させつつ、対応する人を抽出」してきます。 F9キーでの再計算にも対応します。 が、難が2点ほど。 (1)どこかのセルを編集したりすると新たな乱数が発生   これは、再計算を「手動」にすることでなんとか対応できないこともないです。 (2)完全にランダムなので公平にならない   同じ人(乱数)が4連続したり、1階2階が同じ人なんてこともありえます。   が、人数が増えれば増えるだけ、その確率は下がっていきます。   ・・・当然ではありますが。 参考までにどうぞ。

sunsetroad
質問者

お礼

ご回答ありがとうございました。

関連するQ&A