Si vous manipulez souvent des données avec copier/coller dans vos macros, vider le presse-papiers au bon moment évite pas mal d'ennuis: collages involontaires, contenu obsolète, données sensibles qui traînent… Ci-dessous, plusieurs méthodes simples selon le besoin: presse-papiers Excel uniquement, presse-papiers Windows, et deux alternatives rapides.
Sommaire
- Pourquoi vider le presse-papiers dans vos macros?
- Méthode 1 – Vider le presse-papiers d'Excel (simple et immédiat)
- Méthode 2 – Vider le presse-papiers Windows (API Win32, 32/64 bits)
- Méthode 3 – Écraser le presse-papiers avec du vide (DataObject)
- Méthode 4 – Petite astuce Excel (copier une cellule vide)
- Bonnes pratiques pour vous éviter de mauvaises surprises
- Tester le comportement (mini-scénarios)
- FAQ
- Conclusion
- Pour aller plus loin en VBA
Petit rappel utile;: il y a deux presse-papiers dans votre quotidien Excel – celui de Windows et celui intégré à Excel. Ils ne se comportent pas de la même façon, d'où l'intérêt de choisir la bonne approche.
Pourquoi vider le presse-papiers dans vos macros?
- Propreté du flux: enlever les "fourmis" (sélection en surbrillance) et repartir de zéro
- Prévisibilité: éviter qu'un vieux contenu vienne perturber un collage
- Confidentialité: ne pas laisser des valeurs sensibles accessibles après l'exécution
- UX: un fichier qui se "nettoie" tout seul est plus agréable à utiliser
Méthode 1 – Vider le presse-papiers d'Excel (simple et immédiat)
Cette commande ne touche qu'à Excel. Elle enlève le mode copie (les pointillés) et remet Excel au calme, mais ne vide pas le presse-papiers Windows.
1 2 3 |
Sub NettoyerPressePapiersExcel() Application.CutCopyMode = False End Sub |
À utiliser dès que votre macro reste dans Excel (copie entre feuilles/classeurs, collage de formules, etc.).
Méthode 2 – Vider le presse-papiers Windows (API Win32, 32/64 bits)
Ici on vide tout: presse-papiers Windows et Excel. C'est ce qu'il faut si vous voulez être sûr qu'il ne reste rien, quelle que soit l'application qui a fait Ctrl+C
.
Collez le bloc ci-dessous en haut d'un Module standard. J'ai ajouté un petit mécanisme de retry au cas où le presse-papiers est momentanément verrouillé par une autre appli.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
Option Explicit #If VBA7 Then Private Declare PtrSafe Function OpenClipboard Lib "user32" (ByVal hwnd As LongPtr) As Long Private Declare PtrSafe Function EmptyClipboard Lib "user32" () As Long Private Declare PtrSafe Function CloseClipboard Lib "user32" () As Long Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) #Else Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long Private Declare Function EmptyClipboard Lib "user32" () As Long Private Declare Function CloseClipboard Lib "user32" () As Long Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) #End If Public Function NettoyerPressePapiers(Optional ByVal Tentatives As Long = 5, _ Optional ByVal AttenteMs As Long = 30) As Boolean Dim i As Long For i = 1 To Tentatives If OpenClipboard(0&) <> 0 Then Call EmptyClipboard Call CloseClipboard NettoyerPressePapiers = True Exit Function Else DoEvents Sleep AttenteMs End If Next i End Function ' Exemple d'utilisation Sub TestNettoyerPressePapiers() If NettoyerPressePapiers() Then Debug.Print "Presse-papiers vidé." Else Debug.Print "Impossible de vider le presse-papiers (occupé ?)." End If End Sub |
Remarques: si vous voyez parfois une erreur "OpenClipboard failed"
, c'est souvent juste le temps que Windows libère la ressource. Le retry gère ce cas.
Méthode 3 – Écraser le presse-papiers avec du vide (DataObject)
Solution pratique: on remplace le contenu par une chaîne vide. Ça revient au même que "vider" pour la majorité des scénarios.
1 2 3 4 5 6 |
Sub ViderPressePapiers_DataObject() Dim o As Object Set o = CreateObject("MSForms.DataObject") o.SetText "" o.PutInClipboard End Sub |
Note: MSForms.DataObject
fait partie de "Microsoft Forms 2.0 Object Library". Sur la plupart des postes avec Office, c'est disponible. En environnement verrouillé, préférez la Méthode 2.
Méthode 4 – Petite astuce Excel (copier une cellule vide)
En dernier recours, vous pouvez copier une cellule vide pour écraser le contenu courant:
1 2 3 4 5 6 7 |
Sub EcraserAvecCelluleVide() Dim ws As Worksheet Set ws = ActiveSheet ws.Range("A1").ClearContents ws.Range("A1").Copy Application.CutCopyMode = False End Sub |
Ce n'est pas aussi propre ni universel que les méthodes ci-dessus, mais ça dépanne.
Bonnes pratiques pour vous éviter de mauvaises surprises
- Avant un enchaînement de collages (= plusieurs copier/coller successifs), nettoyez pour partir sur une base claire.
- Après traitement, nettoyez pour ne rien laisser traîner (surtout s'il s'agit des informations sensibles).
- Si votre macro reste 100% dans Excel: Méthode 1 suffit la plupart du temps.
- Si votre macro interagit avec d'autres applis: préférez la Méthode 2.
Tester le comportement (mini-scénarios)
Voici quelques opérations pour rapidement tester les différents codes dans les conditions réelles.
- Copiez du texte dans le Bloc-notes, lancez
NettoyerPressePapiers()
, essayez de coller. - Copiez quelques cellules, lancez
NettoyerPressePapiersExcel()
, regardez les "fourmis" disparaître. - Alternez copies depuis Excel et depuis le navigateur puis videz avec la Méthode 2.
FAQ
Conclusion
Pour des macros fiables, nettoyez le presse-papiers au moment opportun. Gardez Application.CutCopyMode = False
sous la main pour Excel, et la fonction API pour un grand coup de balai côté Windows.
Dans la même idée, vous pouvez aussi vider la mémoire cache des tableaux croisés dynamiques (TCD) et jeter un œil à d'autres codes sources VBA.
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 : comment vider le presse-papiers (Excel et Windows)”
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