これ何て呼びますか

17人の生徒がいる教室で、ランダムに生徒を当てて、当たった回数を記録し、平等に当てるというVBAを教えてください。

質問者からの補足コメント

  • つらい・・・

    当方VBAの勉強を始めたばかりでして、超初心者にわかりやすく説明していただけると非常に助かります。
    VBAでお願いいたします。

      補足日時:2015/07/06 09:16
  • へこむわー

    この質問は特に女性の方に
    リクエストされていません。間違えて押しました。

      補足日時:2015/07/06 10:08

A 回答 (7件)

こんばんは。



>17人の生徒がいる教室で、ランダムに生徒を当てて、当たった回数を記録し、平等に当てる
初心者で、VBAは習ったばかりでは、これが出来るのは、10人に1人がいいところではないでしょうか?
>当方VBAの勉強を始めたばかりでして、超初心者にわかりやすく説明していただけると非常に助かります。
勉強し始めたばかりで、いきなり、このようなものに手を出すのは、無理だと思います。
なるべく簡単なコードを書いてみましたが、私は、説明するのは苦手です。関数もいくつも入っていますから、なんとなくわかるかと思います。

丸々コードを出して云々という声もないわけではないのですが、こちらもあくまでも、人のためではなく、自分のための練習です。まあ、別の掲示板の何人かは、こちらが稼働チェック済みのコードを掲示しても、動かない、エラーが出ると言って、そのまま没にしてしまうくらいの人もいるのですから、これが分かれば、それで十分だと思います。これを参考にしようがしまいが、それは自由です。ただ、初心者であろうが、そうでなかろうが、マクロの数をこなすしか、上達の道はありません。数をこなしていくなかで、覚えていくもので、理屈では、覚えるものではありません。


'//
Sub RandomAverage()
 Dim i As Long
 Dim num As Long
 Dim num2 As Long
 '初期設定
 If Range("D18").Value = "" Then
  For i = 1 To 17
   Cells(i, 1).Value = i
  Next i
  Range("D18").Formula = "=COUNT(R[-17]C:R[-1]C)"
  Range("D19").Formula = "=SUM(R[-18]C:R[-2]C)/ROWS(R[-18]C:R[-2]C)"
 End If
 
 '17番目まで全部当てたら、更新する
 num = WorksheetFunction.CountA(Range("D1:D17"))
 num2 = WorksheetFunction.Count(Range("D1:D17"))
 If Range("D18").Value Mod 17 = 0 And num2 - num = 0 Then
  If Range("E1").Value <> "" Then
   MsgBox "全部当て終わりましたので、データを移します。"
  End If
  
  For i = 1 To 17
   Cells(i, 5).Value = Cells(i, 5).Value + Cells(i, 4).Value
   Cells(i, 4).ClearContents
   num = 0
  Next i
  
  Randomize
  For i = 1 To 17
   Cells(i, 2).Value = Rnd()
   Cells(i, 3).Formula = "=RANK(RC[-1],R1C2:R17C2,1)"
  Next i
 End If
 '次の番に'N'をつける
 For i = 1 To 17
  If Cells(i, 4).Value = "N" Then
   Cells(i, 4).Value = 1
  End If
  If Cells(i, 3).Value = num + 1 Then
   Cells(i, 4).Value = "N"
  End If
 Next i
 If num2 < 16 Then
  MsgBox "Nが、次の人です。" & vbCrLf & _
  "D19の値が正数になるように目指しましょう!"
 ElseIf num = 17 Then
  MsgBox "次は、更新します。"
 End If
End Sub
'///
「VBA、最小値を取得し乱数を発生し最小値」の回答画像7
    • good
    • 0
この回答へのお礼

こんにちは。
ちゃんと動きました。
ありがとうございました。

書いていただいたコードを読めるようちゃんと勉強します。

お礼日時:2015/07/13 14:13

ANo.5へのコメントについてです。



「ランダム」とは「統計的に偏りがない」という理想状態のことですが、お求めなのはそんなゲンミツな話ではなくて「次に当たる人がなるべく予想できない」程度のことじゃないんでしょうか。だとすれば、

「あいつまだn回しか当たってないのに何でオレはn+2回目?」という状況が生じてはならない。この条件のもとで可能な選択肢の中から、次に当たる人がなるべく予想できないように選ぶ。

ということですかね。

 (VBAだろうが何だろうが)「何をやりたいか」を正確に記述するということが出来なければ、プログラミングは始まりません。「細かい事は常識で分かるんじゃない?」に頼ってるうちはプログラムは書けない。VBAを勉強する以前に身につけるべきことがある訳です。

 さて、実務でお困りであってこのご質問が出たのだとすれば、「VBA」と仰る理由がよく分かりません。というのは、Excelのワークシート上だけでできるから。「n回目に誰を当てるか(n=1,2,…,17)」の予定表を作る(予定表を使い終わったら、(つまり全員が1度づつ当たったら)同じワークシートで次の17回分の予定表を作る)、というやりかたで充分でしょ。

 一方、もしVBAの練習問題として取り組んでいらっしゃるんであれば、答を丸っぽ教わったってしょうがない。ご自分で作った(うまく行かない)プログラムを示した上で、どこがどうダメなのかを教わるべきです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2015/07/13 14:14

VBA云々以前に、「ランダム」「平等」ってどういう意味で仰ってるのか。


 普通の意味でランダムに当てたら、「あいつまだ1回も当たってないのに何でオレは2回目?」ということが起こる確率は1に非常に近い。で、『「あいつまだ1回も当たってないのに何でオレは2回目?」が生じるようでは「平等」でない』のだとすると、「ランダム」と「平等」は両立できません。(逆に言えば、「あいつまだ1回も当たってないのに何でオレは2回目?」が生じないようにしながら16回当てれば、17回目に当てるべき生徒はひとりしか残っていない。だから、17回目にはランダム性が全くない。)
 どういうことをやりたいのかを正確に仰らないとね。
    • good
    • 0
この回答へのお礼

ありがとうございます。
そうですね、書き方が悪かったです。
ランダムに当てるのですが、当たった回数の少ない人の中から先にランダムに当てて平等にするということなのです。

お礼日時:2015/07/09 10:27

>名前の順番を変えずにできればうれしい



であればc1に「rank」とかいてc列を順位用列にし
c2に「=RANK(B2,B$2:B$18)」と記入したうえで、c2をc18までコピーしておきます。

そのうえで、さきほどのマクロを実行して、c列の1番から順番にさしていき
17番までさしたらまたランダムを実行する
・・・というながれが妥当でしょう。

なお万が一B列が見た目じゃまだというなら列の非表示にすれば済む話です。
    • good
    • 0
この回答へのお礼

ありがとうございます。
rank列を作成しました。
rankの列の当たった回数の少ない人から先に当てていくのに、メッセージボックスに回数の少ない人の中から一人選び出すことはできますか?

お礼日時:2015/07/09 10:25

>VBAの記述を詳しく



まずa1にname、b1にsortとかいてヘッダ行とします
a2から順にa3,a4・・・と、x01,x02,x03・・・x17とします。

こうしてマクロとして
For i = 2 To 18
Cells(i, 2) = Rnd
Next
を記述して、実行すると、B列に0~1のランダムな数字がはいりますので
B列をつかってソートするとA列がランダムになります。
あとは上から順に当てていけばよいでしょう
    • good
    • 0
この回答へのお礼

ありがとうございます。
もうしわけありません、できれば、名前の順番を変えずにできればうれしいです。

お礼日時:2015/07/06 14:44

一案です


  A   B     C      D
 氏名 当った回数 ランダム数値 次にあてる生徒

とデータがあったとして
B列に、当った回数を入れる 仮に 1 とか
C列に
=B2+Rand()
と入れて下までコピー
D2セルに
=INDEX(A:A,MATCH(MIN(C:C),C:C,0))
と入れておけば、次にあてる生徒の名前がランダムに出ます。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
私の書き方がは悪かったようです。
VBAでしなさいということですので、せっかく回答いただいたのに申し訳ございませんでした。

お礼日時:2015/07/06 09:11

生徒をランダムにあてるだけなら


生徒の横にソート用の欄をつくっておいて
forでcells(m,n)に対してrndを投入し
結果をソートして上から順に当てていけばいいでしょう。
あてた数を記録しなくても1セット分の処理が終わった時点で
あてた数は均一になるはずです
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
当方VBAを始めたばかりでして、VBAの記述を詳しく書いていただけるととても助かります。
申し訳ございません、よろしくお願いいたします。

お礼日時:2015/07/06 09:14

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