Ничего не делать в vba

Есть ли в VBA эквивалент Python "pass", чтобы просто ничего не делать в коде?

например:

For Each ws In ThisWorkbook.Sheets
    If ws.Name = "Navy Reqs" Then
        ws.Select
        nReqs = get_num_rows
        Cells(1, 1).Select
        If ActiveSheet.AutoFilterMode Then Cells.AutoFilter
        Selection.AutoFilter
    ElseIf ws.Name = "temp" Then
        pass
    Else
        ws.Select
        nShips = get_num_rows
    End If
Next

Я получаю ошибку здесь, что проход не определен. Благодарю.

10 ответов

Решение

Просто удали pass и снова запустите код. VBA будет рад принять то, что я верю

Не включайте никаких заявлений:

Sub qwerty()
    If 1 = 3 Then
    Else
        MsgBox "1 does not equal 3"
    End If
End Sub

Напишите код, который делает то, что говорит, и говорит, что он делает.

For Each ws In ThisWorkbook.Sheets
    If ws.Name = "Navy Reqs" Then
        ws.Select
        nReqs = get_num_rows
        Cells(1, 1).Select
        If ActiveSheet.AutoFilterMode Then Cells.AutoFilter
        Selection.AutoFilter
    Else If ws.Name <> "temp" Then
        ws.Select
        nShips = get_num_rows
    End If
Next

Это все, что вам нужно. Инструкция, которая означает "вот какой-то бесполезный код", не существует в VBA.

Вы хотите комментарии, которые говорят почему, а не что - комментарий, который говорит 'do nothing полная противоположность этому. Не пишите неоперативный код, это чистый шум.

Предполагая Python pass работает как C# continue оператора и переходит к следующей итерации, тогда VBA-эквивалент - это единственное законное использование GoTo Прыгать:

    For ...    
        If ... Then GoTo Skip
        ...
Skip:
    Next

Просто оставьте это пустым. Вы также можете использовать оператор Select, его легче читать.

For Each ws In ThisWorkbook.Sheets
    Select Case ws.Name
        Case "Navy Reqs":
            '...

        Case "temp":
            'do nothing

        Case Else:
            '...
    End Select
Next

Этот код показывает тест IF, который продолжает поиск, пока не получит совпадение.

Function EXCAT(Desc)
    Dim txt() As String

    ' Split the string at the space characters.
    txt() = Split(Desc)

    For i = 0 To UBound(txt)

        EXCAT = Application.VLookup(txt(i), Worksheets("Sheet1").Range("Dept"), 2, False)

        If IsError(EXCAT) Then Else Exit Function

    Next

    ' watch this space for composite word seach
    EXCAT = "- - tba - -"

End Function

Создайте свою собственную версию «pass» с помощью следующей подпрограммы:

      Public Sub Pass ()
'This subroutine does nothing except to act as a placeholder
    
End Sub

Затем просто вызовите подпрограмму, например:

      Call Pass

Я кодировал на COBOL много лет, и эквивалентное выражение "ничего не делать" звучит так: NEXT SENTENCE.

В VBA я создаю фиктивную переменную (иногда глобальную) dim dummy as integer а затем, когда мне нужно действие "ничего не делать" в If..Then..Else Я ввел строку кода: dummy = 0.

Я использую «DoEvents» как отсутствие рабочих строк, где мне может понадобиться точка останова для отладки VBA. Дополнительным преимуществом является возможность всегда останавливаться при нажатии клавиши «Esc» на клавиатуре или кнопке паузы в редакторе VBA.

На самом деле это законный вопрос. Я хочу запустить процедуру отладки, которая останавливается при достижении определенного критического значения, скажем, 8, т. Е. Устанавливает точку останова на x = 8, а затем поэтапно. Так что полезна следующая конструкция:

Select Case x
    Case 21
        'do nothing
    Case 8
        'do nothing
    Case 14
        'do nothing
    Case 9
        'do nothing
End Select
  • Поскольку вы не можете поставить точку останова на комментарии, необходимо собственное выражение.
  • Вы также не можете поставить точку останова на операторах Case, потому что они выполняются каждый раз.

Очевидно, здесь все в порядке, например, x=x, но было бы неплохо иметь что-нибудь формальное, например pass.

Но я использовал x=x.

В большинстве языков есть "пустой" или "пустой" оператор, как в Python pass. Эти утверждения эволюционировали, потому что они практически полезны, а в некоторых грамматиках необходимы. Например, как предлагали другие, пустые операторы могут служить в качестве якорей без побочных эффектов для отладчика.

Я использую:

Debug.Assert True

Обратите внимание, что если ваш вариант использования - установить условную точку останова, вы можете найти Stop более полезно, например:

        If targetShape.Type = msoAutoShape Then
            Stop
        End

Другие вопросы по тегам