2

我正在寻找一种解决方案,该解决方案将无视循环计数器或从循环计数器后退一步。这是我的代码以便更好地理解。

 Sub DownArrow5_Click()
Dim c As Integer
Dim copyFromRow As Integer

copyFromRow = 1

For c = 1 To 20
   If ActiveSheet.Rows(copyFromRow).Hidden = False And Range("A" & c & "").Value <> "" Then
   'start copy paste
    ActiveSheet.Range("A" & copyFromRow & ", C" & copyFromRow & "").Copy
    Sheets("Sheet2").Select
    ActiveSheet.Range("A1").Select
    ActiveCell.Offset(1, 0).Select
    ActiveSheet.Paste
    ActiveCell.Offset(1, 0).Select
    Sheets("Sheet1").Select
    Application.CutCopyMode = False

    Else
        c = 'disregard the +1 for the loop

   End If
 Next c   
End Sub

我不能递减计数器,因为它会产生负 (-) 结果,从而返回一个无休止的循环。

注意:我需要将 20 个 UNHIDDEN 行复制并粘贴到 sheet2。这就是为什么我需要获取 Max 计数器 (20)。这只是我正在研究的一个简短代码。

4

2 回答 2

3

实际上,在循环中操作循环计数器For...Next可能不是一个好主意。您的代码片段不清楚为什么需要这样做,但是如果您需要使用块中c - 1某处的值,请Else使用c - 1(不分配c)或分配c - 1给另一个变量:

Sub DownArrow5_Click()
    Dim c As Integer, d As Integer

    For c = 1 To 20
        If (condition) then
            'do stuff here

        Else
            d = c - 1
            'some more stuff here using d

        End If
    Next

End Sub

更新

现在您已经使用更多详细信息编辑了代码,我认为您正在寻找这样的东西:

While c <= 20

    If Not ActiveSheet.Rows(copyFromRow).Hidden _
       And Range("A" & c).Value <> vbNullString Then

        'do your stuff
        c = c + 1

    End If

Wend

请注意,VB 有几个循环结构也可以正常工作 - 任何计算为False20 次迭代的条件都可以,所以只需使用您认为更易读的任何条件:

Do Until c = 21 ' until c = 20 would make it 19 iterations since c starts at 1
   ...
   c = c + 1
Loop

Do While Not c > 20
   ...
   c = c + 1
Loop
于 2013-08-29T00:55:25.183 回答
3

使用另一种类型的循环:

c = 1
Do
    If (condition) Then
        'do stuff

         c = c+1  'increment your counter variable
    Else:
        'presumably do nothing, i.e., "Disregard" the loop.
        ' do NOT increment the counter variable in the Else block
    End If

Loop While Not c > 20
于 2013-08-29T01:37:43.200 回答