Excel中随机值生成器的VBA脚本包含的值不在数组中

时间:2016-05-28 22:55:08

标签: arrays excel vba excel-vba

我创建了一个随机数生成器应该从中拉出的数组。数组在工作表上,如果左侧的列的值为1(1表示正在播放,0表示不播放),则包含列中的值。当我测试10个数字表示播放时,一切似乎都在工作,1000个数字表示没有播放,当数字从1-1500开始时,数字数组中包含0。 这是代码:

Sub RandArray()

Dim RandArray As Variant, cell As Range
ReDim RandArray(0)
For Each cell In Worksheets("Registration").Range("B:B").Cells
    If cell.Value = "1" Then
        RandArray(UBound(RandArray)) = cell.Offset(0, 1).Value
        ReDim Preserve RandArray(UBound(RandArray) + 1)
    End If
Next cell
ReDim Preserve RandArray(UBound(RandArray))
Range("A27").Value = WorksheetFunction.RandBetween(LBound(RandArray), UBound(RandArray))

End Sub

2 个答案:

答案 0 :(得分:0)

在VB6中[Re]Dim array(N)定义一个数组,其中 N + 1 元素 1 ,0,1,...,N。 ReDim Preserve RandArray(UBound(RandArray) + 1)正确地利用了这个事实,将数组增加了一个元素。

ReDim Preserve RandArray(UBound(RandArray))但是不正确:让 N +1为RandArray的元素数量,然后UBound(RandArray) N ,最后一个有效索引;因此ReDim Preserve RandArray(UBound(RandArray))相当于ReDim Preserve RandArray(N),但仍有 N + 1个元素。

要摆脱虚假的最后一个null元素,请使用ReDim Preserve RandArray(UBound(RandArray)-1)

缩小数组

1 假设没有Option Base 1

答案 1 :(得分:0)

如果你想要RandArray的随机元素:

RequestHandler

(您的代码只是获得一个随机索引)
我也会用:

Range("A27").Value = RandArray(WorksheetFunction.RandBetween(LBound(RandArray), UBound(RandArray)))

加快速度。