-1

一連の数値がどのタイプのトレンドにあるかを指定するプログラムを作成しようとしています。上昇トレンド、下降トレンド、またはトレンドなしのいずれかです。次のパートに進むことができるように、以下の私の Excel スタイル テーブルを参照してください。

プログラムは行 3 を計算する必要があります。行 3 には、U (上向き) または D (下向き) があるか、何もないかのいずれかになります。以下に、U または D を指定する方法を説明します。これは、VBA プログラムに実行してもらいたいことです。

列 C から始めましょう。列 C1 の値は 34.92 で、C2 には + が付けられています (34.92 は前日の 33.02 よりも大きかったため)。ここで、間に少なくとも 1 つの反対の記号 (この場合は「-」) がある最初の前の「+」に移動します。したがって、この場合は列 A (列 B の下に「-」が 1 つ) です。ここで、C1 の数値 (34.92) が A の数値 (33.12) より大きい場合、C3 に「U」を指定します。大きくなければ、C3 に空のセルを残します。

列 D に移りましょう。列 D1 の値は 35.19 で、C1 の値 34.92 より大きく、これが D2 の値が「+」になっている理由です。次に、少なくとも 1 つの反対の記号 (この場合は "-") を間に挟んだ最初の前の "+" に移動します。したがって、この場合は列 A です。D1 の数値 (39.19) は A1 の数値 (33.12) より大きいため、D3 は U を取得します。

列 F (32.97) に移動します。32.97 は 35.19 (D1) よりも小さいため、F2 は「-」です。次に、間に少なくとも 1 つの反対の記号 (この場合は「+」) がある最初の前の「-」に移動します。したがって、この場合、これは列 B です (間に 2 つの「+」記号があります)。今回は "-" 記号を扱っているので、F1 の数値が B1 の数値よりも小さいかどうかを調べます...これはそうなので、F3 に "D" が入力されます。F1 が B1 より大きい場合、セルは空のままになります。

列 G (35.21) に。これは 32.97 (F1) より大きいため、G2 に「+」が付きます。次に、間に少なくとも 1 つの反対の記号 (この場合は "-") を含む最初の前の "+" に移動します。したがって、この場合、これは列 D (間に「-」が 1 つ) です。G1 の数値は D1 の数値よりも大きいため、「U」を指定します。大きくない場合は、セルを空のままにします。

表 1: プログラム前の初期テーブル
        ABCDFHI
        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: 回答のあるファイナル テーブル
        ABCDFHI
        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 に答える