Hallo liebe Community,
es gibt ja eine Office-Zwischenablage, in der die kopierte Informationen abgelegt werden.
Jetzt gibt es bei mir(nicht mehr) täglich mehrmals eine Fehlermeldung die heißt 'Kann die Zwischenablage nicht leeren', unabhängig davon, ob in der Office-Zwischenablage etwas drin ist oder nicht.
Das nervt unheimlich, wenn Sie ein Makro, das Kopieren-Einfügen -Funktionen beinhaltet, im Hintergrund laufen lassen haben und das jedes Mal sein Dienst quittiert, weil die Office-Zwischenablage angeblich voll ist.
Meine Recherchen im Internet brachten mich nicht so weit, um das Problem mit VBA zu lösen. Nun habe ich doch im Internet ein VBA-Makro gefunden, das für Excel 2003-2007 geschrieben war.
Den Code habe ich modifiziert und angepasst sodass unter Excel 2010 (deutsche Version) 32bit und 64bit laufen kann.
Wer Interesse hat oder probieren will, kann den Quelcode kopieren und in einem allgemeinen Modul einfügen.
Vie Spaß damit
Spoiler anzeigen
Edit by hal2000:
- Expander und Code-Tags eingefügt.
es gibt ja eine Office-Zwischenablage, in der die kopierte Informationen abgelegt werden.
Jetzt gibt es bei mir(nicht mehr) täglich mehrmals eine Fehlermeldung die heißt 'Kann die Zwischenablage nicht leeren', unabhängig davon, ob in der Office-Zwischenablage etwas drin ist oder nicht.
Das nervt unheimlich, wenn Sie ein Makro, das Kopieren-Einfügen -Funktionen beinhaltet, im Hintergrund laufen lassen haben und das jedes Mal sein Dienst quittiert, weil die Office-Zwischenablage angeblich voll ist.
Meine Recherchen im Internet brachten mich nicht so weit, um das Problem mit VBA zu lösen. Nun habe ich doch im Internet ein VBA-Makro gefunden, das für Excel 2003-2007 geschrieben war.
Den Code habe ich modifiziert und angepasst sodass unter Excel 2010 (deutsche Version) 32bit und 64bit laufen kann.
Wer Interesse hat oder probieren will, kann den Quelcode kopieren und in einem allgemeinen Modul einfügen.
Vie Spaß damit
Visual Basic-Quellcode
- 'Code
- Option Explicit
- #If VBA7 And Win64 Then
- Private Declare PtrSafe Function FindWindowEx Lib "USER32" _
- Alias "FindWindowExA" (ByVal hWnd1 As LongPtr, ByVal hWnd2 As LongPtr, _
- ByVal lpsz1 As String, ByVal lpsz2 As String) As LongPtr
- Private Declare PtrSafe Function PostMessage Lib "USER32" Alias "PostMessageA" _
- (ByVal hwnd As LongPtr, ByVal wMsg As Long, _
- ByVal wParam As LongPtr, ByVal lParam As LongPtr) As Long
- Private Declare PtrSafe Function apiOpenClipboard Lib _
- "USER32" Alias "OpenClipboard" (ByVal hwnd As LongPtr) As Long
- Private Declare PtrSafe Function apiEmptyClipboard Lib _
- "USER32" Alias "EmptyClipboard" () As Long
- Private Declare PtrSafe Function apiCloseClipboard Lib _
- "USER32" Alias "CloseClipboard" () As Long
- Private Declare PtrSafe Sub Sleep Lib _
- "kernel32.dll" (ByVal dwMilliseconds As Long)
- #Else
- Private Declare Function apiOpenClipboard Lib _
- "USER32" Alias "OpenClipboard" (ByVal hwnd As Long) As Long
- Private Declare Function apiEmptyClipboard Lib _
- "USER32" Alias "EmptyClipboard" () As Long
- Private Declare Function apiCloseClipboard Lib _
- "USER32" Alias "CloseClipboard" () As Long
- Private Declare Sub Sleep Lib _
- "kernel32.dll" (ByVal dwMilliseconds As Long)
- Private Declare Function FindWindowEx Lib _
- "user32.dll" Alias "FindWindowExA" (ByVal hWnd1 As Long, _
- ByVal hWnd2 As Long, ByVal lpsz1 As String, _
- ByVal lpsz2 As String) As Long
- Private Declare Function PostMessage Lib _
- "user32.dll" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, _
- ByVal wParam As Long, ByVal lParam As Long) As Long
- #End If
- Private Const WM_LBUTTONDOWN As Long = &H201&
- Private Const WM_LBUTTONUP As Long = &H202&
- Private Function MakeLong(ByVal nLoWord As Integer, ByVal nHiWord As Integer) As Long
- MakeLong = nHiWord * 65536 + nLoWord
- End Function
- Sub ClearOfficeClipboard()
- #If VBA7 And Win64 Then
- Dim hMain As LongPtr, hExcel2 As LongPtr, hClip As LongPtr, hWindow As LongPtr, hParent As LongPtr
- Dim lParameter As Long, sTask$
- #Else
- Dim hMain As Long, hExcel2 As Long, hClip As Long, hWindow As Long, hParent As Long
- Dim lParameter As Long, sTask$
- #End If
- Dim ocbShow As Boolean
- sTask = Application.CommandBars("Office Clipboard").NameLocal
- ocbShow = Application.CommandBars("Office Clipboard").Visible
- 'Office-Zwischenablage muss sichtbar sein
- If Not Application.CommandBars("Office Clipboard").Visible = True Then
- Application.CommandBars("Office Clipboard").Visible = True
- End If
- Application.ActiveWindow.Activate
- Application.ScreenUpdating = False
- Application.ScreenUpdating = True
- Sleep (1000)
- ' Handle for XLMAIN
- hMain = Application.hwnd
- 'finden OfficeClipboard Fenster
- '2 Methoden, da wir nicht sicher sind, ob es sichtbar ist
- 'Sobald es sichtbar gemacht wird, wird WindowClass erstellt
- 'Und bleibt für die Dauer der Instanz geladen
- Do
- hExcel2 = FindWindowEx(hMain, hExcel2, "EXCEL2", vbNullString)
- hParent = hExcel2: hWindow = 0
- hWindow = FindWindowEx(hParent, 0, "MsoCommandBar", sTask)
- If hWindow Then
- hParent = hWindow: hWindow = 0
- hWindow = FindWindowEx(hParent, 0, "MsoWorkPane", vbNullString)
- If hWindow Then
- hParent = hWindow: hWindow = 0
- hClip = FindWindowEx(hParent, 0, "bosa_sdm_XL9", vbNullString)
- If hClip > 0 Then
- Exit Do
- End If
- End If
- End If
- Loop While hExcel2 > 0
- If hClip = 0 Then
- hParent = hMain: hWindow = 0
- hWindow = FindWindowEx(hParent, 0, "MsoWorkPane", vbNullString)
- If hWindow Then
- hParent = hWindow: hWindow = 0
- hClip = FindWindowEx(hParent, 0, "bosa_sdm_XL9", vbNullString)
- End If
- End If
- If hClip = 0 Then
- Call ClipWindowForce
- hParent = hMain: hWindow = 0
- hWindow = FindWindowEx(hParent, hWindow, "MsoWorkPane", vbNullString)
- If hWindow Then
- hParent = hWindow: hWindow = 0
- hClip = FindWindowEx(hParent, hWindow, "bosa_sdm_XL9", vbNullString)
- End If
- End If
- If hClip = 0 Then
- MsgBox "Kann das Fenster von Zwischwnablage nicht finden."
- Application.CommandBars("Office Clipboard").Visible = ocbShow
- Application.ScreenUpdating = True
- Exit Sub
- End If
- lParameter = MakeLong(120, 18)
- Call PostMessage(hClip, WM_LBUTTONDOWN, 0&, lParameter)
- Call PostMessage(hClip, WM_LBUTTONUP, 0&, lParameter)
- DoEvents
- 'Ursprung wiederherstellen
- Application.CommandBars("Office Clipboard").Visible = ocbShow
- Application.ScreenUpdating = True
- MsgBox "Office-Zwischenablage entleert!"
- End Sub
- '?????? bis jetzt brauchte ich das nicht
- Sub ClipWindowForce()
- Dim octl
- With Application.CommandBars("Office Clipboard")
- If Not .Visible Then
- Application.ScreenUpdating = False
- Set octl = Application.CommandBars(1).FindControl(ID:=809, recursive:=True)
- If Not octl Is Nothing Then octl.Execute
- '.Visible = False
- Application.ScreenUpdating = True
- End If
- End With
- End Sub
- Sub mach_endlich_mit_der_schei_schluss()
- Call ClearOfficeClipboard
- 'Call apiOpenClipboard(0) 'Windows-Zwischenablage
- 'apiEmptyClipboard 'Windows-Zwischenablage
- 'apiCloseClipboard 'Windows-Zwischenablage
- Application.CutCopyMode = False
- End Sub
Edit by hal2000:
- Expander und Code-Tags eingefügt.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „hal2000“ ()