
Angenommen, ich habe eine große primäre Routine, die viele Dinge tut und verschiedene andere Programme aufruft.
Beim Debuggen gehe ich mein Hauptprogramm schrittweise durch, F8damit ich Zeile für Zeile sehen kann, was passiert.
Wenn ich dies jedoch tue, werden auch alle Routinen durchlaufen, die ich von diesem Haupt-Sub aufrufe. End Sub
Gibt es eine Möglichkeit, VBA nur diese Routine ausführen zu lassen, aber dann anzuhalten, wenn ich zu meinem Hauptprogramm zurückkehre, anstatt zu den aufgerufenen Routinen zu scrollen und eine Unterbrechung einzufügen?
Derzeit habe ich zwei Möglichkeiten, dies zu tun. Fügen Sie einen Zeilenumbruch in die Zeile einnachIch rufe in der Hauptroutine ein Sub auf, oder ich füge in der End Sub
Zeile dieser aufgerufenen Routine einen Umbruch ein.
Zum Beispiel,
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
Wenn ich also mein Hauptprogramm Zeile für Zeile durchgehe, möchte ich es ausführen können, do_things
ohne eine Unterbrechung bei For Each cel in rng...
oder einfügen zu müssen End Sub
.
Ich vermute, eine Lösung wäre, VBA automatisch zu starten, break
wenn es auf eine End Sub
Zeile trifft oder so etwas. Ich bin offen für Ideen, ich habe herumgesucht und kann nichts anderes als die aktuellen Lösungen finden, die ich oben erwähnt habe.
(Tut mir leid, wenn der Titel etwas holprig ist, mir ist keine bessere Formulierung eingefallen – ändern Sie ihn gern.)
Antwort1
Das stimmt – auch wenn es auf den ersten Blick vielleicht nicht offensichtlich ist.
Wenn Sie sich in dieser Subroutine befinden (obwohl dies bei jeder Routine funktioniert), gehen Sie zu Debug --> Step Out
( CTRL+SHIFT+F8).
Das wird tatsächlichvollständigdiese Routine, und gehen Sie dann zur nächsten Zeile im anderen Code, falls zutreffend. (Beim ersten Lesen nahm ich an, dass es diese Routine einfach in der aktuellen Zeile stoppte und zu der Routine zurückkehrte, die sie aufgerufen hatte).
Zum Beispiel:
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 des obigen Bildes:
Bearbeiten: Ein ausgezeichneter Kommentar, den ich hinzufügen wollte, um diese Antwort vollständiger zu machen. Laut @MathieuGuindon do_things rng
können Sie, wenn die Zeile hervorgehoben ist, Debug --> Step Over
( SHIFT+F8) undlaufen do_things
vollständig, und es wird bei der nächsten Zeile angehalten.