Как заполнить диапазон значениями, которые зависят от предыдущего значения?

«Я пытаюсь заполнить именованный диапазон доходом. Первая ячейка именованного диапазона уже имеет значение и представляет текущий год (год 0) дохода. Я хочу использовать случайный стохастический процесс для прогнозирования дохода за 1-й год, используя доход за 0-й год. А затем спрогнозируйте доход за 2-й год, используя доход за 1-й год. Моя проблема в том, что все ячейки диапазона получают начальное значение дохода года 0.

Sub RevenuePathSimulation()

Range("starttime") = Time
Dim RR As Variant
RR = Array()

Dim N As Double
N = Range("runs").Value
Dim years As Double
years = Range("RevRng").Count
Dim mean As Long
mean = Range("mean")
Dim sigma As Long
sigma = Range("sigma")
Dim i As Integer
Dim j As Integer

For j = 2 To years
    RR(1, j) = RR(1, j - 1) * Exp(mean + sigma * Rnd())
    Range("RevRng").Value = RR(1, j)
    Debug.Print RR(1, j)
Next j
Range("stoptime") = Time

End Sub

    ' The end result is to have revenues for years 0 to 10
    ' derived from a random stochastic process.

person user3693832    schedule 25.08.2019    source источник
comment
В чем именно заключается ваш вопрос или проблема?   -  person BigBen    schedule 25.08.2019
comment
Ну, в настоящее время код не заполняет именованный диапазон RevRng значениями. Именованный диапазон RevRng состоит из 12 пустых ячеек. Первая ячейка уже имеет значение. Мне нужно заполнить остальные ячейки значениями слева направо, используя предыдущее значение и случайный стохастический процесс. В настоящее время это не работает   -  person user3693832    schedule 25.08.2019


Ответы (1)


Эта строка:

RR(1, j) = RR(1, j - 1) * Exp(mean + sigma * Rnd())

обновляет массив (RR — это массив, а не диапазон).

Если вы хотите, чтобы ячейки на рабочем листе обновлялись, запишите массив обратно на лист после цикла и до завершения подпрограммы:

Range("RevRng").Value = RR

В противном случае, я думаю, что вы сделали некоторые данные с листа, выполнили некоторые вычисления, а затем позволили результатам выйти за рамки (когда подпрограмма заканчивается) без обновления листа с вычисленными результатами.

В целом код может выглядеть примерно так:

Option Explicit

Sub RevenuePathSimulation()

    Dim RR As Variant
    Dim N As Double
    Dim years As Double
    Dim mean As Long
    Dim sigma As Long
    Dim i As Integer
    Dim j As Integer

    Range("starttime") = Time
    Range("RevRng") = Array()
    RR = Range("RevRng")
    N = Range("runs").Value
    years = Range("RevRng").Count
    mean = Range("mean")
    sigma = Range("sigma")

    For i = 1 To N
        For j = 2 To years
            RR(1, j) = RR(1, j - 1) * Exp(mean + sigma * Rnd())
            Debug.Print RR(1, j)
        Next j
    Next i

    Range("RevRng").Value = RR ' <-- This is the only thing you're missing.

    Range("stoptime") = Time

    ' The end result is to have revenues for years 0 to 10
    ' derived from a random stochastic process.

End Sub

Значения, которые я использовал для sigma, mean и runs, и полученные доходы, вероятно, бессмысленны (для вас), но, как вы можете видеть, цифры доходов кажутся другими. Мой RevRng состоит из желтых клеток.

Вывод

person chillin    schedule 25.08.2019
comment
Большое спасибо Chillin, который сделал небольшое улучшение, но теперь все ячейки в RevRng имеют значение первой ячейки. Как заставить ячейки принять новое значение? - person user3693832; 25.08.2019
comment
@user3693832 user3693832, если я создам необходимые именованные диапазоны и запущу ваш код точно так, как он есть, я получу разные значения в моем диапазоне RevRng. На мой взгляд, это говорит о том, что проблема заключается либо в значениях, которые у вас есть для sigma, mean, runs, либо, возможно, диапазон RevRng не является горизонтальным. Вы можете выполнить код с помощью клавиши F8. Вы можете просмотреть состояние переменных в окне Locals (View > Locals Windows). Я прикреплю скриншот своего рабочего листа, чтобы вы могли видеть то, что вижу я (на случай, если это поможет). - person chillin; 25.08.2019
comment
'Основываясь на вашем совете, мой код теперь выглядит так - person user3693832; 25.08.2019
comment
@ user3693832, см. редактирование. Я упомянул, что он должен идти после цикла — и что вы должны записывать в диапазон весь массив RR, а не конкретный элемент массива RR(1, j). Надеюсь, это прояснит ситуацию. Если нет, дайте мне знать. - person chillin; 25.08.2019
comment
привет, @chillin, я скопировал и вставил весь твой исправленный код, но все значения такие же, как и в первой ячейке диапазона. Любые другие предложения? Спасибо еще раз - person user3693832; 25.08.2019
comment
@user3693832 user3693832, вы видите, что разные значения печатаются (от Debug.Print) в ближайшем окне? Какие значения mean, runs, sigma на вашем листе? И каково значение первой ячейки в RevRng? Я попытаюсь запустить код с теми же значениями. - person chillin; 25.08.2019
comment
Я удалил «runs» как переменную и удалил первый цикл For Loop, потому что он казался избыточным. «Среднее» равно 0,06, «годы» — 12, а «сигма» — 0,12. Начальное значение дохода составляет 1 916 475. - person user3693832; 25.08.2019
comment
приносим извинения за удаление «прогонов» после того, как вы помогли, но на самом деле это не нужно - person user3693832; 25.08.2019
comment
также все значения в ближайшем окне совпадают с первым значением в RevRng, которое равно 1 9116 475. - person user3693832; 25.08.2019
comment
это отсортировано. Большое спасибо за вашу помощь, вы абсолютный зверь легенды. - person user3693832; 25.08.2019
comment
@user3693832 user3693832, похоже, что Exp(mean + sigma * Rnd()) оценивается как 1 во время каждой итерации цикла, поэтому вычисление становится 19116475 * 1. - person chillin; 25.08.2019
comment
Хорошо, ты понял, отлично. - person chillin; 25.08.2019