- ベストアンサー
エクセルでランダムな座席表を作成したい
excel 2003を使用しています。 エクセルで、100名程度の座席表を作成したいと思っています。 今、机の絵をレイアウトどおりに表示させて、該当する机に社員番号を入れれば、社員名が表示されるように設定しています。 席替えを毎日行うので、1-100の数字をランダムかつ重複せずに入れて、簡単に座席変更をしたいのですが、方法がわかりません。RANDBETWEENだと、ランダムに数字が入りますが、重複してしまい、困っております。 ランダムに数字を入力でき、かつ重複しない方法を教えてください。 どうぞよろしくお願いいたします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
#02、04です。 う~ん困りました。補足していただいた内容だけでは到底期待に添うマクロは書けないからです。例えば「机の絵をレイアウトどおりに表示させて」って、具体的にはどのセルが氏名の表示セルなのかも分かりません。回答者は質問者さまのパソコンは見えないのです。 それにVLOOKUP関数を使用する方法は試していただけましたか? これでも毎回異なる座席表は作成できるはずです。どんな問題がありました?(試さずに「マクロでお願いします」はないですよね) とりあえずマクロは書いてみました。でもこちらで不足する情報を想像で補っていますから、きっと期待通りのものにはなりません。後はご自身で修正するなりしてください。 前提 ・シート1に座席表がある。氏名が入るセルはB,D,F,H,J列の2行目から2行おきとする ・シート2のA列に1~100の連番。B列に100人分の氏名が入力されている。C列は作業列として使うので何も入力しない ・実際の人数が100人に満たない場合、空席もランダムに発生する(人を前方に詰めることはしない。マクロを変更すれば詰めることも可能ですが…) 以下のマクロをALT+F11でVBE画面を開き、左上のVBA Projectでシート名を右クリックし「挿入」→「標準モジュール」で表示される画面に貼り付けて下さい。マクロの実行はワークシート画面に戻ってALT+F8でマクロ一覧を開き、マクロ名を選択して「実行」ボタンです。 Sub Macro1() Dim idx, R, C As Integer Randomize For idx = 1 To 100 Sheets("Sheet2").Cells(idx, 3) = Rnd Next idx With Sheets("sheet2") .Activate .Cells(1, 1).CurrentRegion.Select Selection.Sort key1:=Range("C1"), Order1:=xlAscending, _ header:=xlGuess, DataOption1:=xlSortNormal For idx = 1 To 100 R = Int((idx - 1) / 5 + 1) * 2 'この式は実際の配置に合わせる C = ((idx - 1) Mod 5 + 1) * 2 '必要があります If .Cells(idx, "B") = "" Then Sheets("Sheet1").Cells(R, C).ClearContents Else Sheets("Sheet1").Cells(R, C).Value = .Cells(idx, "B") End If Next idx .Cells(1, 1).CurrentRegion.Select Selection.Sort key1:=Range("A1"), Order1:=xlAscending, _ header:=xlGuess, DataOption1:=xlSortNormal .Columns(3).ClearContents End With Sheets("Sheet1").Activate End Sub このマクロを実行するボタンを作成するなら、「ツールバー右クリック」→「フォーム」から「コマンドボタン」を選択し、画面上にコマンドボタンを配置して、マクロを登録すればよいでしょう
その他の回答 (4)
- zap35
- ベストアンサー率44% (1383/3079)
#02です >ワンボタンで、実行できればと考えていました ワンボタンで何を自動化するか、質問に具体的に書かれていないのに何をどう回答すればよいのでしょうか(^^; #01さんもヒントを書いてくれていますが、#02の方法で乱数を発生させたとして、例えば1~100の乱数を発生させたシートをSheet2として、さらにSheet3のA1:C100に1~100の連番と社員番号と氏名の表があるとすれば、座席に相当する100個のセルに順番に =VLOOKUP(Sheet2!A1,Sheet3!$A1:$C100,3,0) =VLOOKUP(Sheet2!A2,Sheet3!$A1:$C100,3,0) ~中略~ =VLOOKUP(Sheet2!A100,Sheet3!$A1:$C100,3,0) と指定しておけば、自動的に100人分の氏名を座席表に表示することができますよ Sheet2でF9を押下して再計算するたびに、座席表も変わるはずです これでもワンクリックではないというならマクロが必要でしょう。 マクロがよければ補足してください。でもきちんと条件を書いていただけないとマクロは書けませんよ。
補足
ご回答ありがとうございます。 ご回答に甘えてマクロをお願いさせて頂きます。(スイマセン) 机の絵をレイアウトどおりに表示させて、それぞれの机に=VLOOKUP(Sheet2!A1,Sheet3!$A1:$C100,3,0)の関数を入れている席表のシートをSheet4とした際に、sheet4上に、「席替え」ボタンを作成して、そのボタンを押せば、Sheet2を再計算、最ソート出来きて、Sheet4の席がランダムに変われば良いと思っています。 どうぞよろしくお願いいたします。
- imogasi
- ベストアンサー率27% (4737/17070)
ランダムに1-100の数が入っている列をその値でソートし、ソート結果の行番号ROW()を使えばどうでしょう。 直接セルの値をつかうのでなく。 乱数では重複していても、並び替えると、同じ値の中でも、何かの上下の序列が付きますから。そうするとROW()の値は、それぞれ別になります。
- zap35
- ベストアンサー率44% (1383/3079)
どのくらい作業を自動化したいのか分かりませんが、単純に「1~100までの重複しないランダム数列を得たい」で良ければ以下で可能です まず適当なシートのA1:A100に1~100の連番を予め入力します。オートフィルを使うと簡単でしょう。そしてB1に =RAND() を入力し、B100までコピーします。 A1:B100をB列をキーにして昇順、もしくは降順で並べると、A列はランダムな重複なしの数列になります。 意味が違っていたらごめんなさい。
お礼
ご回答ありがとうございます。 ワンボタンで、実行できればと考えていました。並べ替えてセルをコピー・・・もう少し考えてみます。
- root16
- ベストアンサー率31% (43/138)
参考情報 http://www.relief.jp/itnote/archives/001798.php 多分、もっと簡単な方法としては、 RAND関数を使って予め入力しておいた1~100の数字を ランダムに並べ替え、それを座席番号とリンクしている セルにコピーすれば早いんではないでしょうか。
お礼
ご回答ありがとうございます。 ワンボタンで、実行できればと考えていました。並べ替えてセルをコピー・・・もう少し考えてみます。
お礼
お礼が送れて失礼いたしました。 実例のマクロを作成いただきありがとうございました。前提どおりのシートを作成して、マクロを少しずつ変更しています。希望通りのマクロにもう少しでなりそうです。後は自力でやってみます。ありがとうございました。
補足
ご対応ありがとうございます。記載していただいている前提条件のように述べる必要があったのですね・・・。 う、失礼いたしました。 VLOOKUPも試してみたのですが、エクセルをほとんど知らないメンバーでも操作できるようになるべく簡略化したかったのです。 今日、マクロを入れて試してみます。取り急ぎお礼まで。