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!