动态公式,根据来自其他2个单元格的值减去2个单元格值

时间:2017-01-14 16:27:53

标签: excel vba excel-vba

我正在努力想出这个问题的标题,因为我无法弄清楚如何最好地把它。我相信我能用照片更好地解释我的问题。

这也可能对公式要求太高,需要VBA编码

我想生成一个分析2列值范围的公式。第一列是股票的调整后收盘价。第二列是一个计算振荡器,旨在预测超过和未完成状态。

在这个公式中,如果计算的振荡器低于30,则认为股票处于买入低位,如果高于80,则认为超买。因此,我想计算第一次发生的未买入与下一次超买实例之间的收盘价差异。

然后我希望这个公式循环遍历当年股票价格的所有实例。从理论上讲,股票多次出现并且超买。

我基本上考虑了这些范围。期间的开始是超买价值的最后一个实例之后的超买数字的第一个实例。期末是下一个超买价值。

股票处于低位/超买状态的天数范围很广,因此需要采用动态公式。

我考虑使用嵌套的if和choose语句,但我不能提出足够强大的东西。有人能指出我正确的方向,用什么功能来实现这个目标?这是否需要VBA?

我想做的例子

enter image description here

感谢您花时间阅读并思考这一点。如果我能为您澄清任何内容,请告诉我。

1 个答案:

答案 0 :(得分:0)

您需要针对此类问题设置一个小型有限状态机,如果您使用VBA或辅助列,则无关紧要。

所以有三种状态

(1)初始状态

(2)'Primed'州

(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个时期的差异的VBA看起来如下 - 你会这样称之为(比如说)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