2016-11-24 5 views
1

заблаговременно за то, что нашли время, чтобы помочь. Я построил цикл Do While в VBA, который почему-то ломается, когда j = 1. У меня в ячейках C3: C7 эти значения: 13,14,14,13,14.Попытка исправить цикл While While в VBA

Вот короткий сценарий:

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 

Еще раз спасибо!

+1

Вы объявляете List как массив с одним элементом, начинающимся с нуля. Как только j = 1, он превышает верхнюю границу. – SJR

+1

Это не ноль 'i = o' (строка 4) – phil652

+0

Не ответ, но' Dim i, j, n As Integer' фактически объявляет 'i As Variant, j As Variant, n As Integer'. Если вы хотите, чтобы все ваши переменные были объявлены как «Integer», вам нужно сделать это следующим образом: 'Dim i As Integer, j As Integer, n As Integer' –

ответ

2

Ваши намерения звучат, но есть немало ошибок. См. Приведенный ниже код ниже.

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 
+0

Спасибо, Крис. Это сделало трюк - тестирование его пополам, список резервных копий ReDim (от 0 до j) - вот что конкретно сделал трюк. Благодарим вас за то, что вы переписали суб, чтобы быть более чистым и лучше структурированным. Я узнал больше, чем ожидал. Еще раз спасибо! – PyGuy

Смежные вопросы