dポイントプレゼントキャンペーン実施中!

席決め表を作っていて悩んでいます

例:60人で6テーブル(1卓10人)に割振ります
(人数は30~200 テーブルは5~20 1卓あたり5~10人で毎回変化します)
全員がランダムではなく この人はA卓、この人はB卓 など各テーブルに0~10人の指定が発生します

1つの卓が 10人 ー 指定の人数 = ランダムに指定する人数 となるのですが
来賓が多い場合は 10人ー指定10人=ランダム0人 という事もあります

そこで

RANDBETWEEN で 1~6の乱数を発生させ、各テーブルの規定人数に達した場合は発生しない またはスキップする様にすることは可能でしょうか?

また、RANDBETWEENではなくても他の手法で同様の結果を得る方法があればご教示願います

A 回答 (2件)

こんにちは。



席ぎめの順位を決めるものだと理解しましたが、ご質問については、フルに理解をしているわけではありません。

>RANDBETWEEN で 1~6の乱数を発生させ、各テーブルの規定人数に達した場合は発生しない またはスキップする様にすることは可能でしょうか?

これは、人間が判断することではないかと思いましたので、それは触れないでおきました。
また、通して200人なら200をランダムに並べ替えるとは考えませんでした。

このマクロは、

6を入れれば、6までの乱数
4を入れれば、4までの乱数
8を入れれば、8までの乱数が、重複なくでます。
以下のように出力します。
  3 2 6 4 1 5 
  6 1 4 5 2 3 
  1 2 4 3    
  5 3 1 2 6 7 4 8


'//標準モジュール
Sub RandomGenerating()
 Dim tNum As Long
 Dim pNum As Long
 Dim arNum() As Variant
 Dim arNum1 As Variant
 Dim i As Long
 Cells(Rows.Count, ActiveCell.Column).End(xlUp).Offset(1).Select '行の最後尾の下

 pNum = Application.InputBox("席割の人数を入れてください", "席割の人数")
 If Not IsNumeric(pNum) Then Exit Sub
 If pNum = 0 Then Exit Sub
 Randomize
 ReDim arNum(1 To pNum, 1)
 For i = 1 To pNum
  arNum(i, 0) = i
  arNum(i, 1) = Rnd() 'ランダムの発生
 Next i
 arNum1 = RankingPos(arNum)
 For i = 1 To pNum
  With ActiveCell
   .Offset(, i - 1).Value = arNum1(i, 0)
  End With
 Next i
End Sub
Function RankingPos(iAr())
 Dim i As Long
 Dim j As Long
 Dim Temp1 As Long
 Dim Temp2 As Double
 For i = UBound(iAr) To LBound(iAr) Step -1
  For j = LBound(iAr) + 1 To i
   If iAr(j - 1, 1) > iAr(j, 1) Then
    Temp1 = iAr(j - 1, 0)
    Temp2 = iAr(j - 1, 1)
    iAr(j - 1, 0) = iAr(j, 0)
    iAr(j - 1, 1) = iAr(j, 1)
    iAr(j, 0) = Temp1
    iAr(j, 1) = Temp2
   End If
  Next j
 Next i
 RankingPos = iAr()
End Function
    • good
    • 0

例えばテーブルの番号を人数分だけ並べて (つまり A卓が最大 5人, B卓が最大 10人なら A を 5個, B を 10個並べる

) ランダムシャッフル.
    • good
    • 0
この回答へのお礼

その方法では200人、20卓となると カウントして並べるだけでも手作業がかなりかかるように思えます
人数変更や指定の変更があるとさらに時間がかかりそうなのですが、そこをクリアする手法も教えていただければありがたいです

お礼日時:2017/08/21 16:22

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!