
Допустим, у меня есть большая основная процедура, которая выполняет множество задач и вызывает различные другие программы.
При отладке я прохожусь по своей основной программе пошагово, 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
полностью, и он остановится на следующей строке.