Direktfenster per VBA leeren

.. das wohl mächtigste Werkzeug in Bill Gates' Büro-Sippe. Ob reine Formeln, PowerQuery oder VBA. Hier bleiben kaum Wünsche unerfüllt.
Benutzeravatar
d'r Bastler
Beiträge: 683
Registriert: 29. Aug 2022, 13:20
Hat sich bedankt: 177 Mal
Danksagung erhalten: 91 Mal

Direktfenster per VBA leeren

#1

Beitrag von d'r Bastler »

Moin allerseits,

wer beim Coden gerne Zwischenergebnisse per Debug.Print protokolliert, kennt das Problem: Irgendwann ist das Fenster so voll, dass man den Überblick verliert. Den Aufruf der folgenden Kleinigkeit (in einem Allg. Modul) an den Anfang der zu protokollierenden Sub gestellt, erspart das manuelle Aufräumen:

Code: Alles auswählen

Sub ClearDebug()
    With Application
        .VBE.Windows("Direktbereich").Visible = True
        .VBE.Windows("Direktbereich").SetFocus
        SendKeys "^{a}"
        SendKeys "{Del}"
    End With
End Sub
In Extras/Verweisen muss dazu Microsoft Visual Basic For Application Extensibility 5.3 aktiviert sein.

Viel Spaß damit und schöne Grüße
d'r Bastler von den VBAsteleien.de
Win 10 + Office 2019 & Win11 + Office 2021 + Visio 2019 pro & macOS.X15 + Office2019pro & Android12 & XL365
Sulprobil
Beiträge: 22
Registriert: 23. Sep 2022, 05:54
Hat sich bedankt: 3 Mal
Danksagung erhalten: 14 Mal
Kontaktdaten:

Re: Direktfenster per VBA leeren

#2

Beitrag von Sulprobil »

Hallo,

Sendkeys? Niemals! :shock:

Aber wenn Du es schon machst, dann bitte:
1. Events Status merken, dann alle Events ausschalten.
2. Visible Status merken.
3. Dann machen, was Du wolltest.
4. Gemerkten Visible Status zurückschreiben, falls er anders war.
5. Events wieder einschalten, falls sie es vorher waren.

Du möchtest zwischen SetFocus und Sendkeys ungern eine Unterbrechung haben, die den Fokus verändert.

Viele Grüße,
Bernd
Folgende Benutzer bedankten sich beim Autor Sulprobil für den Beitrag:
d'r Bastler
Benutzeravatar
d'r Bastler
Beiträge: 683
Registriert: 29. Aug 2022, 13:20
Hat sich bedankt: 177 Mal
Danksagung erhalten: 91 Mal

Re: Direktfenster per VBA leeren

#3

Beitrag von d'r Bastler »

Moin Bernd!

erst einmal sorry für meine späte Antwort und das Danke für Deinen Hinweis! Der Grund dafür ist recht einfach: Du weist auf den Igittigitt-Ruf von SendKeys hin und beschreibst ja auch die Gefahr, dass der Focus durch einen anderen Event vom Direktfenster z.B. auf ein Modul übergeht und dann dort der gesamte Code futsch ist.

Deinen beschriebenen Vorschlag habe ich nicht umgesetzt, weil ich das mit dem Event Handling nicht konnte.

Also habe ich mich noch einmal auf die Suche begeben und tatsächlich eine API-Lösung gefunden, die ohne Igittigitt auskommt. Sie verzichtet auf SendKeys, zusätzliche Verweise und Lösungen durch Dritte, stammt aus einer englischen Feder und ich habe sie für ein deutsches VBA angepasst, eine kleine Direktfenster-Zumüllen-Sub geschrieben und erfolgreich getestet.

Es wird kaum überraschen, dass ich den API-Code nicht wirklich Zeile für Zeile verstehe und deshalb unbedingt folgende Warnung platzieren muss:

  • Den folgenden Code bitte unbedingt nur in zuvor gesicherter Testumgebung verwenden! Die Benutzung erfolgt vollständig auf eigene Gefahr.


Dieser Code gehört in ein Allg. Modul:

Code: Alles auswählen

Option Explicit

Private Declare PtrSafe _
            Function FindWindowA Lib "user32" ( _
                            ByVal lpClassName As String, _
                            ByVal lpWindowName As String _
                            ) As LongPtr
Private Declare PtrSafe _
            Function FindWindowExA Lib "user32" ( _
                            ByVal hWnd1 As LongPtr, _
                            ByVal hWnd2 As LongPtr, _
                            ByVal lpsz1 As String, _
                            ByVal lpsz2 As String _
                            ) As LongPtr
Private Declare PtrSafe _
            Function PostMessageA Lib "user32" ( _
                            ByVal hwnd As LongPtr, _
                            ByVal wMsg As Long, _
                            ByVal wParam As LongPtr, _
                            ByVal lParam As LongPtr _
                            ) As Long
Private Declare PtrSafe _
            Sub keybd_event Lib "user32" ( _
                            ByVal bVk As Byte, _
                            ByVal bScan As Byte, _
                            ByVal dwFlags As Long, _
                            ByVal dwExtraInfo As LongPtr)

Private Const WM_ACTIVATE As Long = &H6
Private Const KEYEVENTF_KEYUP = &H2
Private Const VK_CONTROL = &H11

Sub ClearImmediateWindow()

    Dim hwndVBE As LongPtr
    Dim hwndImmediate As LongPtr
    
    hwndVBE = FindWindowA("wndclass_desked_gsk", vbNullString)
    hwndImmediate = FindWindowExA(hwndVBE, ByVal 0&, "VbaWindow", "Direktbereich")
    PostMessageA hwndImmediate, WM_ACTIVATE, 1, 0&
    
    keybd_event VK_CONTROL, 0, 0, 0
    keybd_event vbKeyA, 0, 0, 0
    keybd_event vbKeyA, 0, KEYEVENTF_KEYUP, 0
    keybd_event VK_CONTROL, 0, KEYEVENTF_KEYUP, 0
    
    keybd_event vbKeyDelete, 0, 0, 0
    keybd_event vbKeyDelete, 0, KEYEVENTF_KEYUP, 0
    
End Sub

Sub FillUpImmediateWindow()
Dim i As Integer
   For i = 1 To 50
       Debug.Print i
   Next i
End Sub
Bitte unbedingt mit großer Vorsicht nutzen!!

Grüße allerseits!
d'r Bastler von den VBAsteleien.de
Win 10 + Office 2019 & Win11 + Office 2021 + Visio 2019 pro & macOS.X15 + Office2019pro & Android12 & XL365
Alfredowitch

Re: Direktfenster per VBA leeren

#4

Beitrag von Alfredowitch »

Hallo,

danke für den Code.
Bei
PostMessageA hwndImmediate, WM_ACTIVATE, 1, 0&
erhalte ich einen Fehler, dass ein constanter Ausdruck erwartet wird.
WM_ACTIVATE ist ja constant, daher verstehe ich den Fehler nicht.

Hat jemand eine Lösung?
DAnke
Alfred
Benutzeravatar
thowe
Beiträge: 209
Registriert: 12. Sep 2022, 16:57
Hat sich bedankt: 79 Mal
Danksagung erhalten: 67 Mal
Kontaktdaten:

Re: Direktfenster per VBA leeren

#5

Beitrag von thowe »

Hallo Alfred!

Danke für deine (Rück)Frage!

Bei mir laufen alle Sub-Routinen ohne zu meckern durch.
Ich kann den Fehler - leider - nicht reproduzieren.

Vielleicht kannst du nähere Informationen geben?
- welche Excel Version?
- Lokal gespeichert oder auf Cloud?
- welche Sprache?
- wie genau lautet die Fehlermeldung (Originaltext...)?

Offensichtlich kann man die Sub Prozedur: ClearImmediateWindow() nicht im Einzelschritt [F8] durchlaufen.

Den Code verstehe ich nicht ansatzweise, daher kann ich ausgenommen die Fragen zu stellen, nicht weiterhelfen
Benutzeravatar
d'r Bastler
Beiträge: 683
Registriert: 29. Aug 2022, 13:20
Hat sich bedankt: 177 Mal
Danksagung erhalten: 91 Mal

Re: Direktfenster per VBA leeren

#6

Beitrag von d'r Bastler »

Moin Alfred,

in meinem XL2021 kann ich den Fehler auch nicht reproduzieren, habe aber spaßeshalber mal "&" am Ende der Zeile weggelassen. Der Code läuft auch ohne den Kaufmann. Vielleicht klappt's.
Ansonsten wäre ein möglicher Ansatz die Deklarationen an 32/64-Bit anzupassen.

Moin thowe,

Du wirst nicht überrascht sein, dass ich den Code auch nicht wirklich verstehe. Aber immerhin ist mir gelungen, ihn für eine deutsche Umgebung zu übersetzen. 8-)

lg
d'r Bastler von den VBAsteleien.de
Win 10 + Office 2019 & Win11 + Office 2021 + Visio 2019 pro & macOS.X15 + Office2019pro & Android12 & XL365
Benutzeravatar
thowe
Beiträge: 209
Registriert: 12. Sep 2022, 16:57
Hat sich bedankt: 79 Mal
Danksagung erhalten: 67 Mal
Kontaktdaten:

Re: Direktfenster per VBA leeren

#7

Beitrag von thowe »

Hallöchen Alfred,

heb meint mit
(...) die Deklarationen an 32/64-Bit anzupassen (...)
, folgende Deklarationen im Modulkopf.

Code: Alles auswählen

#If VBA7 and win64 Then
	
    Private Declare PtrSafe Function FindWindowA Lib "user32" (ByVal lpClassName As String, ...)
Else

   Private Declare Function FindWindowA Lib "user32" (ByVal lpClassName As String, ...)
End if
lg thowe
Folgende Benutzer bedankten sich beim Autor thowe für den Beitrag:
d'r Bastler
Troother
Beiträge: 2
Registriert: 29. Jul 2024, 15:38
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: Direktfenster per VBA leeren

#8

Beitrag von Troother »

Hallo an Alle!
Ich bin neu in diesem Forum und habe gleich eine Frage.

Funktioniert der Code auch bei MacOS?
Ich frage weil in dem Code steht "and win64" steht.

Vielleicht eine Anfängerfrage, ich bin aber neu in VBA.

Gruß Troother
Folgende Benutzer bedankten sich beim Autor Troother für den Beitrag:
d'r Bastler
Benutzeravatar
d'r Bastler
Beiträge: 683
Registriert: 29. Aug 2022, 13:20
Hat sich bedankt: 177 Mal
Danksagung erhalten: 91 Mal

Re: Direktfenster per VBA leeren

#9

Beitrag von d'r Bastler »

Moin Troother,

herzlich willkomen hier :)

Deine Frage ist spannend, weshalb ich den Code eben auf meinem Iren getestet habe. Mein kleines Vorbereitungstool FillUpImmediateWindow füllt das Direktfenster tatsächlich brav mit einer Liste von Zahlen. Die dann wieder aufzuräumen, scheitert erwartungsgemäß an den Windows-APIs, die dafür notwendig sind.

Was Du natürlich versuchen kannst, ist mein FillUp statt mit Zahlen mit Leerstrings zu füllen. Das ist zwar nicht wirklich sauber, kann aber im Bedarfsfall helfen.

Meine Ahnung vom Mac grenzt an der von Schwarzer Materie, aber ich kann mir durchaus vorstellen, dass es in der Apfelwelt ähnliche Mechanismen (nämlich den Weg über die Titles offener Fenster im VBE) gibt.

M.E. ein spannendes Thema für Apple-Foren, deren Ergebnisse Du dann gerne nach hier verlinken kannst. Ich wäre schon mal neugierig :)

lg
d'r Bastler von den VBAsteleien.de
Win 10 + Office 2019 & Win11 + Office 2021 + Visio 2019 pro & macOS.X15 + Office2019pro & Android12 & XL365
Benutzeravatar
BitDoctor
Beiträge: 17
Registriert: 18. Aug 2024, 21:04
Hat sich bedankt: 8 Mal
Danksagung erhalten: 5 Mal
Kontaktdaten:

Re: Direktfenster per VBA leeren

#10

Beitrag von BitDoctor »

Winke, winke,

wollte für die 3 Zeilen kein neuen Post öffen.

Aber vlt. mags der Eine oder Andere. Ich nutze es recht viel und passt "ganz fast" zum Thema :roll:

saf = schließt alle geöffneten Codefenster im VBE.

Code: Alles auswählen

Public Sub SaF()
  Dim objCodePane As Object
  For Each objCodePane In Application.VBE.CodePanes
      objCodePane.Window.Close
  Next
End Sub
Grüße BD
Folgende Benutzer bedankten sich beim Autor BitDoctor für den Beitrag:
d'r Bastler
Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste