• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

Klembord overvol - melding bij afsluiten

Status
Niet open voor verdere reacties.
@E v R

Waar je het vandaan haalt is me een raadsel, maar het werkt feillings. :thumb:
Welke bibliotheek is 'oleacc' ?

Gewoontegetrouw heb ik er nog wel wat aan geknutseld.

Ik kom nu uit op:

Code:
Private Declare Function AccessibleChildren Lib "oleacc" (ByVal paccContainer As Office.IAccessible, ByVal iChildStart As Long, ByVal cChildren As Long, ByRef rgvarChildren As Any, ByRef pcObtained As Long) As Long

Sub ClearOfficeClipBoard()
  Dim Acc As Office.IAccessible
   
  With CommandBars("Office Clipboard")
    .Visible = True
    DoEvents

    Set Acc = zetAcc(zetAcc(zetAcc(.accChild(1), 3), 0), 3)
    Acc.accDoDefaultAction 2&
   
    .Visible = False
  End With
End Sub

Private Function zetAcc(myAcc As Office.IAccessible, myChildIndex As Long) As Office.IAccessible
  y = myAcc.accChildCount
  ReDim List(y)
    
  If AccessibleChildren(myAcc, 0&, ByVal y, List(0), y) = 0& Then Set zetAcc = List(myChildIndex)
End Function
 
Laatst bewerkt:
Thanks!

Oorspronkelijke code zocht steeds naar een IAccesible-object en wanneer gevonden, verder opzoek naar de 'kinderen' van dit object op basis van een naam welke dus deels taalafhankelijk was.
middels die AccessibleChildren wordt de List steeds gevuld met nieuwe kinderen

Een lus leek mij overbodig wanneer de objecten steeds op dezelfde plek staan. (geen idee of dit in andere / oudere versies ook zo is)
(heb dus even gezocht welke locaties nodig waren) ;)

Verander bijvoorbeeld de 2& in 1& en je hebt Past All

Zonder DoEvents werkt het bij mij ook, heb het maar laten staan, had het van de week wel nodig om de code te laten werken. Ik denk dat het te maken had met of het Clipboard reeds zichtbaar was of niet.

Knutselwerk altijd :thumb:

in bijlage de bibliotheek
 

Bijlagen

  • Capture.PNG
    Capture.PNG
    7,2 KB · Weergaven: 76
Laatst bewerkt:
Alles leek "Koek en Ei" maar ik ervaar problemen bij het vaker achter elkaar kopiëren/plakken. Ik krijg dan een foutmelding en pas na meerdere malen op Esc kan ik weer verder met kopiëren/plakken.Fst - 20160610_057.jpg
Na een reboot van het systeem is het probleem verdwenen maar komt terug na het legen van het Office klembord.
Komt dit probleem ook bij jullie voor ?
 
Wissen van het office klembord.

Onafhankelijk van:
  1. het office klembord venster geopend is of niet;
  2. het office klembord venster gedockt is aan de kant of zweeft boven het werkblad;
  3. de breedte van het office klembord venster;
  4. beeldresolutie van het scherm
Code:
[SIZE=1]Option Explicit

Private Declare Function GetDC Lib "user32.dll" (ByVal hwnd As Long) As Long
Private Declare Function GetDeviceCaps Lib "gdi32.dll" (ByVal hDC As Long, ByVal nIndex As Long) As Long
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Private Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) 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
Private Declare Function ReleaseDC Lib "user32.dll" (ByVal hwnd As Long, ByVal hDC As Long) As Long

Private Const LOGPIXELSX As Long = 88
Private Const LOGPIXELSY As Long = 90
Private Const WM_LBUTTONDOWN As Long = &H201&
Private Const WM_LBUTTONUP As Long = &H202&

Private colWindow As New Collection

Private Function EnumChildProc(ByVal hwnd As Long, ByVal lParam As Long) As Long

    Dim lpClassName As String
    Dim lResult As Long

    lpClassName = Space(256)
    lResult = GetClassName(hwnd, lpClassName, 256)
    lpClassName = Left(lpClassName, lResult)

    colWindow.Add hwnd, lpClassName

    EnumChildProc = 1

End Function


Public Sub ClearOfficeClipboardResolutionAndLanguageIndependent()    'alphamax_2016
'clears the office clipboard

    Dim bClipboard As Boolean
    Dim bScreenUpdating As Boolean
    Dim hDC As Long
    Dim hwnd As Long
    Dim lParameter As Long
    Dim lPosition As Long
    Dim lWidth As Long

    With Application
        bScreenUpdating = .ScreenUpdating
        If Not bScreenUpdating Then
            .ScreenUpdating = True
        End If
        With Application.CommandBars("Office Clipboard")
            bClipboard = .Visible
            lPosition = .Position 'backup position
            lWidth = .Width    'backup width
            If Not bClipboard Then
                .Visible = True
            End If
            .Position = msoBarLeft 'dock left so we can use handle of "bosa_sdm_XL9"
            .Width = 0    'make clipboard width narrow so buttons are on top of each other and textsize doesn't determine button size
        End With
    End With

    DoEvents

    hwnd = FindWindowEx(Application.hwnd, 0, "EXCEL2", "")
    EnumChildWindows hwnd, AddressOf EnumChildProc, ByVal 0&    'build windowdata tree
    hwnd = colWindow.Item("bosa_sdm_XL9")

    hDC = GetDC(0)
    lParameter = 42 * GetDeviceCaps(hDC, LOGPIXELSY) / 96 * 65536 + 16 * GetDeviceCaps(hDC, LOGPIXELSX) / 96
    ReleaseDC 0, hDC

    PostMessage hwnd, WM_LBUTTONDOWN, 0&, lParameter    'push button
    PostMessage hwnd, WM_LBUTTONUP, 0&, lParameter    'release button

    Do Until colWindow.Count = 0
        colWindow.Remove 1
    Loop

    With Application
        With .CommandBars("Office Clipboard")
            .Position = lPosition
            .Width = lWidth
            If Not bClipboard Then
                .Visible = False    'hide office clipboard
            End If
        End With
        If Not bScreenUpdating Then
            .ScreenUpdating = False
        End If
    End With

End Sub
[/SIZE]
 
Laatst bewerkt:
Tjakka !
Bedankt alphamax.
Met deze code doet het geschetste probleem zich niet voor.
Fijn weekend
 
@alpha,

Zo gauw ik de macro start krijg ik de volgende foutmelding op

EnumChildWindows hwnd, AddressOf EnumChildProc, ByVal 0& 'build windowdata tree

Invalid use of AddressOf operator

(Win XP, Office Prof 2010)
 
Laatst bewerkt:
Heel erg vreemd.
Na een tijdje kwam mijn probleem #83 (geblokkeerde klembordmanager) weer terug. Na een reboot zonder daarna de macro te runnen was ko/pl weer normaal.
 
@snb
Ik zou het zo niet weten zodra je met api's werkt moet je vaak met "AddressOf" werken om een pointer naar een functie door te geven

@allen
Blijkbaar bestaat het probleem van het wissen van het office clipboard al lang en is er door microsoft nooit een fatsoenlijke oplossing bedacht.
Workaround uit de oude doos (wat soms werkt maar net zo vaak nu niet meer), zie http://www.benf.org/excel/officeclip/
 
Jammer, maar het is niet anders. Allemaal bedankt voor de intensieve arbeid.
Van de eerder (#66) gemelde oplossingsvarianten valt wat mij betreft de laatste dan af.
Beter zonder frustraties kunnen kopiëren/plakken met mogelijk een wegklikbare melding bij het afsluiten.
Ik heb nu variant 3 ingezet als oplossing.

Oplossingsvarianten (#66):
1. Accepteer de melding - extra muisklik - geen invloed op de data in het bestand, er gaat niets mis.
2. Handmatig het klembord legen (lint) vóór het afsluiten
3. Wijzig kopieër/plak codes in codes die geen opslag in het klembord als gevolg hebben. zie #25
4. Voeg codes toe die het klembord legen na de laatste kopieër/plak routine (aan het einde van je laatste module) zie #38 en #57. Of er voor een van beide een voorkeur bestaat kan ik persoonlijk niet bepalen.
 
@Anton

Ik heb nog niet van andere gebruikers begrepen dat zij ooit de melding hebben gehad die voor jou aanleiding was voor het plaatsen van deze draad.
Ik zelf ben hem/haar nooit tegengekomen.
Het kan daarom zijn dat de melding meer met jouw configuratie dan met Office in het algemeen te maken heeft.

Ik heb de indruk dat de meeste participanten zich met de VBA vraag hebben beziggehouden: hou kun je met VBA het Office klembord legen.
De vraag: hoe voorkom je de door jou gemelde melding is, vermoed ik, door de participanten niet in aanmerking genomen.

Daarom vind ik je 'konklusie' verwarrend:

- Het vermijden van het klembord is geen oplossing voor het legen van het Office klembord.

Voor iedere gebruiker van VBA geldt sowieso: de bewerking copy/paste is altijd langzamer dan het rechtstreeks wijzigen van de eigenschap van een 'object'.
Het is daarmee een algemene aanbeveling voor VBA-programmeurs, onafhankelijk van het gedrag van het Officed klembord.

- Het accepteren en wegklikken van een melding is ook geen 'oplossing': het voorkomt geen - eventuele - melding en maakt het klembord ook niet leeg.

- De knop Clear All in het klembord-scherm aanklikken is alleen een 'oplossing' ter voorkoming van een melding, zo die al op zou treden; een VBA oplossing voor het legen van het klembord is het zeker niet.


Er zijn 2 VBA oplossingen:

- van Alphamax #84

- van E V R: #79

Vooralsnog ga ik ervan uit dat, als geen anderen 'jouw' melding krijgen, dit echte VBA-oplossingen zijn.
Mijn voorkeur gaat voorlopig uit naar die van E V R.
 
Laatst bewerkt:
@snb
Bedankt voor je uitleg.
De melding komt bij mij na het kopiëren/plakken (speciaal-waarden) van een groot gebied (zo'n 400 regels/20 kolommen). Met de interpretatie van de melding bij het afsluiting ga ik er van uit de het klembord te vol is geraakt en derhalve niet meer als totaal te gebruiken voor latere ko/pl bewerkingen.
De aangedragen oplossingen leken in eerste instantie goed te werken, ook na veelvuldig ko/pl maar plots ging het weer mis en moest ik voor een volgende ko/pl-bewerking een foutmelding (klembord bezet ...) en moest ik meerdere malen Esc drukken om het weer vrij te krijgen. Een herstart van Excel leverde geen verbetering op, een reboot van het systeem wel.
 
@alpha,

Kun je aan de hand van jouw lopende code mij de parameter-waarden doorgeven van deze twee opdrachten ?

PostMessage hwnd, WM_LBUTTONDOWN, 0&, lParameter 'push button
PostMessage hwnd, WM_LBUTTONUP, 0&, lParameter 'release button

dan kan ik het nog eens proberen met de tasks van Word.
 
Code:
PostMessage hwnd, WM_LBUTTONDOWN, 0&, lParameter    '66518         513           0             458857
PostMessage hwnd, WM_LBUTTONUP, 0&, lParameter    '66518         514           0             458857
hwnd = 66518 (waarschijnlijk dynamisch toegewezen handle)
lParameter = 458857 = 7 pixels verticaal * 65536 + 105 pixels horizontaal (@96dpi)

let op: je kan het office window ook smaller maken waardoor de knoppen boven elkaar komen te staan.
 
@Anton44, Met interesse volg ik dit draadje dat qua programmeerkunsten véééééér boven mijn kennis gaat (mijn complimenten dus naar de makers). Maar ik blijf tóch met 1 vraag zitten... In postnr.25 kom je zelf al met een procedure om zonder het klembord je formules om te zetten in vaste waarden. Dat is ook verreweg de beste methode. Ik snap dus niet waarom je zo blijft vasthouden aan de methode via het Clipboard.
Of pas je dat allang toe en is dit draadje alleen nog uit interesse voor het oplossen van dit issue van het "legen"?
 
@ Ginger. Mij gaat de VBA codes van EvR, alphamax en snb ook ver boven mijn pet :rolleyes:
Ik pas inderdaad nu de kopiërmethode zonder het klembord toe en werkt uitstekend voor mij. Gaandeweg is er een dialoog ontstaan tussen de profs die me als uitkomst wel degelijk bleef interesseren zonder deze te begrijpen. Ik heb daar testen me gedaan als feedback. Mocht daar er een goed werkende code uitrollen, waarom zou ik die dan niet gebruiken ? Er kunnen zich in de toekomst situaties voordoen waarbij ik door gebrek aan kennis van VBA het klembord voor grote bewerkingen niet weet te omzeilen.
Vandaar.
 
Nieuwe gebruiksvriendelijkere code in bericht#84, de nieuwe code zou nu alle verschijningsvormen van het office clipboard moeten kunnen wissen (afmetingen, positie, taal)
Misschien is deze "prof" in dit draadje uit beetje doorgeschoten.
Maar als microsoft niet meer met oplossing zal komen (ontwikkeling vba ligt stil).
En veel van de gevonden code op het internet niet alle situaties aankan, wil ik me daar wel eens in vastbijten als ik toch bezig ben.
 
Ook de nieuwe gebruiksvriendelijkere code in bericht#84 werkte bij mij in 1e instantie niet. Erg vreemd dat ik tot dusver alleen de foutmelding "Bezet klembord...." krijg.
Al nadenkend kwam mijn verdacht op een andere klembordmanager te vallen. Ik gebruik Ditto v03.21.50.00 (laatste) als meervoudige klembordmanager. Toen ik deze uitschakelde blijkt tot dusver de Code van alphamax wel goed te werken. Ergo de aangedragen oplossing is PRIMA !

Nagekomen info:
Van Ditto was de 64-bits versie geïnstalleerd (Windows7 = 64-bits). Na dé-installatie daarvan getest met 32-bits install versie en de portable versie. Met beide versies heeft het probleem zich nog niet gemanifesteerd.
 
Laatst bewerkt:
Betekent dit nu dat wij met zijn allen bezig zijn geweest een VBA-oplossing te bedenken voor een fout die door een extern programma wordt veroorzaakt ? :p:D:rolleyes:
En betekent dit dat zonder dat externe programma het office klembord zonder foutmeldingen funktioneert ?
 
Laatst bewerkt:
snb, dat betekent niet dat alles terug te voeren is naar Ditto. Door het runnen van de macro voor het leegmaken van het Office klembord onstond er bij mij een nieuw probleem nl het geblokkeerd zijn van het klembord bij een nieuwe ko/pl opdracht. Deze blokkade schrijf ik nu wel toe aan Ditto. De initiële melding bij het afsluiten van het Excel bestand heeft daar niets mee van doen voor zover ik dat kan beredeneren.
Ik had ook kunnen "zwijgen" en mijn bevindingen niet kenbaar hebben gemaakt, maar daar heeft niemand iets aan.
...
Daarnaast denk ik dat de gewaardeerde profs mijn vraag als een uitdaging hebben gezien en er mee bezig zijn (geweest), toch ? :thumb::)
 
Het was ironisch bedoeld hoor.....;)

Ik sluit niet uit dat Ditto ook voor de eerste melding verantwoordelijk is.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan