2

A行 1 に列からまでの数値が入力されていますIA。1 つのセルをその前のセル (別名 Cell B1toA1または cell Fto E) と比較するループを作成したいと考えています。B1例としてandを使用しましょうA1。セルの値B1を見て、セルの値より大きいかどうかを確認しA1ます。大きい場合は、 a+を Cell に入力しB2ます。また、 aが CellB1< A1入れられた場合。プログラムがこのプロセスをループできるようにして、すべての列に対して実行できるようにします。以下は、プログラムに実行してもらいたいことです(もちろん、正と負の記号の周りのダッシュと括弧は含まれません)。-B2A-AI

        ABCDF
1 33.12 34.52 34.92 35.19 34.97
2 (+) (+) (+) (-)

このタスクは (VBA を使用せずに) Excel で簡単に実行できることはわかっていますが、より複雑なタスクを実行できるように VBA を学習しようとしています。簡単なタスクを実行するための基本的なコードを作成しましたが、ループする方法がわからないため、すべてのセルに対してこれを実行します!

Sub EnterFormula()

    Dim x As Integer
    Dim y As Integer

    x = Worksheets("Sheet2").Range("C2").Value
    y = Worksheets("Sheet2").Range("B2").Value

    If x > y Then
        Worksheets("Sheet2").Range("C4") = "+"
    End If

End Sub

では、私のプログラムの次の部分に進みましょう。少し複雑になります。行 3 に移動します。行 3 には、U (上向き) または D (下向き) があるか、または何もありません。

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

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

        ABCDFHI
1 33.12 33.02 34.92 35.19 32.97 35.21 35.60 35.90
2 (+) (-) (+) (+) (-) (+) (+) (+)
3 ウドゥウ

これまでのところ、これが私のコードです。「+」記号と「-」記号を作成していた元のコードに追加しました。

Sub Comparison()

    Dim targetCell As Range
    Dim targetSignCell As Range
    Dim currentSign As String
    Dim currentNumericalCell As Currency

    ' Find out what sign (+ or -) the current Cell has in it
    currentSign = Worksheets("Sheet2").Range("H3").Value
    'Variable to associate the numerical number above the current Cell
    currentNumericalCell = Worksheets("Sheet2").Range("H2").Value

    ' Here we iterate through each cell in a specified range
    ' Since you know you want to start at B1 and go until E1,
    ' you can ues the following syntax to go through each cell
    For Each Cell In Range("B2:H2")

    ' Get the value of the current cell with the .Value property
currentValue = Cell.Value

' その前のセルの値を取得します (列方向) previousValue = Cell.Offset(0, -1).Value

' Create a variable for our target cell
Set targetCell = Cell.Offset(1, 0)

' Here are the basic comparisons
If currentValue > previousValue Then
    targetCell.Value = "+"
ElseIf currentValue < previousValue Then
    targetCell.Value = "-"
ElseIf currentValue = previousValue Then
    targetCell.Value = "="
Else
    ' Not sure how it would happen, but this
    ' is your catch-all in case the comparisons fail
    targetCell.Value = "???"
End If

' Now go to the next cell in the range
Next Cell

'Alex starting to code
For Each Cell In Range("H3:B3")
' 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

2 に答える 2

1

私は@JohnBus​​tosに同意します。数式の方がはるかに効率的ですが、これが実際に学習演習である場合は、次の簡単な例を使用して、必要な処理を実行できます。

Sub Comparison()

Dim targetCell As Range

' Here we iterate through each cell in a specified range
' Since you know you want to start at B1 and go until E1,
' you can ues the following syntax to go through each cell
For Each cell In Range("B1:E1")

    ' Get the value of the current cell with the .Value property
    currentValue = cell.Value

   ' Now get the value of the cell that is before it (column-wise)
    previousValue = cell.Offset(0, -1).Value

    ' Create a variable for our target cell
    Set targetCell = cell.Offset(1, 0)

    ' Here are the basic comparisons
    If currentValue > previousValue Then
        targetCell.Value = "+"
    ElseIf currentValue < previousValue Then
        targetCell.Value = "-"
    ElseIf currentValue = previousValue Then
        targetCell.Value = "="
    Else
        ' Not sure how it would happen, but this
        ' is your catch-all in case the comparisons fail
        targetCell.Value = "???"
    End If

' Now go to the next cell in the range
Next cell


End Sub

また、数式として実行する場合は、次のようになります(B2範囲の最後に入力してコピーします)。

=IF(B1>A1,"+",IF(B1<A1,"-","="))

これにより、数式の上のセルとそのセルの左側のセルが比較され、適切な記号が追加されます。

于 2013-01-09T15:56:32.890 に答える
0

作業したい範囲に空のセルがないと仮定すると、次のようにすることができます。

Range("b2").Select
Do Until IsEmpty(ActiveCell.Offset(-1, 0))
If ActiveCell.Offset(-1, 0).Value > ActiveCell.Offset(-1, 1).Value Then
ActiveCell.Formula = "+"
End If
If ActiveCell.Offset(-1, 0).Value < ActiveCell.Offset(-1, 1).Value Then
ActiveCell.Formula = "-"
End If
ActiveCell.Offset(0, 1).Select
Loop

範囲内に空のセルがある場合は、「do until」の代わりに使用します

dim I 
for I = 1 to ..

next I
于 2014-06-12T19:36:18.527 に答える