Как сказать компьютеру, что «цикл» принадлежит «делать до» в VBA? - PullRequest
0 голосов
/ 03 июня 2018

У меня проблема с циклом до.Первый тестовый код ниже (code1) работает хорошо.Однако, если я помещу деталь, следующую за «Тогда», в новую строку, как показано во втором коде (поскольку я планирую добавить больше команд после «Затем» позже), она вернет сообщение об ошибке «Цикл без выполнения».Рабочий код (код1):

Sub CopyValues()

Dim s As Integer
Dim r As Integer

Cells(2, 4).Value = "Before"
Cells(2, 5).Value = "After"

For r = 1 To 3
    s = 0

    Do
        s = s + 1
        If InStr(Cells(s, 2).Value, "ROI_" & r & "A") > 0 Then Cells(Rows.Count, 4).End(xlUp).Offset(1, 0) = Cells(s, 2).Value
    Loop Until InStr(Cells(s, 2).Value, "ROI_" & r & "A") > 0

Next r
End Sub

Неработающий код (код2):

Sub CopyValues()

Dim s As Integer
Dim r As Integer

Cells(2, 4).Value = "Before"
Cells(2, 5).Value = "After"

For r = 1 To 3
    s = 0

    Do
        s = s + 1
        If InStr(Cells(s, 2).Value, "ROI_" & r & "A") > 0 Then
            Cells(Rows.Count, 4).End(xlUp).Offset(1, 0) = Cells(s, 2).Value
    Loop Until InStr(Cells(s, 2).Value, "ROI_" & r & "A") > 0

Next r
End Sub

С уважением, Ференц

1 Ответ

0 голосов
/ 03 июня 2018

Даже если полученное вами сообщение об ошибке «loop без do», на самом деле ошибка касается вашего оператора If, для которого требуется отдельная строка с End If после команды, которую вы хотите выполнить в вашем If-заявление.

Если такие маркеры отсутствуют, вы часто получаете сообщение об ошибке, которое не отражает действительную ошибку, поэтому следите за этими отсутствующими конечными элементами (End If, Next, Loop и т. Д.) При отладке!

В качестве дополнения ниже приводится обсуждение однострочной версии по сравнению с многострочной версией оператора If:

1)Если у вас есть только один оператор для выполнения, когда условие истинно:

  • , вы можете использовать многострочную версию, для которой требуется End If в конце:
    If Condition Then
        Do_Something
    End If
  • вы можете использовать однострочную версию оператора If, для которого не требуется End If в конце:
    If Condition Then Do_Something

Какой из них выбрать, это вопрос предпочтений.В случае выполнения только одного оператора может показаться целесообразным использовать версию в одну строку , поскольку она делает его аккуратным .

Однако multi-line версия остается более гибкой .Например, представьте себе, что в будущем вы понимаете, что вам нужно выражение If-Statement для выполнения большего количества операторов, вам придется переключиться обратно на многострочную версию *.Кроме того, для включения Else или ElseIf в ваш код для выполнения чего-либо, когда условие возвращает false, вам также понадобится многострочная версия ** ( Подробнее здесь ).

2) Если у вас есть несколько операторов для выполнения, когда условие выполняется:

  • Вы должны использовать многострочную версию, например:
    If Condition Then
        Do_Something
        Do_Another_Thing
    End If
  • Вы могли бы, но, вероятно, следует избегать для использования однострочной версии.Но если вы действительно хотите, вам придется использовать его в сочетании с двоеточием (:), чтобы разделить ваши утверждения следующим образом:
    If Condition Then Do_Something: Do_Another_Thing

В этом случае причина, по которой яЯ говорю, что вам, вероятно, следует избегать использования однострочной версии, потому что она становится трудной для чтения , и не все знакомы с использованием двоеточия (:) для добавления более одного оператора к одномустрока ( Подробнее здесь )

Сноски:
*: Как объяснено в части 2, вам не нужно было бы переключаться абсолютно, но это было бынастоятельно рекомендуется.
**: На самом деле вы могли бы написать Else в той же строке, используя
If Condition Then Do_Something Else Do_Something_Else, но я бы не стал поощрять его для удобства чтения.

...