|
楼主 |
发表于 2013-3-17 19:40
|
显示全部楼层
香川群子 发表于 2013-3-17 19:13
出错信息是什么?
代码在哪里停下?
Sub RndNumCol()
tms = Timer
Dim Mx&, Mn&, Rs&, Col%, Fs%
Dim i&, j&, k&, n%, f&, rw&, cl%, r&, c%, c1%, c2%
Mx = Range("Mx"): Mn = Range("Mn"): If Mx <= Mn Then MsgBox "嵟戝悢昁戝槹嵟彫悢.": Exit Sub
Rs = Range("Rs"): If Rs < 1 Or Rs > 1048576 Then MsgBox "峴悢乮1-1048576)": Exit Sub
If Rs Mod (Mx - Mn + 1) Then MsgBox "惗惉峴悢惀帤悢揑攞悢": Exit Sub
Col = Range("Col"): If Col < 1 Or Col > 256 Then MsgBox "楍悢": Exit Sub
ReDim Arr(1 To Rs, 0 To Col)
' Bs = Rs / (Mx - Mn + 1) '攞悢=庢悢槩悢揑攞悢
For j = 1 To Rs / (Mx - Mn + 1)
For i = Mn To Mx
k = k + 1
Arr(k, Col) = i
Next
Next
lxs = Range("LXS"): c1 = Range("CSX"): c2 = Range("CSS")
n = UBound(lxs)
Randomize
Application.DisplayAlerts = False
Application.ScreenUpdating = False
For f = 1 To Range("Fs")
Workbooks.Add 1
For cl = 0 To Col - 1
For rw = Rs To 1 Step -1
r = Int(Rnd * rw) + 1
Arr(rw, cl) = Arr(r, Col) 't=r
Arr(r, Col) = Arr(rw, Col) 'r=rw
Arr(rw, Col) = Arr(rw, cl) 'rw=t
Next
c = Int(Rnd * (c2 - c1 + 1) + c1)
crr = GetRndAvg(1, Rs - n + 1, c, , n)
For c = 1 To c
r = crr(c) - 1
For k = 1 To n
Arr(r + k, cl) = lxs(k, 1)
Next
Next
Next
ActiveSheet.Cells(1, 1).Resize(Rs, Col) = Arr
ActiveWorkbook.SaveAs ThisWorkbook.Path & "\" & f '& ".xlsx" 调试时,指向这里,变为黄色了。
ActiveWorkbook.Close
Next
Application.ScreenUpdating = True
MsgBox Format(Timer - tms, "0.000s")
End Sub
Function GetRndAvg(a, b, m, Optional d = 0, Optional h = 1, Optional s = 0) '嬫娫巜掕嬒鷫悘婘晄廳暋拪?
Randomize
' Dim i&, n&, r&, t&
a = a * 10 ^ d: b = b * 10 ^ d
ReDim c(1 To m)
If b - a < m * h Then c(1) = a Else c(1) = Int(((b - a + 1) / m - h) * Rnd()) + a
If m = 1 Then GetRndAvg = c: Exit Function
' n = 0
Do
n = n + 1
If b - c(n) < (m - n) * h Then
If c(n) + h <= b Then
c(n + 1) = c(n) + h
Else
GoTo Ext
End If
Else
c(n + 1) = c(n) + Int(((b - c(n) + 1) / (m - n) - h) * Rnd() * 2) + h
End If
Loop Until n = m - 1
c(m) = c(n) + Int((b - c(n) + 1 - h) * Rnd()) + h
Ext:
If s = 0 Then
For i = 1 To m '惓彉愻攙
r = Int((m - i + 1) * Rnd()) + i
t = c(r): c(r) = c(i): c(i) = t / 10 ^ d
Next
ElseIf s = -1 Then
For i = 1 To m \ 2 '搢彉岎?
t = c(m - i + 1) / 10 ^ d: c(m - i + 1) = c(i) / 10 ^ d: c(i) = t
Next
If m Mod 2 = 1 Then c(i) = c(i) / 10 ^ d
Else
For i = 1 To m '惓彉
c(i) = c(i) / 10 ^ d
Next
End If
GetRndAvg = c
End Function
|
|