Use VBA to Clear Immediate Window?

前端 未结 16 956
刺人心
刺人心 2021-01-30 00:19

Does anyone know how to clear the immediate window using VBA?

While I can always clear it myself manually, I am curious if there is a way to do this programmatically.

16条回答
  •  鱼传尺愫
    2021-01-30 00:49

    Thanks ProfoundlyOblivious,

    No SendKeys, check
    No VBA Extensibility, check
    No 3rd Party Executables, check
    One minor problem:

    Localised Office versions use another caption for the immediate window. In Dutch it is named "Direct".
    I have added one line to get the localised caption in case FindWindowExA fails. For those who use both the English and Dutch version of MS-Office.

    +1 for you for doing most of the work!

    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
    
    Public Sub ClearImmediateWindow()
        Dim hwndVBE As LongPtr
        Dim hwndImmediate As LongPtr
        
        hwndVBE = FindWindowA("wndclass_desked_gsk", vbNullString)
        hwndImmediate = FindWindowExA(hwndVBE, ByVal 0&, "VbaWindow", "Immediate") ' English caption
        If hwndImmediate = 0 Then hwndImmediate = FindWindowExA(hwndVBE, ByVal 0&, "VbaWindow", "Direct") ' Dutch caption
        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
    

提交回复
热议问题