
No.6ベストアンサー
- 回答日時:
こんなのはいかがでしょうか?
--------------------------------------------------------------------------------
Sub 乱数発生()
Dim 行 As Long
Dim 有(0 To 99) As Boolean
Dim 仮 As Long
For 行 = 1 To 100
Do
仮 = Int(100 * Rnd)
Loop Until 有(仮) = False
Cells(行, 1).Value = 仮
有(仮) = True
Next
For 行 = 1 To 100
Select Case Cells(行, 1).Value
Case Is < 30
Cells(行, 1).Value = 1
Case Is < 55
Cells(行, 1).Value = 2
Case Is < 75
Cells(行, 1).Value = 3
Case Is < 90
Cells(行, 1).Value = 4
Case Else
Cells(行, 1).Value = 5
End Select
Next
End Sub
--------------------------------------------------------------------------------
ありがとうございます!
行ごとに1~100でランダムを取って、その数に応じて1~5を当てはめる。
次の行では上の行で出た値を除いて1~100のランダムを取って1~5を当てはめる。
これを100行繰り返す。
といった感じでしょうか。
違っていたらすみません。
これなら1~5の数字の出る回数を変更することも簡単にできそうです。
ありがとうございます!

No.12
- 回答日時:
No6の方が既に回答を書いてますが、別解です。
標準モジュールに登録してください。
表示されているシートのA1~A100に1~5の値を割り当てます。(割り当てる回数は30, 25, 20, 15, 10個です)
Option Explicit
Public Sub ランダム割り当て()
'1~5の数字をA1~A100に割り当てる
Dim ar0 As Variant
Dim ar1 As Variant
Dim maxelm As Long
Dim i As Long
Dim j As Long
Dim ix As Integer
ar0 = Array(1, 2, 3, 4, 5) '表示したい数 1,2,3,45
ar1 = Array(30, 25, 20, 15, 10) '表示したい数(1,2,3,4,5)に割り当てる出現回数(合計が100になること)(出現回数を変える場合はこの値を変えること)
maxelm = 4
Randomize '乱数初期化
For i = 1 To 100
ix = Int(Rnd * (maxelm + 1))
Cells(i, "A").Value = ar0(ix)
ar1(ix) = ar1(ix) - 1
If ar1(ix) = 0 Then
For j = ix To maxelm - 1
ar1(j) = ar1(j + 1)
ar0(j) = ar0(j + 1)
Next
maxelm = maxelm - 1
End If
Next
End Sub
No.11
- 回答日時:
No.5です。
>結果はA列に一列に出ると嬉しいです。
No.6さんのコードがスマートなので似たような感じになりました。
Sub Sample2()
Dim i As Long, c As Range, myNum As Long
Dim myFlg(1 To 100) As Boolean
Randomize
For Each c In Range("A1:A100")
For i = 1 To 100
Do
myNum = Int(100 * Rnd + 1)
Loop Until myFlg(myNum) = False
Next i
Select Case myNum
Case Is <= 30
c = 1
Case Is <= 55
c = 2
Case Is <= 75
c = 3
Case Is <= 90
c = 4
Case Else
c = 5
End Select
myFlg(myNum) = True
Next c
End Sub
※ やり方はNo.6さんと同じやり方です。
まず、1~100までの乱数を重複なしに発生させ
結果が
30以下の場合 → 1
55以下の場合 → 2
75以下の場合 → 3
90以下の場合 → 4
100以下(上記以外)の場合 → 5
にしています。m(_ _)m
No.9
- 回答日時:
No.6 のお礼について
No.7にも書きましたがちょっと違っています。もう少し説明すると
1回目のループは
① 乱数を発生させそれを100倍した物の整数の部分だけ取り足します
② 0~99が使われたかのフラグ(変数「有()」)を見て使われていなければセルに仮数としてセットして次の行へ
③ 使われていたら①から繰り返します
④ 100行目まで繰り返します(0~99の重複の無い乱数が仮にセットされています)
2回目のループは
⑤ 仮の数値が30未満だったら「1」をセットします
⑥ 仮の数が30以上55未満ならば「2」をセットします
⑦ 仮の数が55以上75未満ならば「3」をセットします
⑧ 仮の数が75以上90未満ならば「4」をセットします
⑨ 仮の数が90以上なら「5」をセットします
※ 2回目のループはご察しの通りです。
詳しい説明ありがとうございます!とても分かりやすいです。
もう一つ、
もし仮に、全体数を100から148など中途半端な数に増やした場合についてです。
この場合乱数を100倍するだけではうまくいかなくなる気がするのですが、こういった場合はどうするのが良いのでしょうか?
何度もすみません。
No.5
- 回答日時:
こんばんは!
VBAになりますが、一例です。
>100個のセルに・・・
A1~J10セルの範囲としました。
Sub Sample1()
Dim i As Long, k As Long, cnt As Long
Dim c As Range, myNum As Long
Dim myFlg(1 To 100) As Boolean, myAry
myAry = Array(1, 2, 3, 4, 5)
For k = 0 To UBound(myAry)
Select Case myAry(k)
Case 1
Do Until cnt = 30
cnt = cnt + 1
Cells(cnt, "K") = myAry(0)
Loop
Case 2
Do Until cnt = 55
cnt = cnt + 1
Cells(cnt, "K") = myAry(1)
Loop
Case 3
Do Until cnt = 75
cnt = cnt + 1
Cells(cnt, "K") = myAry(2)
Loop
Case 4
Do Until cnt = 85
cnt = cnt + 1
Cells(cnt, "K") = myAry(3)
Loop
Case Else
Do Until cnt = 100
cnt = cnt + 1
Cells(cnt, "K") = myAry(4)
Loop
End Select
Next k
Randomize
For Each c In Range("A1:J10")
For i = 1 To 100
Do
myNum = Int(100 * Rnd + 1)
Loop Until myFlg(myNum) = False
Next i
c = Cells(myNum, "K")
myFlg(myNum) = True
Next c
Range("K:K").ClearContents
End Sub
※ K列を作業列として使用していますので、
K列は使っていない状態にしておいてください。
※ どこかの列にあらかじめ 1を30、2を25、3を20・・・
と羅列しておけばもっと短いコードで可能です。m(_ _)m
回答ありがとうございます!
試してみたところ、4が10個、5が15個あるようです。
多分ですが、
Do Until cnt = 85
の部分を90にすれば問題ないのですかね?
間違っていたらすみません。
ちなみに、どこかの列にあらかじめ数字を入れておく場合だとどのようになるのでしょうか?
また、結果はA列に一列に出ると嬉しいです。
注文が多くて申し訳ないです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelについて Excel初心者です。 日報に数字を入力する時、誤った数字を入れると、セルが赤く 6 2023/03/31 17:05
- Excel(エクセル) COUNTIFSについて 2 2022/08/30 14:48
- パチンコ・スロット パチンコ当たり抽選 3 2022/04/20 23:26
- Excel(エクセル) エクセルの数式で教えてください。 1 2022/07/08 13:46
- Excel(エクセル) Excelに文字データのみを貼り付けたい 8 2023/05/03 15:38
- Visual Basic(VBA) ExcelのVBAを使い、複数シートの同一箇所を、同一条件にて一括でソルバーを回す方法について 1 2022/04/23 11:49
- Excel(エクセル) Excelの文字列を数字に変換する方法について 6 2023/07/31 21:18
- Excel(エクセル) エクセルの数式で教えてください。 1 2022/10/25 09:26
- その他(Microsoft Office) ある表(10桝程度)の中に数字が入っています。ダブっている数字を除く数字の合計数の計算方法 5 2023/02/15 11:33
- Excel(エクセル) Excelで数式をそのままコピーしたい どうすればいいですか? 4 2022/09/16 02:16
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelのフィルター後の一番上の...
-
EXCELで最後の行を固定
-
エクセルで特定の文字列が入っ...
-
EXCELマクロを使い、空白行では...
-
直近の5個の平均を求めたい
-
連続データが入った行の一番右...
-
特定の文字がある行以外を削除...
-
Excelで非表示のセルをとばして...
-
VBA 曜日に色がついている列は...
-
xls:CopyFromRecordset罫線描写
-
エクセルVBAのEntireRow.Hidden...
-
エクセル クリックでセルの色...
-
一気にセルの結合できますか?
-
Excel2003枠を作るマクロ
-
[EXCEL]ボタン押す→時刻が表に...
-
マクロで範囲指定をするには
-
Excellマクロで数値0と空白部分...
-
Val関数をVBAで使うには?
-
エクセルで、列内の連続した文...
-
エクセル2003での行(列)の自...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
特定の文字がある行以外を削除...
-
【Excel関数】UNIQUE関数で"0"...
-
エクセル 上下で列幅を変えるには
-
[EXCEL]ボタン押す→時刻が表に...
-
Excelのフィルター後の一番上の...
-
エクセルで特定の文字列が入っ...
-
excelのデータで色つき行の抽出...
-
エクセル マクロで数値が変っ...
-
Excel グラフのプロットからデ...
-
結合されたセルをプルダウンの...
-
エクセル マクロ オートフィ...
-
excel 小さすぎて見えないセル...
-
Excel ウインドウ枠の固定をす...
-
EXCELで最後の行を固定
-
電話番号の入力方式が違うデー...
-
エクセルVBA 最終行を選んで並...
-
エクセルのセルに指定画像(.jpg...
-
エクセル 時間の表示形式AM/PM...
-
連続データが入った行の一番右...
-
Excelで非表示のセルをとばして...
おすすめ情報