Я новичок в VBA. У меня есть 2 списка, список цен и список вероятностей, назначенных цене. Мне нужно создать список из 300 чисел на основе группы вероятностей. Однако я не могу заставить его работать. Я скопировал код с другого поста:
Function RandItem(items As Variant, probs As Variant) As Variant
Dim i As Long, sum As Double
Dim spin As Double
spin = Rnd()
For i = LBound(probs) To UBound(probs)
sum = sum + probs(i)
If spin <= sum Then
RandItem = items(i)
Exit Function
End If
Next i
'if you get here:
RandItem = items(UBound(probs))
End Function
А также
Sub test()
Randomize
Dim i As Long, v As Variant
ReDim v(1 To 50)
For i = 1 To 50
v(i) = RandItem(Array(1, 2, 3, 4, 5), Array(0.26, 0.18, 0.26, 0.2, 0.1))
Next i
Debug.Print Join(v)
End Sub
, чтобы адаптироваться к моему коду. Однако проблема в том, что диапазон цен растет, а вероятность со временем меняется (из-за исторического веса). Поэтому я попытался переключить:
RandItem(Array(1, 2, 3, 4, 5), Array(0.26, 0.18, 0.26, 0.2, 0.1))
на
Dim i As Long, v As Variant
Dim LastRow As Long
Dim arrayPrice As Variant
Dim arrayProPrice As Variant
LastRow = Cells(Rows.Count, "A").End(xlUp).Row
arrayPrice = Range("A2:A" & LastRow).Value2
arrayProPrice = Range("B2:B" & LastRow).Value2
ReDim v(1 To 300)
For i = 1 To 300
v(i) = RandItem(arrayPrice, arrayProPrice)
Next i
Debug.Print Join(v)
End Sub
, и он вернул: Ошибка времени выполнения «9»: индекс вне допустимого диапазона. У кого-нибудь есть предложения, как это исправить, чтобы я мог использовать переменные массива вместо перечисления всех диапазонов цен?
Кредиты: Генерация чисел с определенными вероятностями визуальные основы vba