#5です。
前期の方法は、各桁中の数字の比率も同じに・・・、と誤解して書いていました。ので、訂正します。
ただ、乱数を出しながら比率を合わせていくよりも、最初から希望する比率分の数字を決めた方が効率的だと思います。たとえば、よくきったトランプを4枚ずつ並べると4桁の乱数みたいになります。この方式でマクロを書きました。
セル範囲A1:A10に、0から9を入れます。
セル範囲をオートフィルで右へ必要な桁数だけコピーします。例えばH列までコピーすると8桁の数字が出来ます。下記のマクロを実行するとシャッフルされた表と、表を変換した数字が出来上がります。
このマクロはA1にかかる表を、その列数の桁の数字に変換します。左端に0がでた場合は、乱数を元に位置を変えますので、出来上がる数字の桁は必ず揃います。8桁の数字が100個欲しい場合は、上記の例のものを9個下へコピーしてからマクロを実行すればいいわけです。
# 元になる表中に空白のセルがあると、そのセルの値は0とみなされます。表の周囲のセルには何も記入しないでください。同じ数字が複数できたかどうかのチェックはしていません。
# ご質問の趣旨を逸脱した内容ですみません。余計なお世話かな~と思いながら、ボケ防止のために書いております。
Sub Shuffle2()
Dim myRange As Range, c As Range, rC As Integer, cC As Byte
Dim Rv As Byte, i As Integer, n As Integer, lC As Currency
Dim k() As Byte, d As Currency
With Range("A1").CurrentRegion
rC = .Rows.Count
cC = .Columns.Count
lC = .Cells.Count
Set myRange = .Offset(0, cC + 1)
myRange.Value = .Value
End With
ReDim k(lC)
For Each c In myRange
i = i + 1
k(i) = c.Value
Next c
Do
i = Int((lC - 1 + 1) * Rnd + 1)
n = Int((lC - 1 + 1) * Rnd + 1)
Rv = k(i)
k(i) = k(n)
k(n) = Rv
d = d + 1
Loop Until d = lC * 300
i = 0
For Each c In myRange
i = i + 1
c.Value = k(i)
Next c
If cC = 1 Then Exit Sub
With Application.WorksheetFunction
Do While .CountIf(myRange.Columns(1), 0) > 0
i = .Match(0, myRange.Columns(1), 0)
If .CountIf(myRange.Rows(i), 0) = cC Then
MsgBox "0 が出来てしまいました、途中ですが終了します。"
Exit Sub
End If
Set c = .Index(myRange, i, Int((cC - 1 + 1) * Rnd + 1))
myRange.Columns(1).Rows(i).Value = c.Value
c.Value = 0
Loop
End With
i = 0
Do
n = cC
i = i + 1
d = 1
lC = 0
Do
lC = lC + myRange.Rows(i).Columns(n).Value * d
d = d * 10
n = n - 1
Loop Until n = 0
myRange.Rows(i).Columns(cC + 1).Value = lC
Loop Until i = rC
Columns(cC * 2 + 2).NumberFormatLocal = "_ * #,##0_ ;_ * -#,##0_ ;_ * ""-""_ ;_ @_ "
End Sub
お礼
本当に、ご丁寧に解説していただきありがとうございます。