嵌套循环的工作。问题 - 我无法弄清楚如何让循环移动到下一个单元块(B11:B20);它只是将值重写到范围(B1:B10)。我的想法是,我可能不需要嵌套循环,但我无法解决问题。
Sub insertNum()
Dim sheetOne As Worksheet
Set sheetOne = Worksheets("Sheet1")
Dim i, j As Long
For i = 1 To sheetOne.UsedRange.Rows.Count
For j = 1 To 10
Select Case j
Case 1 To 5
sheetOne.Cells(j, 2).Value = "2"
Case 6 To 10
sheetOne.Cells(j, 2).Value = "3"
End Select
Next j
Next i
End Sub
答案 0 :(得分:1)
我想,这就是你想做的。我测试了它,它每5行就会在2到3之间切换。
Sub insertNum()
Dim sheetOne As Worksheet
Set sheetOne = Worksheets("Sheet1")
Dim i As Long, j As Long
For i = 1 To sheetOne.UsedRange.Rows.Count Step 10
For j = 1 To 10
Select Case j
Case 1 To 5
sheetOne.Cells(i + j - 1, 2).Value = "2"
Case 6 To 10
sheetOne.Cells(i + j - 1, 2).Value = "3"
End Select
Next j
Next i
End Sub
答案 1 :(得分:1)
您可以在不使用代码中的任何循环的情况下完成此操作,在这种情况下,使用以下代码将执行时间增加约400%:
Sub insertNumNoLoopSample()
With [B1:B50000]
.FormulaR1C1 = _
"=IF(ISNA(MATCH(RIGHT(ROW(),1), {""1"",""2"",""3"",""4"",""5""},0)),3,2)"
.Value = .Value
End With
End Sub
测试了一系列B1:B50000运行每个代码(其他答案和这个)我的代码平均执行0.41秒,而另一个答案平均执行2.1秒。
您可以按原样使用代码,或修改With行并添加您希望运行代码的范围,如果您想使用已使用的范围(不建议这样做),那么您可以替换
With [B1:B50000]
并使用以下代码。
With ActiveSheet.UsedRange.Columns("B")
如果你不知道最后一行是什么,或者它是否会改变,最好的方法是获取最后一个使用过的行,而不是使用已使用的范围:
Sub NoLoopSample()
Dim lastRow As Long
'Replace The A with the Column of your data that
'will the longest amount of data.
lastRow = Range("A" & Rows.Count).End(xlUp).Row
With Range("B1:B" & lastRow)
.FormulaR1C1 = _
"=IF(ISNA(MATCH(RIGHT(ROW(),1), {""1"",""2"",""3"",""4"",""5""},0)),3,2)"
.Value = .Value
End With
End Sub
答案 2 :(得分:0)
不应该是:
Sub insertNum()
Dim sheetOne As Worksheet
Set sheetOne = Worksheets("Sheet1")
Dim i, j As Long
For i = 1 To sheetOne.UsedRange.Rows.Count
For j = 1 To 10
Select Case j
Case 1 To 5
sheetOne.Cells(j, i).Value = "2"
Case 6 To 10
sheetOne.Cells(j, i).Value = "3"
End Select
Next j
Next i
End Sub
在我看来,你是硬编码将行(2)分配到你的循环中。我认为我是行循环器,但你永远不会使用该值来分配你的单元格。