webentwicklung-frage-antwort-db.com.de

VBA zum Löschen des Direktfensters verwenden?

Kann jemand das unmittelbare Fenster mit VBA löschen?

Obwohl ich es immer manuell löschen kann, bin ich neugierig, ob es eine Möglichkeit gibt, dies programmgesteuert zu tun.

43
Alpha

Unten ist eine Lösung von hier

Sub stance()
Dim x As Long

For x = 1 To 10    
    Debug.Print x
Next

Debug.Print Now
Application.SendKeys "^g ^a {DEL}"    
End Sub
25
Blaz Brencic

Viel schwieriger war das, was ich mir vorgestellt hatte. Ich habe eine Version here von keepitcool gefunden, die die gefürchteten Sendkeys vermeidet.

Führen Sie dies von einem regulären Modul aus.

Aktualisiert, da der ursprüngliche Beitrag die privaten Funktionsdeklarationen verfehlt hat - fehlerhafter Kopier- und Einfügejob von Ihnen wirklich}

Private Declare Function GetWindow _
Lib "user32" ( _
ByVal hWnd As Long, _
ByVal wCmd As Long) As Long
Private Declare Function FindWindow _
Lib "user32" Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx _
Lib "user32" Alias "FindWindowExA" _
(ByVal hWnd1 As Long, ByVal hWnd2 As Long, _
ByVal lpsz1 As String, _
ByVal lpsz2 As String) As Long
Private Declare Function GetKeyboardState _
Lib "user32" (pbKeyState As Byte) As Long
Private Declare Function SetKeyboardState _
Lib "user32" (lppbKeyState As Byte) As Long
Private Declare Function PostMessage _
Lib "user32" Alias "PostMessageA" ( _
ByVal hWnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, ByVal lParam As Long _
) As Long


Private Const WM_KEYDOWN As Long = &H100
Private Const KEYSTATE_KEYDOWN As Long = &H80


Private savState(0 To 255) As Byte


Sub ClearImmediateWindow()
'Adapted  by   keepITcool
'Original from Jamie Collins fka "OneDayWhen"
'http://www.dicks-blog.com/Excel/2004/06/clear_the_immed.html


Dim hPane As Long
Dim tmpState(0 To 255) As Byte


hPane = GetImmHandle
If hPane = 0 Then MsgBox "Immediate Window not found."
If hPane < 1 Then Exit Sub


'Save the keyboardstate
GetKeyboardState savState(0)


'Sink the CTRL (note we work with the empty tmpState)
tmpState(vbKeyControl) = KEYSTATE_KEYDOWN
SetKeyboardState tmpState(0)
'Send CTRL+End
PostMessage hPane, WM_KEYDOWN, vbKeyEnd, 0&
'Sink the SHIFT
tmpState(vbKeyShift) = KEYSTATE_KEYDOWN
SetKeyboardState tmpState(0)
'Send CTRLSHIFT+Home and CTRLSHIFT+BackSpace
PostMessage hPane, WM_KEYDOWN, vbKeyHome, 0&
PostMessage hPane, WM_KEYDOWN, vbKeyBack, 0&


'Schedule cleanup code to run
Application.OnTime Now + TimeSerial(0, 0, 0), "DoCleanUp"


End Sub


Sub DoCleanUp()
' Restore keyboard state
SetKeyboardState savState(0)
End Sub


Function GetImmHandle() As Long
'This function finds the Immediate Pane and returns a handle.
'Docked or MDI, Desked or Floating, Visible or Hidden


Dim oWnd As Object, bDock As Boolean, bShow As Boolean
Dim sMain$, sDock$, sPane$
Dim lMain&, lDock&, lPane&


On Error Resume Next
sMain = Application.VBE.MainWindow.Caption
If Err <> 0 Then
MsgBox "No Access to Visual Basic Project"
GetImmHandle = -1
Exit Function
' Excel2003: Registry Editor (Regedit.exe)
'    HKLM\SOFTWARE\Microsoft\Office\11.0\Excel\Security
'    Change or add a DWORD called 'AccessVBOM', set to 1
' Excel2002: Tools/Macro/Security
'    Tab 'Trusted Sources', Check 'Trust access..'
End If


For Each oWnd In Application.VBE.Windows
If oWnd.Type = 5 Then
bShow = oWnd.Visible
sPane = oWnd.Caption
If Not oWnd.LinkedWindowFrame Is Nothing Then
bDock = True
sDock = oWnd.LinkedWindowFrame.Caption
End If
Exit For
End If
Next
lMain = FindWindow("wndclass_desked_gsk", sMain)
If bDock Then
'Docked within the VBE
lPane = FindWindowEx(lMain, 0&, "VbaWindow", sPane)
If lPane = 0 Then
'Floating Pane.. which MAY have it's own frame
lDock = FindWindow("VbFloatingPalette", vbNullString)
lPane = FindWindowEx(lDock, 0&, "VbaWindow", sPane)
While lDock > 0 And lPane = 0
lDock = GetWindow(lDock, 2) 'GW_HWNDNEXT = 2
lPane = FindWindowEx(lDock, 0&, "VbaWindow", sPane)
Wend
End If
ElseIf bShow Then
lDock = FindWindowEx(lMain, 0&, "MDIClient", _
vbNullString)
lDock = FindWindowEx(lDock, 0&, "DockingView", _
vbNullString)
lPane = FindWindowEx(lDock, 0&, "VbaWindow", sPane)
Else
lPane = FindWindowEx(lMain, 0&, "VbaWindow", sPane)
End If


GetImmHandle = lPane


End Function
23
brettdj

SendKeys ist gerade, aber Sie mögen es vielleicht nicht (es öffnet beispielsweise das Direktfenster, wenn es geschlossen wurde, und verschiebt den Fokus).

Die WinAPI + VBE-Methode ist sehr umfangreich, aber Sie möchten möglicherweise keinen VBA-Zugriff auf VBE gewähren (möglicherweise ist dies sogar Ihre Unternehmensgruppenrichtlinie).

Anstatt zu löschen, können Sie den Inhalt (oder einen Teil davon ...) mit Leerzeichen wegspülen:

Debug.Print String(65535, vbCr)

Dies funktioniert leider nur, wenn sich die Caret-Position am Ende des Direktfensters befindet (Zeichenfolge wird eingefügt, nicht angehängt). Wenn Sie Inhalte nur über Debug.Print veröffentlichen und das Fenster nicht interaktiv verwenden, wird dies erledigt. Wenn Sie das Fenster aktiv nutzen und gelegentlich zu den Inhalten navigieren, hilft dies nicht viel.

16
Akos Groller

oder noch einfacher

Sub clearDebugConsole()
    For i = 0 To 100
        Debug.Print ""
    Next i
End Sub
14

Hier ist eine Kombination von Ideen (getestet mit Excel vba 2007):

'* (dies kann Ihren täglichen Aufruf zum Debuggen ersetzen)

Public Sub MyDebug(sPrintStr As String, Optional bClear As Boolean = False)
   If bClear = True Then
      Application.SendKeys "^g^{END}", True

      DoEvents '  !!! DoEvents is VERY IMPORTANT here !!!

      Debug.Print String(30, vbCrLf)
   End If

   Debug.Print sPrintStr
End Sub

Ich mag es nicht, den unmittelbaren Inhalt zu löschen (Angst vor dem versehentlichen Löschen des Codes.... Das obige ist also ein Hacken auf einige der Codes, die Sie alle geschrieben haben.

Damit wird das Problem gelöst, über das Akos Groller oben schreibt: "Leider funktioniert das funktioniert nur, wenn die Caret-Position am Ende steht von Dem Direktfenster"

Der Code öffnet das Direktfenster (oder legt den Fokus darauf), Sendet eine STRG + ENDE, gefolgt von einer Flut von Zeilenumbrüchen Der vorherige Debug-Inhalt ist nicht in Sicht.

Bitte beachten Sie, dass DoEvents entscheidend ist , andernfalls würde die Logik ausfallen .__ (die Caret-Position würde sich nicht rechtzeitig zum Ende des Direktfensters bewegen).

5
El Scripto

Ich hatte das gleiche Problem. So habe ich das Problem mit Hilfe des Microsoft-Links gelöst: https://msdn.Microsoft.com/en-us/library/office/gg278655.aspx

Sub clearOutputWindow()
  Application.SendKeys "^g ^a"
  Application.SendKeys "^g ^x"
End Sub
2
TheRealJD

Nach einigem Experimentieren habe ich einige Mods zum mehow-Code wie folgt gemacht:

  1. Trap-Fehler (der ursprüngliche Code fällt um, weil kein Verweis auf "VBE" gesetzt wurde, den ich aus Gründen der Übersichtlichkeit auch auf myVBE geändert habe)
  2. Stellen Sie das Direktfenster auf sichtbar (nur für den Fall!)
  3. Die Zeile wurde auskommentiert, um den Fokus auf das ursprüngliche Fenster zurückzusetzen, da diese Zeile dazu führt, dass der Inhalt des Codefensters auf Computern gelöscht wird, auf denen Zeitprobleme auftreten. Es scheint, dass der Fokus zurückschaltet, bevor SendKeys abgeschlossen ist, auch wenn Wait auf True gesetzt ist!
  4. Ändern Sie den Wartestatus für SendKeys, da er in meiner Testumgebung nicht eingehalten wird.

Ich habe auch festgestellt, dass das Projekt für das VBA-Projektobjektmodell aktiviert sein muss.

' DEPENDENCIES
' 1. Add reference:
' Tools > References > Microsoft Visual Basic for Applications Extensibility 5.3
' 2. Enable VBA project access:
' Backstage / Options / Trust Centre / Trust Center Settings / Trust access to the VBA project object model

Public Function ClearImmediateWindow()
  On Error GoTo ErrorHandler
  Dim myVBE As VBE
  Dim winImm As VBIDE.Window
  Dim winActive As VBIDE.Window

  Set myVBE = Application.VBE
  Set winActive = myVBE.ActiveWindow
  Set winImm = myVBE.Windows("Immediate")

  ' Make sure the Immediate window is visible
  winImm.Visible = True

  ' Switch the focus to the Immediate window
  winImm.SetFocus

  ' Send the key sequence to select the window contents and delete it:
  ' Ctrl+Home to move cursor to the top then Ctrl+Shift+End to move while
  ' selecting to the end then Delete
  SendKeys "^{Home}", False
  SendKeys "^+{End}", False
  SendKeys "{Del}", False

  ' Return the focus to the user's original window
  ' (comment out next line if your code disappears instead!)
  'winActive.SetFocus

  ' Release object variables memory
  Set myVBE = Nothing
  Set winImm = Nothing
  Set winActive = Nothing

  ' Avoid the error handler and exit this procedure
  Exit Function

ErrorHandler:
   MsgBox "Error " & Err.Number & vbCrLf & vbCrLf & Err.Description, _
      vbCritical + vbOKOnly, "There was an unexpected error."
  Resume Next
End Function
2
Jamie Garroch

Die markierte Antwort funktioniert nicht, wenn sie über die Schaltfläche im Arbeitsblatt ausgelöst wird. Es öffnet sich das Dialogfeld "Gehe zu Excel", während STRG + G die Verknüpfung für ist. Sie müssen vorher auf das Direktfenster setzen. Möglicherweise benötigen Sie auch DoEvent, wenn Sie direkt nach dem Löschen Debug.Print möchten.

Application.VBE.Windows("Immediate").SetFocus
Application.SendKeys "^g ^a {DEL}"
DoEvents

Der Vollständigkeit halber bemerkte @Austin D:

Für diejenigen, die sich fragen, sind die Tastenkombinationen Strg + G (um das Direktfenster zu aktivieren), dann Strg + A (um alles auszuwählen), dann Del (um Löschen).

1
Artur Fityka

Zum Reinigen von Immediate -Fenster verwende ich (VBA Excel 2016) die nächste Funktion:

Private Sub ClrImmediate()
   With Application.VBE.Windows("Immediate")
       .SetFocus
       Application.SendKeys "^g", True
       Application.SendKeys "^a", True
       Application.SendKeys "{DEL}", True
   End With
End Sub

Aber direkter Aufruf von ClrImmediate() wie folgt:

Sub ShowCommandBarNames()
    ClrImmediate
 '--   DoEvents    
    Debug.Print "next..."
End Sub

funktioniert nur, wenn ich den Haltepunkt auf Debug.Print setze, andernfalls wird das Löschen nach der Ausführung von ShowCommandBarNames() durchgeführt - NICHT vor Debug.Print . Leider hat der Aufruf von DoEvents() mir nicht geholfen ... Und egal: TRUE oder FALSE ist für SendKeys gesetzt.

Um dieses Problem zu lösen, verwende ich folgende Anrufe:

Sub ShowCommandBarNames()
 '--    ClrImmediate
    Debug.Print "next..."
End Sub

Sub start_ShowCommandBarNames()
   ClrImmediate
   Application.OnTime Now + TimeSerial(0, 0, 1), "ShowCommandBarNames"
End Sub

Es scheint mir, dass die Verwendung von Application.OnTime bei der Programmierung für VBA-IDE sehr nützlich sein kann. In diesem Fall kann sogar TimeSerial (0, 0, 0 ) verwendet werden.

1
Leon Rom

Ich bin dafür, dass ich nicht immer auf die Tastenkombinationen angewiesen bin, da es in einigen Sprachen funktionieren kann, aber nicht in allen Sprachen ..... Hier ist mein bescheidener Beitrag:

Public Sub CLEAR_IMMEDIATE_WINDOW()
'by Fernando Fernandes
'YouTube: Expresso Excel
'Language: Portuguese/Brazil
    Debug.Print VBA.String(200, vbNewLine)
End Sub
1
Sub ClearImmediateWindow()
    SendKeys "^{g}", False
    DoEvents
    SendKeys "^{Home}", False
      SendKeys "^+{End}", False
      SendKeys "{Del}", False
        SendKeys "{F7}", False
End Sub
1
Mike Rodriguez