Страницы: 1
RSS
Получение коэффициентов линии тренда для неполного ряда
 
Добрый день!
Подскажите, можно ли каким нибудь образом получить коэффициенты линии тренда если в ряду пропущены значения (проще говоря получить те же коэффициенты, что отображаются на диаграмме). Если использую ЛИНЕЙН то получаю #ЗНАЧ!
 
Доп. столбцы.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Спасибо!
А еще вопрос, Ваша формула натолкнула на идею, нельзя через формулу массива сделать?
Алгоритм в голове такой: просматриваем весь массив со значениями, если пусто то значение 99999, если не пусто то какое есть, потом внутри формулы массива сортируем от наименьшего к большему и берем только кол-во значений менее <99999. Но массив должен быть наверно двумерный, чтобы так же получать значения одновременно с двух колонок...
 
Цитата
nono4ka написал: потом внутри формулы массива сортируем
Фантастика!

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Цитата
JayBhagavan написал:
Фантастика!
Здравствуйте, JayBhagavan, А в чем фантастика?
Если в мире всё бессмысленно, — сказала Алиса, — что мешает выдумать какой-нибудь смысл? ©Льюис Кэрролл
 
Bema, попробуйте запихнуть описанную хотелку в одну формулу.
Изменено: JayBhagavan - 24.10.2018 10:56:45

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Цитата
nono4ka написал:
нельзя через формулу массива сделать?
удобнее с помощью VBA.
Код
Function GetNum(ByVal rVal As Range, Optional ByVal rCrit) As Double()

'возвращает одномерный массив типа Double из значений столбца rVal,
'если второй аргумент опущен,
'или из значений столбца rVal, соответствующих числовым rCrit
'можно передавать столбцы целиком

Dim v(), c(), d#(), i&, k&, x
  If IsMissing(rCrit) Then
    v = Intersect(rVal, rVal.Worksheet.UsedRange).Value2
    ReDim d(1 To UBound(v))
    For Each x In v
      If VarType(x) = vbDouble Then k = k + 1: d(k) = x
    Next
  Else
    c = Intersect(rCrit, rCrit.Worksheet.UsedRange).Value2
    v = rVal(1).Resize(UBound(c)).Value2
    ReDim d(1 To UBound(v))
    For Each x In c
      i = i + 1
      If VarType(x) = vbDouble Then k = k + 1: d(k) = v(i, 1)
    Next
  End If
  If k < UBound(d) Then ReDim Preserve d(1 To k)
  GetNum = d
End Function
Поскольку функция возвращает массивы-строки, а не столбцы, массив степеней в ЛИНЕЙН должен быть столбцом:
Код
=ТРАНСП(ЛИНЕЙН(GetNum(B:B);GetNum(A:A;B:B)^{1:2:3:4}))
Изменено: Казанский - 24.10.2018 12:53:17
 
Как говориться хочешь хорошо сделай сам)
Если интересно решение во вложении
Изменено: nono4ka - 24.10.2018 12:25:36
 
Опять скорректировал форму, предыдущая работа только на постоянно увеличивающемся графике.
 
Без летучего СМЕЩ
=ТРАНСП(ЛИНЕЙН(
ВПР(НАИМЕНЬШИЙ(ЕСЛИ(Значение;СТРОКА(Значение));СТРОКА(A1:ИНДЕКС(A:A;СЧЁТ(Значение))));A:B;2);
НАИМЕНЬШИЙ(ЕСЛИ(Значение;СТРОКА(Значение));СТРОКА(A1:ИНДЕКС(A:A;СЧЁТ(Значение))))^{1;2;3;4}))


Чтобы не считать дв раза одно и то же, создаем имя мас:
=НАИМЕНЬШИЙ(ЕСЛИ(Значение;СТРОКА(Значение));СТРОКА(Лист3!A1:ИНДЕКС(Лист3!A:A;СЧЁТ(Значение))))
Формула коэффициентов:
=ТРАНСП(ЛИНЕЙН(ВПР(мас;A:B;2);мас^{1;2;3;4}))
Страницы: 1
Наверх