
たとえば、多くの処理を実行し、さまざまな他のプログラムを呼び出す大きなプライマリ ルーチンがあるとします。
デバッグするときは、メイン プログラムをステップ実行して、F8何が起こっているかを行ごとに確認します。
ただし、これを行うと、そのメイン サブから呼び出すすべてのルーチンもステップ実行されます。呼び出されたルーチンまでスクロールしてEnd Sub
Break を配置する代わりに、VBA でそのルーチンを実行し、メイン プログラムに戻ったときに停止する方法はありますか?
現在、これを行うには2つの方法があります。行に改行を追加する後MAIN ルーチンでサブを呼び出すか、呼び出されたルーチンの行にブレークを追加します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
したがって、メイン プログラムを 1 行ずつ実行するときに、または でdo_things
break を置かなくても実行できるようにしたいと思います。For Each cel in rng...
End Sub
解決策の 1 つは、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
完全に終了し、次の行で停止します。