アプリ版:「スタンプのみでお礼する」機能のリリースについて

指定した範囲(例:100~200)から10個、重複しない乱数を生成したいのですが、どのようなマクロを書けばよいでしょうか。

ループを使い、重複があれば結果を一度消して再生成、と思ったのですが、時間がかかる上Excelが落ちることがあります。

できるだけ簡単なコードでこのプログラムを書きたいのですが、知恵をお貸しください。
コード自体の投稿、または関数名での説明、どちらでもOKです。

A 回答 (8件)

お望みの特定範囲内の「重複しない」乱数を生成するコードを書きます。



Dim A,B,AA,BB

A:発生させた特定範囲内の乱数
B:目的成果品の数
AA:発生させた特定範囲内の乱数の全て
BB:発生させた特定範囲内の乱数の内、重複していないものの集合(成果品)

AA=""
BB=""
B=0
Do
A=Int(101*Rnd+100)
AA=AA & "\" & A & "/"
IF Instr(AA,"\" & A & "/")=0 Then
BB=BB & "\" & A & "/"
B=B+1
Endif
Loop Until B=10

BBから成果品を取り出す方法又は、成果品の表示方法等はご自身でお考え下さい。
"\""/"はどんな文字列でもOK
    • good
    • 0
この回答へのお礼

一番自在に設定を弄れる回答でしたので、これをベストアンサーとします。
皆様ありがとうございました。

お礼日時:2011/10/26 00:02

No5の訂正



記憶は、"189"という感じでよい。
取り出しは、mid関数でよい。
なお、その都度表示するのであれば取り出し不要。
    • good
    • 0

回答1の方法がいちばん確実に素早くコタエを引き出せます



簡単な応用:
sub macro1()
 worksheets.add
 range("B1:B101").formula = "=RAND()"
 with range("A1:A10")
  .formula = "=RANK(B1,B:B)+99"
  .value = .value
 end with
 range("B:B").clearcontents
end sub

バリエーション:
sub macro2()
 worksheets.add
 with range("A1:A101")
  .formula = "=ROW(A100)"
  .value = .value
 end with
 range("B1:B101").formula = "=RAND()"
 range("A:B").sort key1:=range("B1"), header:=xlno
 range("A11:A101,B1:B101").clearcontents
end sub


参考:こういうのは条件を厳しくしていくとどんどん脱出できなくなる
sub macro3()
 range("A1:A10").formula = "=RANDBETWEEN(100,200)"
 range("B1").formula = "=COUNT(1/FREQUENCY(A:A,A:A))"
 do until range("B1") = 10
  activesheet.calculate
 loop
 range("A1:A10").value = range("A1:A10").value
end sub
    • good
    • 0

Do


  intNum <- ランダムに生成した整数値
If strNum に inuNum が含まれない then
    strNum <- sytNum & "," & intNum & ","
N <- N + 1
    If N > 9 Then
      Exit Do
    End If
  End If
Loop Until (0)

私ならば、",1,9,8,"と生成した整数を文字列として記憶します。
比較では replace を使い、取り出しにはCutStr関数の類を利用します。

? CutStr(",1,9,8,", ",", 2)
1
? CutStr(",1,9,8,", ",", 3)
9
? CutStr(",1,9,8,", ",", 4)
8

Private Function CutStr(ByVal Text As String, _
            ByVal Separator As String, _
            ByVal N As Integer) As String
  Dim strDatas() As String

strDatas = Split("" & Separator & Text, Separator, , 0)
CutStr = strDatas(N * Abs(N <= UBound(strDatas))))
End Function
    • good
    • 0

mougの即効テクニックにサンプルマクロがあります。


≪参考≫
重複を許可せず、ランダムな数をセルに代入する
http://www.moug.net/tech/exvba/0050060.htm
    • good
    • 0

No.2は重複しないって条件が抜けてますね。



まあ、重複したら再度でいいと思うのですけどそんなにめんどくさいですかね。
Forじゃなくてwhileでやればあまり悩まないと思いますけど。

どうしてもというなら乱数の範囲を100から99と毎回減らして、既に出た乱数を元にマッピングすればいいと思いますけど、多重ループになってかえってめんどくさいですね。

この回答への補足

乱数の範囲を減らすのではなく、指定範囲の整数でデータベースを作成し、一つとって消す、という方が簡単かもしれませんね(範囲が少なければ、ですが)。

whileとuntilではほぼ同じことができますが、どちらの方が安定性がいいでしょうか。

補足日時:2011/10/24 20:34
    • good
    • 0

VBA1を習う一番最初に習う基本的なものです。


本を買って勉強するほうが先だと思いますが・・・。

Sub ransu()
For t = 1 To 10
r = Int(Rand() * (200-100) + 100)
Print r
Next t
End Sub

この回答への補足

これは単なる「範囲からの乱数生成」では?
これなら分析ツールの「RANDBETWEEN」を使えば、VBAを使わずに同じことができると思います。

補足日時:2011/10/24 20:30
    • good
    • 0
    • good
    • 0

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