Отладка VBA — пошагово выполнять основную программу, но запускать процедуры, вызванные из нее?

Отладка VBA — пошагово выполнять основную программу, но запускать процедуры, вызванные из нее?

Допустим, у меня есть большая основная процедура, которая выполняет множество задач и вызывает различные другие программы.

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

Однако, когда я это делаю, любые процедуры, которые я вызываю из этой основной подпрограммы, также проходят пошагово. Вместо того, чтобы прокручивать до вызываемой процедуры End Subи помещать Break, есть ли способ заставить VBA просто запустить эту процедуру, но затем остановить ее, когда я вернусь к своей основной программе?

В настоящее время у меня есть два способа сделать это. Добавить разрыв в строкупослеЯ вызываю подпрограмму в ОСНОВНОЙ процедуре или добавляю разрыв в End Subстроку вызванной процедуры.

Например,

Sub main_program()
Dim rng As Range
Set rng = Range("A1:Z1000")

do_things rng

Dim cel As Range
For Each cel In rng.SpecialCells(xlCellTypeBlanks)
    Debug.Print cel.Offset(1, 0).Value
Next cel
End Sub

Sub do_things(rng As Range)
Dim cel As Range
For Each cel In rng
    If cel.Value <> "something" Then
        cel.Font.Bold = True
    End If
Next cel
End Sub

Поэтому при последовательном выполнении моей основной программы я хотел бы иметь возможность работать do_thingsбез необходимости прерывания For Each cel in rng...или End Sub.

Я бы предположил, что одно из решений — это автоматически запускать VBA, breakкогда он достигает End Subстроки, или что-то в этом роде. Я открыт для идей, я искал и не могу найти ничего, кроме текущих решений, которые я упомянул выше.

(Извините, если заголовок немного корявый, я не смог придумать лучшего способа его сформулировать — не стесняйтесь редактировать).

решение1

Да, это так, хотя на первый взгляд это может быть неочевидно.

Когда вы находитесь в этой подпрограмме (хотя это работает в любой подпрограмме), перейдите к Debug --> Step Out( CTRL+SHIFT+F8).

Это на самом деле будетполныйэтой подпрограмме, а затем перейти к следующей строке в другом коде, если это применимо. (При первом прочтении я предположил, что он просто останавливает эту подпрограмму на текущей строке и возвращается к подпрограмме, которая ее вызвала).

Например:

Sub main_program()
Dim rng As Range
Set rng = Range("A1:B10")

do_things rng

Dim cel As Range
For Each cel In rng.SpecialCells(xlCellTypeBlanks)
    Debug.Print cel.Offset(1, 0).Value
Next cel
End Sub

Sub do_things(rng As Range)
Dim cel As Range
For Each cel In rng
    cel.Value = "Test"
Next cel
For Each cel In rng
    If cel.Row Mod 2 = 1 Then cel.EntireRow.Font.Bold = True
Next cel
End Sub

.gif вышеизложенного:

введите описание изображения здесь

Редактировать: Отличный комментарий, который я хотел добавить, чтобы сделать этот ответ более полным. Согласно @MathieuGuindon, когда строка do_things rngвыделена, вы можете сделать Debug --> Step Over( SHIFT+F8) ибегать do_thingsполностью, и он остановится на следующей строке.

Связанный контент