初学者到VBA:大于

时间:2013-01-09 14:59:12

标签: excel vba

我在第1行中从A列到IA输入了数字值。我想创建一个循环,将一个单元格与之前的单元格进行比较(也就是单元格B1A1或单元格FE)。我们以B1A1为例。它查看单元格中的值B1,看它是否大于A1中单元格的值。如果它更大,那么我希望在单元格+中输入B2。如果B1< A1 -,则将B2放入单元格A-AI。我希望程序能够循环此过程,以便它为所有列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 执行此操作。以下是我想要程序做的事情(当然不包括正面和负面标记的破折号)。

        A        B        C        D        F
1       33.12    34.52    34.92    35.19    34.97
2                (+)      (+)      (+)      (-)

我意识到这个任务很容易在excel中执行(不使用VBA),但我正在尝试学习VBA,因此我可以执行更复杂的任务。我已经编写了执行简单任务的基本代码,但我不知道如何循环它以便它将为我的所有单元格执行此操作!

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

好的,这是我的计划的下一部分。它变得更复杂。我们移动到第3行。第3行要么有U(对于Up)要么有D(对于down)或者没有。

让我们从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)......注意:我将值从原来的F改变了一点.32.97是LESS然后是35.19(D1),这就是F2为“ - ”的原因。接下来我们转到第一个前面的“ - ”,其间至少有一个相反的符号(在本例中为“+”)。所以在这种情况下,这是行B(中间有两个“+”符号)。现在,因为我们正在处理“ - ”符号,这次我们查看F1中的数值是否为LESS,然后是B1中的数值...它是什么,因此在F3中输入“D”。如果F1大于B1,则单元格将为空。

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

        A        B        C        D        F        G        H        I
1       33.12    33.02    34.92    35.19    32.97    35.21    35.60    35.90
2       (+)      (-)      (+)      (+)      (-)      (+)      (+)      (+)
3                          U        U        D        U        U        U

到目前为止,这是我的代码。我添加了原始代码,它创建了“+”符号和“ - ”符号。

' 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

'现在获取它之前的单元格的值(按列)     previousValue = Cell.Offset(0,-1).Value

{{1}}

2 个答案:

答案 0 :(得分: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,"-","="))

将公式上方的单元格与该单元格左侧的单元格进行比较,并添加相应的符号。

答案 1 :(得分: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

如果范围内有空单元格,则代替“直到”使用

dim I 
for I = 1 to ..

next I