Вероятность c Случайный выбор из Dynami c Массив - PullRequest
1 голос
/ 27 мая 2020

Я новичок в 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

1 Ответ

0 голосов
/ 27 мая 2020

Ваше решение Dynami c не работает, потому что arrayPrice и arrayProPrice не являются одномерными массивами, как ожидалось в RandItem, а являются двумерными. Это связано с тем, что диапазоны Excel обычно могут иметь несколько строк и несколько столбцов, поэтому методы .Value2 и .Value возвращают матрицу.

Например, если в вашем листе Excel у вас есть A2 = 1, A3 = 2 и A4 = 3, тогда arrayPrice будет Array(Array(1), Array(2), Array(3)).

Вам сначала нужно будет сгладить эту матрицу до одномерного массива перед вызовом RandItem. То же самое касается arrayProPrice.

Вы можете использовать функцию Excel, чтобы облегчить это:

arrayPrice = Application.Transpose(Range("A2:A" & LastRow))
arrayProPrice = Application.Transpose(Range("B2:B" & LastRow))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...