我试图一起实现嵌套for和嵌套if语句。我在下面有以下专栏。它需要查看列,如果范围在500-1000之间,它应该给出推荐a(即在另一列中写入推荐)如果它超过1000,它应该在响应列中给出另一个推荐。
Income Recommendation
550 a
1200 b
750 a
1400 b
600 a
Dim i As Integer
Dim j As Integer
For i = 2 To Range(i, 1).End(xlDown).Row
If Cells(i, 1).Value > 1000 Then
Cells(i, 10).Value = "b"
i = i + 1
Else
If Cells(i, 1).Value < 1000 Then
If Cells(i, 1).Valie > 500 Then
Cells(i, 10).Value = "a"
End If
End If
i = i + 1
End If
Next i
End Sub
答案 0 :(得分:4)
有几个错误:
在设置i
循环的起始值和结束值时,不要依赖For
具有值 - 很有可能0
Range(i, 1)
在计算0
时。 (编辑:经过测试并确认在计算结束值时它仍为Range(0, 1)
。)使用i = i + 1
会产生1004错误。
不要在循环内递增循环计数器(即不要Step 2
) - 它几乎肯定会混淆事物。如果您真的只想处理每一秒,请在For
声明中使用.Valie
。
.Value
应为Integer
不要对行使用Integer
数据类型 - 这些天Excel可以处理1048576行,这超过了Range(1, 1)
可以处理的行。
Range
语法无效。将两个参数传递给Cells
属性时,它们需要是单元格引用。传递行和列是使用 Range(1, 1)
属性时使用的行。 (因此Cells(1, 1)
需要Range("A1")
或 Dim i As Long
For i = 2 To Cells(1, "A").End(xlDown).Row
If Cells(i, "A").Value > 1000 Then
Cells(i, "J").Value = "b"
ElseIf Cells(i, "A").Value > 500 Then
Cells(i, "J").Value = "a"
Else
Cells(i, "J").Value = ""
End If
Next i
End Sub
。)
重构代码会给出:
$.post()
答案 1 :(得分:3)
你可以使用Select Case
:
Public Sub TestMe()
Dim i As Long
Dim j As Long
With ActiveSheet
For i = 2 To .Cells(1, 1).End(xlDown).Row
Select Case True
Case .Cells(i, 1) > 1000
.Cells(i, 10) = "b"
Case .Cells(i, 1) < 1000 And .Cells(i, 1) > 500
.Cells(i, 10).value = "a"
End Select
Next i
End With
End Sub
它更明显,更容易理解。另外,请确保您参考工作表(在本例中为with ActiveSheet
),以避免将来出现参考问题。