Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2019 gestion du presse papier

ESCOUGER2022

XLDnaute Nouveau
Bonjour,
De retour sur ce forum si instructif après quelques années d'interruption!
Je suis en but à un souci concernant l'effacement du presse-papier excel avec excel 2019.
J'ai vu et essayé de nombreuses formules proposées dans ce forum pour effacer le presse-papier, mais malheureusement l'effacement ne s'effectue pas.
J'ai un tableau dans lequel je fais de nombreux copier/ coller ou couper/ coller via des macros VBA. (textes, shapes, pictures...)
Cela fonctionne mais j'ai constaté une dégradation nette du temps de réponse lorsque je travaille longtemps sur ce tableau.
Il arrive même parfois que excel affiche un message m'informant qu'il avait des difficultés avec le presse-papier. (désolé je n'ai pas noté le texte en détail de ce message).
En affichant le presse-papier je constate qu'il ne se vide jamais, et je pense qu'il sature.
Ce que je voudrais serait de vider ce presse-papier (après chacun des "paste" par exemple) ou à des endroits appropriés de mon code.
Mais peut-être n'ai-je pas compris comment fonctionne ce clipboard, ou que je confonde avec le clipboard de windows?
Pour afficher le clipboard je pars du menu accueil, puis clique sur la petite croix "presse-papiers"
Voici ce que j'ai essayé qui n'efface jamais ce presse-papier:

Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Declare Function EmptyClipboard Lib "user32" () As Long
Declare Function CloseClipboard Lib "user32" () As Long
Public Function ClearPressePapier()
With CreateObject("htmlfile").parentWindow.clipboardData.clearData("Text"): End With
End Function
--------------------------------------------------------------------------------------------------------------

Sub EffacerPressePapier()
' effacer le presse papier de excel
Application.CutCopyMode = False
Application.CutCopyMode = True
End Sub
-----------------------------------------------

Sub EffacerPressePapier1() 'appelé par call EffacerPressePapier1
OpenClipboard 0
EmptyClipboard
CloseClipboard
End Sub

------------------------------------------------
Sub viderPressePapier()
'nécéssite d'activer la référence Microsoft Form 2.0 Object Library? OUI Il EST ACTIF
Dim Cible As DataObject
Set Cible = New DataObject
Cible.SetText ""
Cible.PutInClipboard
Set Cible = Nothing
End Sub
----------------------------------------------------------------------------------------------------------------------------------------
Merci d'avance de vos conseils éclairés
 

Dudu2

XLDnaute Barbatruc
Bonsoir,
Un fichier texte que j'utilise et qui donne les fonctions utiles pour du texte en Clipboard.
Pour effacer le Clipboard, il faut passer par l'API, les CutCopyMode et autre SetText c'est du bidon.
Alors tant qu'à faire autant passer par l'API pour tout. Tu mets ça au chaud dans un module dédié et c'est réglé.
 

Pièces jointes

  • Clipboard full API.txt
    4.1 KB · Affichages: 8
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonsoir.
J'avais aussi un peu partout remplacé par ces API indigestes l'utilisation simple du MSForms.DataObject chaque fois que je tombai sur son dysfonctionnement, jusqu'à tout récemment où, m'apercevant que j'affichai toujours par UserForm un message d'information quand j'envoyai un texte dans le presse-papier, j'ai fini par trouver bien plus simple d'y faire TextBox.Copy !
 

jurassic pork

XLDnaute Impliqué
Hello et bonne année à tous,
Si cela t'intéresse il y a ici des dll (une pour du 32 bits et une pour du 64 bits) qui contiennent de quoi gérer le presse-papier en VBA.
Facile d'utilisation:
Mettre la dll dans un répertoire et déclarer les classes qu'elles contiennent comme ceci dans un module :
VB:
#If Win64 Then
    Declare PtrSafe Function CreatePressePapierClass Lib "D:\Tmp\ClassesCSharpJP\ClassesCSharpJPx64.dll" () As Object
    Declare PtrSafe Function CreatePowerShellClass Lib "D:\Tmp\ClassesCSharpJP\ClassesCSharpJPx64.dll" () As Object
    Declare PtrSafe Function CreateUtilsClass Lib "D:\Tmp\ClassesCSharpJP\ClassesCSharpJPx64.dll" () As Object
#Else
    Declare PtrSafe Function CreatePressePapierClass Lib "D:\Tmp\ClassesCSharpJP\ClassesCSharpJPx86.dll" () As Object
    Declare PtrSafe Function CreatePowerShellClass Lib "D:\Tmp\ClassesCSharpJP\ClassesCSharpJPx86.dll" () As Object
    Declare PtrSafe Function CreateUtilsClass Lib "D:\Tmp\ClassesCSharpJP\ClassesCSharpJPx86.dll" () As Object
#End If
Pour l'utilisation par exemple pour effacer complétement le presse-papier :
Code:
Sub EffacerPressePapier()
Dim pp As Object
Set pp = CreatePressePapierClass()
pp.Clear
End Sub
Pour copier une plage et l'enregistrer en format image png dans un fichier en passant par le presse-papier :
Code:
Sub TestPressePapier()
Dim pp As Object, pwsh As Object
Set pp = CreatePressePapierClass()
Set pwsh = CreatePowerShellClass()
Worksheets("Data").Range("A1:D11").Copy
Debug.Print pp.ContainsImage
Debug.Print pp.ContainsText
pp.SaveImage "d:\temp\range.png", 0
pp.Clear
'visualisation de l'image
pwsh.ExecuteCmd "start mspaint d:\temp\range.png"
End Sub
Voici un aperçu des fonctions disponibles dans la classe :


Attention ceci fait partie de la doc de mon Addin en préparation et qui ne correspond pas entièrement à ce qu'il y a dans la dll utilisée ici.
Par exemple les fonctions convUtf8ToAnsi et convAnsiToUtf8 n'existent pas dans la dll.

Ami calmant, J.P
 

job75

XLDnaute Barbatruc
Bonjour le forum,

Si la feuille active est une feuille de calcul exécutez :
VB:
Sub ViderPP()
With [A1].MergeArea
    .Copy .Cells
    .Merge
End With
End Sub
Mes meilleurs vœux pour 2025.

A+
 

ESCOUGER2022

XLDnaute Nouveau
Merci.
J'ai appliqué la méthode de dudu2 "Clipboard full API.txt".
Cela fonctionne, mais il apparaît que vider le clipboard (ClearClipboard) conserve toujours les 24 derniers "Copy" effectués. Je suppose que cela est voulu pour que les fonctions d'annulation des dernières opérations effectuées restent possibles. Est-ce exact ?
En tous cas cela a résolu mon souci.
 

Dudu2

XLDnaute Barbatruc
Bonjour,
il apparaît que vider le clipboard (ClearClipboard) conserve toujours les 24 derniers "Copy" effectués.
T'as vu ça où ?

 

ESCOUGER2022

XLDnaute Nouveau
Bonjour job75,
J'ai essayé votre méthode qui me donne les mêmes résultats que celle de dudu2, mais peut-être n'ai-je pas compris son fonctionnement?

Que représente [A1].MergeArea dans le contexte?

Je suis positionné sur une feuille d'un classeur qui en comporte plusieurs et cette feuille est déprotégée. Je vois que le PP contient n éléments sachant que n peut varier de 0 à 24.
Si mon PP contient par exemple 10 éléments (n=10) et si j'active ensuite la "Sub ViderPP", l'affichage du PP reste identique.
Si mon PP contient par exemple 24 éléments (n=24) et si j'active ensuite la "Sub ViderPP", l'affichage du PP affiche ces mêmes 24 éléments. Si j'effectue ensuite un nouveau "Copy" l'affichage du PP contient toujours 24 éléments qui sont en fait le dernier copy et les 23 précédents.

Je parle bien sûr du PP d'excel.

Merci
 

jurassic pork

XLDnaute Impliqué
Hello,
voici du code qui fonctionne chez moi avec un excel 2021 64 bits pour effacer le presse-papier office :
VB:
#If VBA7 Then
     Declare PtrSafe 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
    #Else
     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
    #End If
Sub small_20202024_ClearOfficeClipBoard_()  ' https://www.excelfox.com/forum/showthread.php/2824-Tests-Copying-pasting-Cliipboard-issues?p=24879&viewfull=1#post24879
Dim avAcc, bClipboard As Boolean, j As Long
Dim MyPain As String
    If CLng(Val(Application.Version)) <= 11 Then  '                   Case 11: "Excel 2003" Windows    "Excel 2004" mac
     Let MyPain = "Task Pane"
    Else
     Let MyPain = "Office Clipboard"
    End If
Set avAcc = Application.CommandBars(MyPain)   '
Let bClipboard = avAcc.Visible      '   bClipboard will be false if the viewer pain is not open
    If Not bClipboard Then
     avAcc.Visible = True           '   This opens the Viewer pain. The coding won't work if it is not open
     DoEvents: DoEvents
    Else
    End If
'   coding change for Office versions at  --  Office 2016  ==
    If CLng(Val(Application.Version)) < 16 Then
' --For Office versions 2003 2007 2010 2013 ----------------------------------------
        For j = 1 To 4         '      J =    1  2  3  4
         AccessibleChildren avAcc, Choose(j, 0, 3, 0, 3), 1, avAcc, 1
        Next
     avAcc.accDoDefaultAction 2&  '           This seems to do the clearing   It will NOT error if viewer pain is already  Cleared                  1& for paste
' ----------------------------------------------------------------------------------
    Else
' ==For Office versions 2016 and higher ==============================================
        For j = 1 To 7      '           J =  1  2  3  4  5  6  7
         AccessibleChildren avAcc, Choose(j, 0, 3, 0, 3, 0, 3, 1), 1, avAcc, 1
        Next
     avAcc.accDoDefaultAction 0& '            This seems to do the clearing   It WILL error if viewer pain is already  Cleared
    End If ' =======================================================================
 Let Application.CommandBars(MyPain).Visible = bClipboard      '   Puts the viewer pain back as it was, open or closed
End Sub

Cela me paraît bien compliqué et je suis sûr que patricktoulon et dudu2 vont se faire un malin plaisir à trouver plus simple.
Le presse-papiers Office apparaît en cliquant sur la petite flèche vers le bas à côté de presse-papiers à gauche du ruban Accueil.

Ami calmant, J.P
 

patricktoulon

XLDnaute Barbatruc
a ben par les api "accessiblechildren" & il y en a une autre aussi ça devrait passer si je me souviens bien avec disponiblewindow ou un truc du genre que je me servait pour activer le developpement d'un control gallery dans le ruban
belle trouvaille
mais je n'est pas identifié pourquoi des fois il y avAcc qui est vide
surtout quand il y a que des trucs copiés dans excel dans le clip
 

ESCOUGER2022

XLDnaute Nouveau
Oui jurassic pork, c'est bien ainsi que je vois les 24 "petits nains dont parle dudu2 qui restent dans leur village". En bas de l'écran à droite s'affiche de manière fugace un commentaire.
Exemples: "24 sur 24 Presse-papiers éléments ajoutés" ou "6 sur 24 Presse-papiers éléments ajoutés"
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…