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:
1 2 3 |
Sub NettoyerPressePapiersExcel() 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
1 2 3 4 5 6 7 8 9 10 11 |
Option Explicit Public Declare Function OuvrirPressePapiers 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
1 2 3 4 5 6 7 8 9 10 11 |
Option Explicit Public Declare PtrSafe Function OuvrirPressePapiers 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()
1 2 3 |
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
- Comment utiliser la fonction Excel RECHERCHEV directement en VBA
- Suivre l'activité des utilisateurs d'un fichier Excel (log) via macros VBA
- Débloquer VBA dans les Classeurs Excel en provenance d'internet
10 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.
Bonjour, Je vous remercie pour ce code. Mais il ne fonctionne pas chez moi. Pourriez-vous m'éclairer ?
Lorsque j'appelle NettoyerPressePapiers j'ai le message d'erreur suivant : Erreur de compilation: Sub ou Function non définie (avec le script pour 32 ou 64-bit de Office).
Je vous remercie.
David.
Bonjour,
Je me permets de rebondir sur un sujet très proche de celui évoqué sur cette page.
Je suis à la recherche d'un moyen de définir en vba le contenu du presse papier (pointant sur des fichiers) de sorte que dans un mail outlook ou dans l'explorateur windows, l'utilisateur du programme excel puisse coller les fichiers en question… La problématique est différente du sujet en cours, mais comme il en est proche, peut-être auriez vous une solution. par avance merci bcp!!
Bonnes fêtes à vous 😉
Bonjour CL,
oui, j'ai une solution 😉
Je vais en faire un article quand j'aurai un peu de temps mais vous pouvez déjà utiliser ce fichier
La procédure se trouve dans le Module "code_Procedure" et tout le code est dans le module "code_DeclarationsEtFunctions". Pas besoin d'utiliser des Références particulières.
N'oubliez pas de débloquer le VBA pour le fichier si nécessaire (Excel: macros bloquées dans les fichiers en provenance d’internet)
J'espère que cela va vous aider.
Bonnes fêtes, Martin
Un très grand merci pour cette réponse qui correspond tout à fait à mon attente!!!
Bravo!
Bonjour Martin, bonjour à tous,
Je rebondie à nouveau… Je travaille sur Excel (32 bit). Je cherche un moyen de faciliter l'intégration d une ou plusieurs pièces jointes d un mail dans une application Excel effectuant entre autres de l'archivage de données (GMAO). Actuellement, les utilisateurs doivent sauvegarder le ou les pièces jointes depuis Outlook pour les récupérer avec l appli Excel en utilisant une boîte de dialogue de type 'ouverture de fichiers'… Ça fonctionne bien sûr, mais c est pénible. Serait il intéressant de proposer aux utilisateurs en pareil cas de copier la ou les pièces jointes dans le presse papier Windows pour qu ensuite, je récupère via l appli Excel les infos contenues dans le presse papier pour procéder à la copie en archive ?
Peut être existe t il des solutions encore plus directes du type glisser/déposer ?
Merci par avance encore une fois pour votre aide.
Bien cordialement
CL
Bonjour,
Quand vous collez ce code, pour qu'il fonctionne, il vous faut modifier le nom de la fonction "OuvrirPressPapiers" sans e par "OuvrirPressePapiers" avec un e 🙂
Cordialement,
Bernard
Bonjour Bernard,
merci beaucoup pour cette remarque pertinente!
Je viens de corriger cette faute de frappe dans les codes.
Cordialement, Martin