VBA中的To和Step是什么意思?

6
Dim i As Long
Dim rows As Long
Dim rng3 As Range
rows = rng3.rows.Count
For i = rows To 1 Step (-1)

有人知道这个循环如何工作吗?我对rows To 1 Step (-1)的含义感到困惑。


1
如果可以的话,请将其改为“for i = 1 to rows”。通常没有很好的理由去倒数计数,这会使代码变得不必要地复杂。有些人在与偏移量结合使用时会使用它,但出于代码审查的原因,我非常反对使用偏移量。 - html_programmer
1
我要提到Sam的答案显然是正确的,因此我点赞他的回答。就个人而言,从代码审查的角度来看,我发现将循环计数器递增并在主体中管理递减更易读,但这只是我的观点。 - html_programmer
2
@KimGysen - 如果你正在删除行,则最好从底部开始向上工作... - Tim Williams
1
@TimWilliams 个人而言,我会在循环体中使用 rng3.rows(row_count - i) 并在循环中使用增量计数器,因为我认为这对大多数程序员来说更直观易读。但我并不一定反对另一种方法。我之所以提到这一点,纯粹是因为 OP 表示自己是一个初学者 VBA-er;在大多数情况下,你会使用增量计数器,而不是将其反转,除非没有必要。 - html_programmer
1
@KimGysen - 像许多事情一样,这是一个偏好的问题 :-) - Tim Williams
3个回答

27

高数字1,在每次迭代中减去(-1)

注意:之所以是相加,是因为在数学逻辑中,+-的运算结果都是一个-


如果rows = 10,那么

for i = 10 to 1 step -2 的意思是从10循环回到1,在每个循环周期中从 i减去2

在循环中添加Debug.Print i可以更好地了解情况。

注意:打开Immediate Window,按CTRL+G或从VBE菜单栏选择View => Immediate Window

enter image description here


一个示例循环,每个周期增加3。

for i = 1 to 10 step 3
    debug.print i 
next i

在此输入图片描述


用法

步退技术主要用于从电子表格中删除行时。

要了解实践中的逻辑,请参见以下内容


1
非常感谢!这个解释太棒了 :) 绝对以一种非常简单的方式为我分解了它。 - usernolongerregistered
@jacouh 那将是一个很好的新问题,但您可以进入菜单栏中的“工具”>“选项”,第二个选项卡是您可以编辑颜色的位置。 - user2140173

5

在删除行的时候,常见的做法是从末尾开始向后移动,这样可以避免跳过任何一行。

Dim i As Long
Dim rows As Long
Dim rng3 As Range

rows = rng3.rows.Count


For i = rows To 1 Step (-1)

    'delete row if "delete" is in column 1
    If rng3.cells(i,1).Value = "delete" Then

    rng3.Rows(i).EntireRow.Delete

    End If

next i

0
Dim i as Integer

For i = 1 To 14 Step 3
Debug.Print i
Next i

在上面的代码中,循环将从1迭代到14,每次增加3,因此输出将如下所示
1 4 7 10 13

这意味着它不能超过14,即为限制。

因此,无论在步骤中提供什么值,它都将添加到用于循环目的的变量中。在这里

i = i +3

但在VBA的For循环中,步长值无法动态更改。例如:

Dim i As Integer

For i = 1 To 10 Step i
    Debug.Print i
Next i

在这里,在开始迭代之前,步骤等于默认值 i 的值,即0。因此,i 将像下面这样递增:

i = i+ i => i = i+0

所以我不会在这里递增,循环将永远迭代。

现在看下面的代码:

Dim i as Integer

For i = 1 To 14 Step i+1
Debug.Print i
Next i

我会像这样递增:

i=i+(i+1) => i= i+(0+1) =>i = i+1

所以它将递增1,输出将为1 2 3….14

现在看下面的代码:

Dim i As Integer
i = 3
For i = 1 To 10 Step i
    Debug.Print i
Next i

在这里,循环执行之前i等于3,因此步长值将为3,但循环将从i = 1开始,并且在整个循环中每次增加3。

i = i+3

因此输出将为1 4 7 10。

现在来看另一个变量:

Dim i As Integer
Dim j As Integer
j = 2

For i = 1 To 10 Step j
    Debug.Print i
    j = i
Next i

在上面的代码中,步长值将为2,因此对于每次迭代,我将增加2,无论j是否在循环内进行修改,都不会影响步长值,因此输出将是:
1 3 5 7 9

如果我有任何遗漏或错误,请纠正我。同时,如果有任何使用VBA中的For循环进行动态循环的方法,请提出建议。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接