Si vous avez besoin d'utiliser le Presse-Papiers dans vos macros VBA, le code qui suit vous sera plus qu'utile. Il vous permettra de vider le presse-papiers et éviter ainsi des mauvaises surprises.
Sommaire
En fait, probablement sans vous en rendre compte, vous utilisez habituellement deux presse-papiers: celui de Windows mais aussi celui de Excel. En effet, Excel dispose de son propre Presse-Papiers.
Le Presse-Papiers est très pratique pour transférer des données entre différents classeurs Excel mais également entre différentes applications. Il peut aussi servir pour déplacer/copier des graphiques, captures d'écran etc.
Pour éviter des mauvaises surprises, il est utile de nettoyer le presse-papiers de temps en temps car il se peut qu'après un certain temps, il n'est plus clair ce qui peut s'y trouver.
Voici donc deux fonctions VBA qui feront l'affaire…
Vider le Presse-Papiers Excel avec VBA
La particularité du presse-papiers Excel est qu'il n'écrase pas le contenu du presse-papiers Windows. Cela veut dire que vous pouvez être en train de faire des copier/coller du contenu d'une page internet dans Firefox, et cela n'impactera pas le copier/coller d'un tableau Excel.
Pour nettoyer le presse-papier Excel, une seule ligne de code VBA suffit:
Sub NettoyerPressPapiersExcel() Application.CutCopyMode = False End Sub
Ce code-ci vous seras utile surtout si votre macro VBA ne "quitte" pas Excel – notamment si vous copiez les données entre différents Classeurs Excel.
Vider le Presse-Papiers de Windows avec VBA
Le code suivant est plus radical. Il va vider tous les presse-papiers – celui de Windows et celui de Excel. Peu importe donc dans quelle application vous avez fait le fameux Ctrl + C
. Vous êtes sûrs qu'après avoir exécuté cette fonction, vous ne rencontrerez aucune "pollution" qui pourrait perturber le fonctionnement de votre macro VBA…
Vous devez copier tout le code VBA qui suit dans un Module
(au début d'un Module
pour être plus précis). La fonction VBA à utiliser est la fonction NettoyerPressePapiers()
Code à utiliser dans la version 32-bit de Office
Option Explicit Public Declare Function OuvrirPressPapiers Lib "user32" Alias "OpenClipboard" (ByVal hwnd As Long) As Long Public Declare Function ViderPressePapiers Lib "user32" Alias "EmptyClipboard" () As Long Public Declare Function FermerPressePapiers Lib "user32" Alias "CloseClipboard" () As Long Public Function NettoyerPressePapiers() OuvrirPressePapiers (0&) ViderPressePapiers FermerPressePapiers End Function
Code à utiliser dans la version 64-bit de Office
Option Explicit Public Declare PtrSafe Function OuvrirPressPapiers Lib "user32" Alias "OpenClipboard" (ByVal hwnd As Long) As LongPtr Public Declare PtrSafe Function ViderPressePapiers Lib "user32" Alias "EmptyClipboard" () As LongPtr Public Declare PtrSafe Function FermerPressePapiers Lib "user32" Alias "CloseClipboard" () As LongPtr Public Function NettoyerPressePapiers() OuvrirPressePapiers (0&) ViderPressePapiers FermerPressePapiers End Function
Exemple d'utilisation dans une procédure (Sub)
Et voici un petit code pour montrer comment exécuter cette fonction – la procédure TestNettoyerPressePapiers()
Sub TestNettoyerPressePapiers() Call NettoyerPressePapiers End Sub
Tester le comportement
Afin de mieux comprendre le fonctionnement des deux presse-papiers et l'impact des deux fonctions VBA que je vous propose plus haut, vous pouvez faire une série de tests. Vous verrez, c'est assez intéressant!
Ouvrez un Classeur Excel et ouvrez le bloc-notes de Windows. Remplissez quelques cellules dans le Classeur et écrivez quelque chose dans le bloc-notes. Maintenant, vous pouvez commencer à tester les différentes possibilités:
- copier le texte dans le bloc-notes, lancer la fonction
NettoyerPressePapiers()
et essayer de coller le texte copié quelque part - la même chose mais en utilisant la fonction
NettoyerPressePapiersExcel()
- copiez quelques cellules du Classeur, lancez la fonction
NettoyerPressePapiersExcel()
et essayez de coller le contenu du presse-papiers - etc.
Conclusion
Pour faire du travail correct, c'est toujours mieux de commencer avec des outils "propres" et de les "nettoyer" de temps en temps. Ce n'est pas seulement le cas des pioches, clés ou autres outils de bricolage et jardinage. c'est aussi le cas dans l'informatique.
Si vous devez faire des copier/coller dans vos macros, je vous conseille vivement de nettoyer les presse-papiers avant de commencer (grâce au code VBA sur cette page) mais aussi après. Imaginez que des données sensibles restent dans le presse-papiers – quelqu'un pourrait facilement les récupérer…
Si on suit le même principe, vous pouvez également Vider la mémoire cache des tableaux croisés dynamiques (TCD)…
Et n'oubliez pas de jeter un coup d’œil à d'autres Codes sources VBA que je vous propose. Ils risquent de vous faciliter la vie!
Pour aller plus loin en VBA
Pour finir, voici quelques autres articles sur VBA qui pourraient vous intéresser…
- Liste de toutes les fonctions VBA
- RECHERCHEV en VBA
- Suivre l'activité des utilisateurs d'un fichier Excel (log) via macros VBA
3 commentaires sur “VBA: vider le presse-papiers (clipboard)”
Cette procédure ne fonctionne plus avec les machines à 64 bits et Office 365 ! D2jà il faut rajouter PtrSafe dans chaque déclaration, ensuite ça fait une erreur de compilation indiquant que "Des contantes, chaînes de longueur fixe, Tableaux, types définis par l'utilisateur et instructions Declare ne sont pas autorisés comme Public de modules d'objet.." ….
Ca fait plusieurs fois que j'ai le même problème en récupérant des procédures d'anciennes versions de VBA. Si quelqu'un a réussi à faire tourner cette macro sur du 64 byte, et s'il veut bien la partager, je suis preneur !! Merci à lui.
Bonjour Stef,
merci pour votre remarque.
Je viens de modifier la page en y ajoutant le code compatible avec la version 64-bit de Office.
Pour votre info – cela va peut-être vous servir avec d'autres fonctions – il ne faut pas seulement ajouter le
PtrSafe
dans la déclaration de la fonction, mais il faut également adapter leType
des données en changeantLong
enLongPtr
Voilà… Cordialement, Martin
Bonjour,
J'ai effectué les modifs comme indiqué, effectivement à la compilation ça fonctionne, le programme se déroule "normalement", mais le presse papier ne se vide pas, désolé. Je pensais résoudre mon problème, mais je vais chercher une autre solution. Merci pour ta démarche.