Excel 尝试修复VBA中的Do While循环

Excel 尝试修复VBA中的Do While循环,excel,vba,Excel,Vba,提前感谢您抽出时间来帮忙。我在VBA中构建了一个Do While循环,由于某些原因,当j=1时该循环会中断。我在C3:C7单元格中有这些值:13,14,14,13,14 以下是简短的脚本: Dim i, j, n As Integer Dim List(0) As Integer i = o j = 0 n = 0 Do While Cells(i + 3, 3) <> "" If Cells(i + 3, 3) > 13 Then Li

提前感谢您抽出时间来帮忙。我在VBA中构建了一个Do While循环,由于某些原因,当j=1时该循环会中断。我在C3:C7单元格中有这些值:13,14,14,13,14

以下是简短的脚本:

Dim i, j, n As Integer
Dim List(0) As Integer

i = o
j = 0
n = 0

Do While Cells(i + 3, 3) <> ""     

    If Cells(i + 3, 3) > 13 Then
        List(j) = i + 3
        j = j + 1
        Cells(i + 3, 4) = "Noted"
        i = i + 1
    ElseIf Cells(i + 3, 3) = 13 Then
        Cells(i + 3, 4) = "Skipped"
        i = i + 1
    Else
        i = i + 1
    End If
Loop

For n = j To n = 0
    Rows(List(n)).Delete
Next
Dim i,j,n为整数
Dim列表(0)为整数
i=o
j=0
n=0
“当单元格(i+3,3)”时执行”
如果单元格(i+3,3)>13,则
列表(j)=i+3
j=j+1
单元格(i+3,4)=“已注明”
i=i+1
ElseIf细胞(i+3,3)=13
单元格(i+3,4)=“跳过”
i=i+1
其他的
i=i+1
如果结束
环
对于n=j到n=0
行(列表(n))。删除
下一个

再次感谢

你的意图是正确的,但也有不少错误。有关详细信息,请参见下面的注释代码

Sub Demo()
    ' ~~ must explicitly type each variable.  Use Long
    Dim i As Long, j As Long, n As Long
    Dim List() As Long '<~~ dynamic array

    i = 3 '<~~ eliminate the klunky +3
    j = 0
    n = 0
    ReDim List(0 To 0) '<~~ initialise dynamic array
    Do While Cells(i, 3) <> vbNullString
        If Cells(i, 3) > 13 Then
            ReDim Preserve List(0 To j) '<~~ resize array
            List(j) = i
            j = j + 1
            Cells(i, 4) = "Noted"
        ElseIf Cells(i, 3) = 13 Then
            Cells(i, 4) = "Skipped"
        End If
        i = i + 1 '<~~ simplify, its called in each if case anyway
    Loop

    ' j will end up 1 greater than size of array
    If j > 0 Then '<~~ only execute if we found some rows to delete
        For n = j - 1 To 0 Step -1 '<~~ For loop syntax
            Rows(List(n)).Delete
        Next
    End If
End Sub
子演示()
“~~必须显式键入每个变量。使用长
暗i为长,j为长,n为长

Dim List(),只要“将列表声明为一个数组,其中一个元素从零开始。一旦j=1,它就超过了上限。这不是零
i=o
(第4行)不是答案,而是
Dim i,j,n作为整数
实际上声明
i作为变量,j作为变量,n作为整数
。如果希望将所有变量声明为
Integer
,则需要这样做:
Dim i为Integer,j为Integer,n为Integer
,谢谢Phil-捕捉得好。维克多,很高兴知道。我没有意识到这一点。谢谢分享。SJR,是的,这似乎是个问题。我本以为包括List(j)=I+5会添加一个实例/索引,并将List()的上限增加1(每次我增加j)。在我的其他回路中似乎也是如此。如果条件满足,我是否应该在每次增加数组上限时都包括一些内容?谢谢,Chris。这就是诀窍——一点一点地测试它,ReDim Preserve List(0到j)就是专门做这个诀窍的。非常感谢您重新编写sub,使其更干净、结构更好。我学到的比我想象的要多。再次感谢!