Цикл ForNext прерывается при использовании оператора Not()

Я запускаю цикл for... next, который проверяет, соответствуют ли записи в наборе данных определенному условию (в данном случае IsNA). Однако изменение условий if-then-else в этом цикле, чтобы также проверить, не выполняется ли условие, похоже, нарушает цикл for/next. Я получаю сообщение «Далее без ошибки For», хотя этот элемент подпрограммы не изменился.

Я не понимаю, почему он думает, что в цикле for нет следующего, когда эта часть кода не изменилась.

--Исходный рабочий код--

Option Explicit
Dim i As Double
Dim a As Range
Public ssht As Worksheet
Public susht As Worksheet
Public mdsht As Worksheet
Public LastRow As Long
Dim testcell As Long


Public Sub MissingDataSetCopy()
'Part Bii
'Find rows with NA error
Application.ScreenUpdating = False
Dim i, j As Integer
j = 4
'Finds current range on Summary worksheet
Set ssht = ThisWorkbook.Worksheets("sandbox")
Set mdsht = ThisWorkbook.Worksheets("MissingData")
Set susht = ThisWorkbook.Worksheets("summary")
'Copies data to sandbox sheet as values

susht.UsedRange.copy
ssht.Range("A1").PasteSpecial (xlPasteValues)

LastRow = ssht.Range("A4").CurrentRegion.Rows.Count
Dim testcell As Double
Dim numchk As Boolean
'For...Next look call ISNUMBER test
For i = 860 To 874
     If Application.WorksheetFunction.IsNA(ssht.Range("B" & i)) Then
    mdsht.Range("B" & j & ":H" & j).Value = ssht.Range("A" & i - 1 & ":G" & i - 1).Value
    j = j + 1
    mdsht.Range("B" & j & ":H" & j).Value = ssht.Range("A" & i & ":G" & i).Value
    j = j + 1
    mdsht.Range("B" & j & ":H" & j).Value = ssht.Range("A" & i + 1 & ":G" & i + 1).Value
    j = j + 1
    End If
    Next i

Dim fnd As Variant
Dim rplc As Variant

fnd = "#N/A"
rplc = "=NA()"
mdsht.Cells.Replace what:=fnd, Replacement:=rplc, _
 LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, _
 SearchFormat:=False, ReplaceFormat:=False

End Sub

--Редактировать операторы If--

For i = 860 To 874

    If Application.WorksheetFunction.IsNA(ssht.Range("B" & i)) And Application.WorksheetFunction.IsNA(ssht.Range("B" & i - 1)) Then
        mdsht.Range("B" & j & ":H" & j).Value = ssht.Range("A" & i & ":G" & i).Value
        j = j + 1
    If Application.WorksheetFunction.IsNA(ssht.Range("B" & i)) And Not (Application.WorksheetFunction.IsNA(ssht.Range("B" & i - 1))) Then
        mdsht.Range("B" & j & ":H" & j).Value = ssht.Range("A" & i - 1 & ":G" & i - 1).Value
        j = j + 1
        mdsht.Range("B" & j & ":H" & j).Value = ssht.Range("A" & i & ":G" & i).Value
        j = j + 1
    End If

    Next i

person Henry Holm    schedule 07.06.2015    source источник
comment
@Matteo NNZ заметил проблему (+1); также это может оказаться полезным при попытке найти все ячейки с текстом: ssht.Range(B860:B874).SpecialCells(xlCellTypeConstants, xlTextValues).Select, чем увеличить найденный диапазон, чтобы включить все столбцы до H, и скопировать все данные в мдшт.Диапазон со смещением на -856   -  person paul bica    schedule 07.06.2015


Ответы (1)


Вам нужно закрыть второй блок If:

For i = 860 To 874

    If Application.WorksheetFunction.IsNA(ssht.Range("B" & i)) And Application.WorksheetFunction.IsNA(ssht.Range("B" & i - 1)) Then
        mdsht.Range("B" & j & ":H" & j).Value = ssht.Range("A" & i & ":G" & i).Value
        j = j + 1
    End If '<-- it was not closed
    If Application.WorksheetFunction.IsNA(ssht.Range("B" & i)) And Not (Application.WorksheetFunction.IsNA(ssht.Range("B" & i - 1))) Then
        mdsht.Range("B" & j & ":H" & j).Value = ssht.Range("A" & i - 1 & ":G" & i - 1).Value
        j = j + 1
        mdsht.Range("B" & j & ":H" & j).Value = ssht.Range("A" & i & ":G" & i).Value
        j = j + 1
    End If

Next i

Или, альтернативно, используя ключевое слово ElseIf, если два условия (на первый взгляд) исключают друг друга:

For i = 860 To 874

    If Application.WorksheetFunction.IsNA(ssht.Range("B" & i)) And Application.WorksheetFunction.IsNA(ssht.Range("B" & i - 1)) Then
        mdsht.Range("B" & j & ":H" & j).Value = ssht.Range("A" & i & ":G" & i).Value
        j = j + 1

    ElseIf Application.WorksheetFunction.IsNA(ssht.Range("B" & i)) And Not (Application.WorksheetFunction.IsNA(ssht.Range("B" & i - 1))) Then
        mdsht.Range("B" & j & ":H" & j).Value = ssht.Range("A" & i - 1 & ":G" & i - 1).Value
        j = j + 1
        mdsht.Range("B" & j & ":H" & j).Value = ssht.Range("A" & i & ":G" & i).Value
        j = j + 1
    End If

Next i
person Matteo NNZ    schedule 07.06.2015
comment
Легенда! Это сработало отлично. Последний быстрый вопрос, этот скрипт очень медленный - мне интересно, потому ли это, что я объявил кучу переменных как рабочий лист. Есть ли другой способ сделать это, который будет быстрее, или есть что-то еще, что явно замедляет выполнение этого скрипта? - person Henry Holm; 08.06.2015
comment
Попробуйте использовать Application.ScreenUpdating и установить Application.Calculation = xlCalculationManual перед циклом, а затем вернуться к Application.Calculation = xlCalculationAutomatic после цикла. - person ChipsLetten; 08.06.2015