-1

我正在尝试创建一个程序来指定一组数字所处的趋势类型。上升趋势、下降趋势或无趋势。请在下面查看我的 excel 样式表,以便您可以跟随下一部分。

程序需要计算第 3 行。第 3 行将要么有一个 U(代表向上)或一个 D(代表向下),要么什么都没有。下面我将解释如何指定 U 或 D aka 这就是我希望 VBA 程序为我做的事情。

让我们从 C 列开始。C1 列的值为 34.92,C2 的值为 +(因为 34.92 大于前一天的 33.02)。现在我们转到前面的第一个“+”,中间至少有一个相反的符号(在本例中为“-”)。因此,在这种情况下,即为 A 列(B 列下方中间有一个“-”)。现在,如果 C1 (34.92) 中的数值大于 A (33.12) 中的数值,那么我们在 C3 中指定一个“U”。如果它不是更大,我们将在 C3 中留下一个空单元格。

让我们进入 D 列。D1 列的值为 35.19,大于 C1 的值 34.92,这就是 D2 有“+”的原因。接下来我们转到前面的第一个“+”,中间至少有一个相反的符号(在本例中为“-”)。因此,在这种情况下,这又是 A 列。由于 D1 (39.19) 中的数值大于 A1 (33.12) 中的数值,因此 D3 得到一个 U。

移动到 F 列 (32.97)。32.97 比 35.19 (D1) 少,这就是为什么 F2 是“-”。接下来,我们转到前一个“-”,中间至少有一个相反的符号(在本例中为“+”)。所以在这种情况下,这是 B 列(中间有两个“+”号)。现在因为我们这次处理的是“-”符号,所以我们看看 F1 中的数值是否小于 B1 中的数值……它是,所以在 F3 中输入了一个“D”。如果 F1 大于 B1,则该单元格将为空。

在 G 列 (35.21) 上。这大于 32.97 (F1),因此在 G2 中获得“+”。接下来我们转到前面的第一个“+”,中间至少有一个相反的符号(在本例中为“-”)。所以在这种情况下,这是 D 列(中间有一个“-”)。由于 G1 的数值大于 D1 的数值,我们指定为“U”。如果它不是更大,我们会将单元格留空。

表 1:程序前的初始表
        ABCDFGHI
        1月1日 1月2日 1月3日 1月4日 1月5日 1月6日 1月7日 1月8日
1 33.12 33.02 34.92 35.19 32.97 35.21 35.60 35.90
2 (+) (-) (+) (+) (-) (+) (+) (+)
3 ? ? ? ? ? ?

表 2:带答案的决赛桌
        ABCDFGHI
        1月1日 1月2日 1月3日 1月4日 1月5日 1月6日 1月7日 1月8日
1 33.12 33.02 34.92 35.19 32.97 35.21 35.60 35.90
2 (+) (-) (+) (+) (-) (+) (+) (+)
3 呜呜呜
Sub Comparison()

For Each Cell In Range("A3:I3")
currentSign = cell.Value
' Find out what the sign is in the cell before it
previousSign = Cell.Offset(0, -1).Value
'Variable used to find the first cell with an
'Opposite sign as the current cell
oppositeSign = Cell.Offset(0, -2).Value
'Variable to associate the numberical number above the first Opposite Sign Cell
oppositeNumericalCell = Cell.Offset(-1, -2).Value
' Create a Variable for Target Cell
Set targetSignCell = Cell.Offset(1, 0)
If currentSign.Value = "+" And currentSign.Value <> previousSign.Value And oppositeSign.Value = currentSign.Value And currentNumericalCell.Value > oppositeNumericalCell.Value Then
targetSignCell = "U"
ElseIf currentSign.Value = "-" And currentSign.Value <> previousSign.Value And oppositeSign.Value = currentSign.Value And currentNumericalCell.Value < oppositeNumericalCell.Value Then
targetSignCell = "D"
Else
End If
Next Cell
End Sub
4

1 回答 1

0

轻微测试....

Sub tester()
    Dim c As Range
    'loop through the +/- range...
    For Each c In ActiveSheet.Range("A3:H3")
        CheckCell c
    Next c
End Sub

Sub CheckCell(c As Range)

    Dim pm As String, v As Double, v2 As Double
    Dim pm_opp As String, c2 As Range
    Dim oppFound As Boolean, pm_tmp As String


    v = c.Offset(-1, 0).Value        'value
    pm = c.Value       'sign
    pm_opp = IIf(pm = "+", "-", "+") 'opposite sign

    If c.Column = 1 Then Exit Sub

    Set c2 = c.Offset(0, -1)

    Do While c2.Value <> ""
        Debug.Print oppFound
        pm_tmp = c2.Value
        If Not oppFound Then
            oppFound = (pm_tmp = pm_opp)
        Else
            If pm_tmp = pm Then
                v2 = c2.Offset(-1, 0).Value
                If pm = "+" And (v2 < v) Then c.Offset(1, 0) = "U"
                If pm = "-" And (v2 > v) Then c.Offset(1, 0) = "D"
                Exit Do
            End If
        End If
        If c2.Column = 1 Then Exit Do
        Set c2 = c2.Offset(0, -1)
    Loop

End Sub
于 2013-01-17T07:07:50.710 回答