VB嵌套循环w /条件语法

时间:2014-12-09 22:33:54

标签: excel vba nested-loops conditional-statements

我是VB的新手,我很难掌握嵌套循环的语法。例如:

For N = 8 To 22
    For M = 4 To 19
        If Cells(N, 3).Value >= 0 Then
            Cells(M, 35).Value = 1
        Else
            Cells(M, 35).Value = 2
        End If
    Next M
Next N

我希望这个循环检查一列单元格,如果一个单元格包含0或正数,它应该在另一个指定列中返回“1”。否则,它应返回“2”。

不幸的是,这个循环当前在新列的每个单元格中返回(ELSE)“2”。对我做错了什么的解释?

1 个答案:

答案 0 :(得分:0)

这样的嵌套循环通过每次外循环经过一步重复内部循环从开始到结束来进行操作。因此,对于每个N,每行M将基于第N行和第3列的值将第35列中的单元设置为1或2(全部相同)。因此,在这种情况下,最后一行N必须具有负数或者丢失,将每个输出列单元格设置为“2”。

我怀疑你想要的更像是这样:

For N = 8 To 22
  If Cells(N, 3) >= 0 Then
    Cells(N - 4, 35) = 1
  Else
    Cells(N - 4, 35) = 2
  End If
Next N

请注意,原始代码中似乎存在一个错误,因为N超过15行,但M超过16行。另外,因为.Value是默认属性,所以可以将其保留。

奖励:一般来说,你会想要一些幻数较少的东西,比如:

Option Explicit

Public Sub DoSomething()
  Const ColTest As Integer = 3, ColResult As Integer = 35, DRowResult As Integer = -4
  Const RowStart As Integer = 8, RowEnd As Integer = 22
  Dim Row As Integer
  For Row = RowStart To RowEnd
    If Cells(Row, ColTest) >= 0 Then
      Cells(Row + DRowResult, ColResult) = 1
    Else
      Cells(Row + DRowResult, ColResult) = 2
    End If
  Next Row
End Sub

然后,如果你需要将它推广到不同的区域(通过将常量切换到参数),改变硬编码工作的位置,或者其他任何东西,在顶部修复它很简单,一次,并确保你拥有一切。在许多情况下,它也更容易理解。当然,Option Explicit通常也很好。 (常数名称中的D代表增量/差异。)