VBA Excel嵌套For循环(向下写入数字列)

时间:2013-10-25 14:49:48

标签: excel-vba vba excel

嵌套循环的工作。问题 - 我无法弄清楚如何让循环移动到下一个单元块(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

3 个答案:

答案 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)分配到你的循环中。我认为我是行循环器,但你永远不会使用该值来分配你的单元格。