2017-01-14 4 views
0

Я изо всех сил пытаюсь найти название для этого вопроса, поскольку я не могу понять, как лучше всего это выразить. Я считаю, что с моими фотографиями я смогу объяснить свой вопрос лучше.Динамическая формула, которая вычитает 2 значения ячейки на основе значений из 2 других ячеек

Это также может быть слишком требовательным для формулы и нуждается в VBA кодирование

Я хотел бы генерировать формулу, которая анализирует диапазон 2 столбцов значений. Первый столбец - скорректированная цена закрытия акции. Второй столбец представляет собой вычисляемый осциллятор, предназначенный для прогнозирования состояния сверхпрочности.

В этой формуле запасы считаются недокупленными, если расчетный осциллятор ниже 30 и перекуплен, если он выше 80. Поэтому я хотел бы рассчитать разницу цен цены закрытия между первым вхождением в подкуп и следующий экземпляр перекупленности.

Я хочу, чтобы эта формула охватывала все экземпляры цены акций за год. Теоретически будет много раз, когда запасы будут поглощены и перекуплены.

Я думаю об этих диапазонах в периоды по существу. Начало периода - это первый экземпляр числа подкуплений, следующего за последним экземпляром значения перекупленности. Конец периода - следующее значение перекупленности.

Количество дней, в течение которых запасы подкуплены/перекуплены, будет варьироваться оттого, и поэтому это должна быть динамическая формула.

Ive рассмотрел использование вложенных операторов if и select, но я не могу придумать что-то достаточно прочное. Может ли кто-нибудь указать мне в правильном направлении, какие функции использовать для этого? Это что-то, что потребует VBA?

Пример того, что я хотел бы сделать

enter image description here

Спасибо, что нашли время, чтобы читать и думать об этом. Пожалуйста, дайте мне знать, если я смогу прояснить что-нибудь для вас.

ответ

0

Вам нужно настроить небольшой конечный автомат для такого рода проблем, и не имеет значения, используете ли вы VBA или вспомогательные столбцы.

Таким образом, есть три состояния

(1) Исходное состояние

(2) 'грунтованное' состояние

(3) В период состоянии

и три переход

(A) От (1) до (2) при наличии перекупленных запасов

(B) От (2) до (3), когда найдено следующее недоиспользуемое количество

(C) От (3) до (1) при обнаружении следующего запаса перекупленности.

Так что вам нужно, чтобы создать столбец для обработки этих состояний и переходов, содержащих формулу

=IF(AND(I2=1,H3>80),2,IF(AND(I2=2,H3<30),3,IF(AND(I2=3,H3>80),1,I2))) 

начиная с (скажем) I3 (I2 устанавливается равным 1).

Тогда вам нужны еще две вспомогательных столбцов для подсчета окончания периода и начинается

=IF(AND(I1=2,I2=3),MAX(J$1:J1)+1,"") 

=IF(AND(I1=3,I2=1),MAX(K$1:K1)+1,"") 

И, наконец, столбец подобрать различия

=IFERROR(INDEX(G$2:G$100,MATCH(ROWS(L$1:L1),J$2:J$100,0))-INDEX(G$2:G$100,MATCH(ROWS(L$1:L1),K$2:K$100,0)),"") 

enter image description here

УВЫ найти разница в n-м периоде будет выглядеть ниже: вы бы назвали это так, начиная с (скажем) I2

=IFERROR(stock(G$2:G$100,H$2:H$100,ROWS(N$1:N1)),"") 

Так как вы тянете формулу вниз, она будет искать следующий период.

Option Explicit 

Function Stock(Actual As Range, Predicted As Range, n As Integer) As Variant 

Dim i, rows, LastRow, period As Long 
Dim state As Integer 
Dim startFound, endFound As Boolean 
Dim actualValue, predictedValue, startValue, endValue As Double 

state = 1 
period = 0 
startFound = False 
endFound = False 
rows = Actual.rows.Count 
If rows <> Predicted.rows.Count Then 
    Stock = CVErr(xlErrValue) 
    Return 
End If 

For i = 1 To rows 
    actualValue = Actual.Cells(i, 1).Value 
    predictedValue = Predicted.Cells(i, 1).Value 

    If state = 1 And predictedValue > 80 Then 
     state = 2 
    Else 
     If state = 2 And predictedValue < 30 Then 
      state = 3 
      period = period + 1 
      If period = n Then 
       startValue = actualValue 
       startFound = True 
      End If 
     Else 
      If state = 3 And predictedValue > 80 Then 
       state = 1 
       If period = n Then 
        endValue = actualValue 
        endFound = True 
        Exit For 
       End If 
      End If 
     End If 
    End If 

Next I 

If startFound And endFound Then 
    Stock = startValue - endValue 
Else 
    Stock = CVErr(xlErrValue) 
End If 
End Function 
+0

Большое вам спасибо за ваш ответ! Кажется, я пропустил изначально свою цель. Я хотел бы, чтобы государства были последовательными. Я имею в виду, что состояние 1 будет первым экземпляром состояния подкупности в первом случае состояния перекупленности. Состояние 2 будет следующим первым экземпляром состояния подкачки к следующему первому экземпляру состояния перекупленности. Эта картина продолжалась через рабочий лист, пока ничего не осталось. Я предполагаю, что будет всего 7-15 состояний. Таким образом, вместо того, чтобы иметь только 3 состояния и формулу, рассчитывающую между этими 3, можно ли присвоить ему уникальные номера –

+0

? Опять же, большое спасибо за то, что нашли время, чтобы поработать над этим! –

+0

Это мокрый день здесь, и не слишком многое другое, чтобы быть честным, поэтому хороший шанс попрактиковаться в VBA. Дело в том, что состояния выполняются циклически от 1 до 2 до 3 и возвращаются к 1, но каждый раз число периодов увеличивается на единицу, поэтому оно должно иметь возможность обрабатывать любое количество периодов (только два в фактических данных). Там, где это может потребоваться настройка, это то, что состояние возвращается к 1 в конце периода, возможно, это должно быть 2, потому что период заканчивается на запасе перекупленности, поэтому следующее подкупление должно, вероятно, инициировать новый период. –

Смежные вопросы