Страницы: 1
RSS
Вычисление прогнозных значений с помощью WorksheetFunction.LinEst, как использовать массив в кач-ве аргумента функций на листе
 
в который раз уже я к вам за помощью, гуру..аж стыдно уже...
дело такое: есть график примерно линейного вида. пользователь на юзер форуме выбирает точки на графике, кривая между которыми более всего напоминает ему прямую, и вводит в юзерформу эти точки. по этим точкам строится линия тренда - спасибо большое Слэн'у, это он подсказал. теперь задача такова - по построенному тренду сделать прогноз - т.е. пользователь построил тренд от 50 до 60 точки на графике (это по х), какими будут значения по у от 61,62 и далее точек.
В хелпе экселя есть вот что:
Цитата
=СУММ(ЛИНЕЙН(B1:B6; A2:A7)*{9;1}) - Вычисляет предполагаемый объем продаж в девятом месяце на основе данных о продажах за 2–6 месяцы
по описанию - то, что доктор прописал. вопрос - как ее написать в вба?)
имеется вот такой код:

Код
Private Sub GoButton_Click()
With Worksheets("123")
Call XarakCalc
    Select Case True
    Case Chart5_Select 'имеется серия графиков, пользователь выбирает, по какому конкретно он хочет получить прогноз
    Dim trendline, x, y
    N = TextBox9.Text: K = TextBox10.Text 'ввод границ прогноз - 50 и 60ая точка, к примеру
    ReDim x(1 To K - N + 1): ReDim y(1 To K - N + 1)
    j = 0
    For i = N To K
        j = j + 1
        If Np_o(i) = Empty Then 'это массив объявляется в XarakCalc, в него заносятся значения ячеек из определнного столбца
            y(j) = 0
        Else
            y(j) = Np_o(i)
        End If
        If ObrTime(i) = Empty Then 'это массив объявляется в XarakCalc, в него заносятся значения ячеек из определнного столбца
            x(j) = 0
        Else
            x(j) = ObrTime(i)
        End If
    Next i
     
     .Range("C7") = WorksheetFunction.Sum(WorksheetFunction.LinEst(y, x))
   .....
  End Sub


сам тренд строится в другой процедуре вот так:
Код
......
trendline = WorksheetFunction.LinEst(y, x, 1, 1) 'y, x вычисляются так же, как и в коде выше
    ReDim x(1 To 2): ReDim Np_o(1 To 2)
    x(1) = ObrTime(N)
    x(2) = ObrTime(K)
    Np_o(1) = trendline(1, 1) * x(1) + trendline(1, 2)
    Np_o(2) = trendline(1, 1) * x(2) + trendline(1, 2)
' далее он добавляется на уже существующи график
.......


попробовал банальщину:
Код
 Range("K5").FormulaR1C1 = "=SUM(LINEST(R[-3]C[-4]:R[36]C[-4], R[-3]C[-5]:R[36]C[-5])*{45,1})"

но вместо RC мне туда надо вставить значения массивов x, y, да и 45 надо менять - т.е. в К5 вставили K-ое значение, в К6 K+1 и тд

нашел ф-ции =ПРЕДСКАЗ(41; F2:F41; G2:G41) и =ТЕНДЕНЦИЯ(F2:F41; G2:G41;41; 1), можно ли как-то вместо подсунуть массив х?
Изменено: peat - 04.05.2013 18:37:28
 
Нашел решение здесь, адаптировал под себя:

Код
Dim knowny As Variant
Dim knownx As Variant
Dim newx()
ReDim newx(1 To Sr) 'кол-во точек прогноза, на сколько шаговон нужен
Dim myval As Variant
knowny = y()
knownx = x()
For i = 1 To Sr
newx(i) = 1 / (i + K) ' кривая несколько в извращенном виде)) К - правая границы выделенной области
Next i

myval = WorksheetFunction.Trend(knowny, knownx, newx, 1)
'заполнение ячеек созданным массивом:
Dim massiv()
  massiv = myval
   .Cells(7, 3).Resize(UBound(massiv), 1) = Application.Transpose(massiv)


если у кого-то есть мысли, как это сделать с линейн - будет здорово узнать)
 
ну вы же уже вычисляли:

   Np_o(1) = trendline(1, 1) * x(1) + trendline(1, 2)
   Np_o(2) = trendline(1, 1) * x(2) + trendline(1, 2)

y по известным x - чем не нравится?
Живи и дай жить..
Страницы: 1
Наверх