|
こんにちは。
コピペについては、うまくいきました。ありがとうございました。
漢字にする部分と送りがなのある部分ときちんと分けて表示することができました。
疑問の残るところはありますが……
ついでにといっては何ですが、乱数(重複なし)のことです。
ネット上で見つけた下記のコードですがどうも怪しいです。時々同じ数字がでるような気がするのです。
Sub rannsuu()
Dim i As Integer
Dim n As Integer
Dim stri(1 To 20) As String
Dim p As Integer
Dim t As Integer
Dim numtmp As String
For p = 1 To 20
t = 99
i = Int(Rnd * t) + 1
If i < 10 Then
stri(p) = "0" & i
Else
stri(p) = i
End If
numtmp = stri(p)
Do While InStr(1, numtmp, stri(p)) > 0 'numtmpにstriが含まれてる間シャッフルを繰り返す
i = Int(Rnd * t) + 1
If i < 10 Then
stri(p) = "0" & i 'この処理を行わないと完全にシャッフルにならないっぽい
Else
stri(p) = i
End If
Loop
Next
End Sub
過去ログに(コレクションを使った方法)もあったのですが、
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=15434;id=excel
コレクションを理解していないためによくわかりませんでした。
そこで、セルを使った方法を考えました。
Sub 乱数2()
Dim rndNO As Integer
Dim myRange As Range
Dim hani AS Range
Dim p As Integer
Dim t As Integer
For p = 1 To 20
t = 30
Set myRange = Sheet4.Cells(p, 1)
Set hani = myRange.CurrentRegion
Randomize
rndNO = Int(Rnd() * t) + 1 '1からtまでの乱数の発生
Do Until WorksheetFunction.CountIf(hani, rndNO) < 2 '同じ数字が出たら、 違うまでループ
rndNO(p) = Int(Rnd() * t) + 1
myRange = rndNO
Loop
Next
End Sub
バッチリだったのですが、ここまでできたら、シートを使わないで何とかならないものかと、配列を使って考えたのですが、
Dim rndNO(1 To 20) As Integer
Dim intNO As Integer
Dim p As Integer
Dim t As Integer
For p = 1 To 20
t = 30
Randomize
rndNO(p) = Int(Rnd() * t) + 1 '1からtまでの乱数の発生
intNO = rndNO(p)
Do Until rndNO(p) <> intNO '同じ数字がでたら、違うまでループ
↑
ここの式が思いつかないしわからない。
rndNO(p) = Int(Rnd() * t) + 1
intNO = rndNO(p)
Loop
Next
コレクションを勉強したらなんていわないで、この配列を使って何とかならないものでしょうか。
rndNO(p)が、今まで作った配列の中にあるかないかを調べるような式や関数をどなたか教えていただけないでしょうか? このコードからは無理ならば、諦めてシートを使います。
よろしくお願いします。
|
|