Gestion du Presse papiers

Bonjour,

Je cherche à comprendre cette action.

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

Sub PrPapiers()
On Error GoTo Erreur
'Ouverture du presse-papier
    OpenClipboard 0
 'On vide le presse-papier
    EmptyClipboard
'Fermeture du presse-papier
    CloseClipboard
    Exit Sub
Erreur:
  MsgBox "Erreur n° " & Err.Number & vbCrLf & Err.Description, vbCritical + vbOKOnly, "Une erreur est survenue"
End Sub

Je m'explique.

Je fais des actions VBA qui copie/colle à plusieurs reprise.

Je me suis demandé ce que le presse papiers pouvait faire, emmagasiner.

J'ai donc utilisé les API ci-dessus en les appelants via le sub.

Quand je fais un copier depuis ma macro suite à l'action, j'ai une alerte qui me dit que la mémoire est pleine.

Quand je vérifie mon presse papiers de mon W10 j'ai ceci (test) :

2020 10 29 193300

Quand je fais un copier depuis mon W10 j'ai ceci qui s'affiche sur mon Bureau ( en rapport avec excel):

2020 10 29 193042

J'ai pu lire, voir sur certains forums que le presse papiers d'excel n'est pas un "vrai" presse papiers.

Je pense que c'est juste, car malgré cette action VBA elle ne s'incrémente pas dans mon presse papiers Windows et malgré cette alerte de 24 je peux encore multiplier les copier/coller depuis excel.

En espérant être assez explicite je vous remercie pour votre attention.

Bonjour Tespark,

Le but de ton code est d'accéder au presse-papier, de le vider puis de clore celui-ci.

Le Presse-Papier d'Excel sert à passer des informations soit sur Excel même, soit sur d'autres applications Office.

Vois plutôt avec ce code ci-dessous.

Sub ClipAjout()
Dim Clipboard as MsForms.DataObject
Set Clipboard = New MsForms.DatObject
Clipboard.SetText "Je suis copié"
Clipboard.PutInClipboard
End sub

Sub ClipObtient()
Dim Clipboard as MsForms.DataObject
Dim Phrase as String
Set Clipboard = New MSForms.DataObject
Clipboard.GetFromClipboard
Phrase = Clipboard.GetText
Range("A1") = Phrase
End sub

Bonjour Tespark, hello X Cellus

supprimé, pas d'intérêt c'est la même chose (désolé je n'avais pas tout lu la proposition de X Cellus)

Good Night Steelson,

Si Textpark reviens sur le sujet, et que tu est encore là, tu pourras toujours l'intéresser.

A demain, sans doute.

Bonjour,

Moi je fais comme ça.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Sub test()
PressePapier = "toto"
txt = PressePapier
End Sub
Public Property Let PressePapier(Value)
Const DATAOBJECT_BINDING As String = "new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}"
    With CreateObject(DATAOBJECT_BINDING)
        .SetText Value
        .PutInClipboard
    End With
End Property
Public Property Get PressePapier()
Const DATAOBJECT_BINDING As String = "new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}"
    With CreateObject(DATAOBJECT_BINDING)
        .GetFromClipboard
        PressePapier = .GetText
    End With
End Property

Bonjour dysorthographie

Joli code

Bonjour à tous et merci pour vos réponses

Oui le but et de vider le presse papier. Steelson, me dit qu'il n'y à pas d'intérêt, c'est la même chose. Pas sur de comprendre.
X Cellus, j'ai tester ton code et une erreur s'affiche.

2020 10 30 082739

Par contre quand j'utilise le code de Dysorgraphie je n'ai pas d'erreur. Est-ce le fait d'utiliser directement le CLSID de DataObject ?

HKEY_CLASSES_ROOT\CLSID\{1C3B4210-F441-11CE-B9EA-00AA006B1A69}\InprocServer32
Class REG_SZ Microsoft.Vbe.Interop.Forms.DataObjectClass

(Je voulais poster un lien montrant un sujet US sur le code de Dysorgraphie , mais je ne peux pas poster de lien si je n'ai au moins 30 post sur le forum).

Je ne cherche pas à faire des copier/coller, ça je le gére déjà dans mon code, je cherche à vider le presse papier.

Celui de Excel et celui de Windows.

Le code ne vide pas le presse papier de Excel et non plus celui de Windows.

2020 10 30 091156

Par contre si je passe par Windows celui-ci est bien vidé.

2020 10 30 091403 2020 10 30 091439

Je cherche à comprendre pourquoi Windows affiche ceci

2020 10 29 193042

quand je fais un copié/coller sur Windows et quand Excel est ouvert.
Je me demande donc si le presse papiers de Windows et Excel ne sont pas liés.

Et vue que mon code VBA multiplie les copier.coller, je pense qu'il est donc nécessaire de vider le presse-papiers pour effacer la mémoire.

Merci pour ces échanges.

Désolé je poste à la suite de mon message.

J'ai corrigé l'erreur de DataObject. Pour cela j'ai fait depuis l'éditeur VBA, Outils > Préférences > Parcourir et j'ai ajouté FM20.dll qui se trouve ici sur mon PC > C:\Program Files (x86)\Microsoft Office\root\vfs\SystemX86

2020 10 30 111005

Suite à cette action j'ai testé le code ci-dessous mais toujours rien, le presse papier ne se vide pas.

Sub ViderPressePapier()
'Nécéssite d'activer la référence "Microsoft Forms 2.0 Object Library."
Dim Cible As DataObject
Set Cible = New DataObject
Cible.SetText ""
Cible.PutInClipboard
Set Cible = Nothing
End Sub

Merci.

Suite à cette action j'ai testé le code ci-dessous mais toujours rien, le presse papier ne se vide pas.

Une proposition( en 32 bits à adapter si 64 bits)

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

Sub VidePP()
OpenClipboard 0
EmptyClipboard
CloseClipboard
End Sub

Bonjour Steelson,

J'ai posté cette solution dans mon premier message, mais elle ne fonctionne pas.

Si 64 bits ? Le système exploitation ? Si oui cela est toujours user32, non ?

Si excel je suis en 32 bits et cela ne fonctionne pas.

Bonjour Tespark,

Corrige sur le code proposé la 3ième ligne comme ci-dessous.

Set Clipboard = New MsForms.DataObject

Il manquait le a pour faire Data

Normalement si tu tapes MsForms. cela devrait te proposer une liste ou tu peux sélectionner DataObject.

Bonjour X Cellus,

J'ai repris ton code et effectivement il manquait un a. Désolé je ne l'avais pas vu. Mais cela ne fonctionne toujours pas. Pas moyen de vider se presse papier.

Cela colle juste en A1 "Je suis copié".

Clipboard.PutInClipboard permet bien de mettre dans le presse papier, c'est pour cela que j'avais tenté en post 8

Cible.SetText ""

Bonjour à tous,

Voici un code très facile pour vider tous le contenu du presse-papiers d'Excel seulement (c'est un début !) :

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 Application
.CommandBars("Office Clipboard").Visible = True
DoEvents
Set Acc = .CommandBars("Office Clipboard").accChild(1)
Set Acc = zetAcc(Acc, 3)
Set Acc = zetAcc(Acc, 0)
Set Acc = zetAcc(Acc, 3)
Acc.accDoDefaultAction 2&
.CommandBars("Office Clipboard").Visible = False
End With

End Sub
Private Function zetAcc(myAcc As Office.IAccessible, myChildIndex As Long) As Office.IAccessible
Dim ReturnAcc As Office.IAccessible
Dim Count As Long, List() As Variant

Count = myAcc.accChildCount
ReDim List(Count - 1&)
If AccessibleChildren(myAcc, 0&, ByVal Count, List(0), Count) = 0& Then Set zetAcc = List(myChildIndex)

End Function

À appeler avec Call ClearOfficeClipBoard

Ça marche chez moi, chez toi c'est tout bon ?

J'ai trouvé le code ici

Bonne journée,

Baboutz

J'aimerai bien être aussi doué un codage un jour

Bon, je suis désolé mais en réalité ma demande était déjà fonctionnel, le code de mon message de mon premier post est bon.

Je me suis entêté à vouloir voir mon presse papier vide.

Mais cela efface seulement la dernière sélection et non la totalité.

Test fait : J'ai copié/collé EmptyClipboard dans une cellule, ensuite copié CloseClipboard, exécuté la macro et mon menu pour coller est grisé et/ou le Ctrl + V ne donne rien. Donc c'est bien fonctionnel.

2020 10 30 150654

Merci beaucoup Baboutz, mais ce code ma renvoi une erreur sur cette ligne. 2& sert à concaténer ?

Acc.accDoDefaultAction 2&

Je t'avoue ne pas avoir d'erreur... Et je t'avoue également que je comprend mal le code que je t'ai posté, je n'ai fait que transmettre ce que j'ai trouvé sur le net...

Peux-tu essayé d'exécuter la macro toute seule, sans l'appeler dans ta macro de base ?

Cette macro efface bien la totalité de presse-papiers chez moi

Merci pour ta réponse.

C'est ce que j'ai fait, je l’appelle depuis un bouton dans classeur test.

A nouveau,

@baboutz,

Ce code fonctionne sous Excel 2016 mais sous 2019 il crée un bug Appel de procédure incorrect.

Par contre vous pourrez voir ce lien: Vider le Presse-papier

Mais c'est beaucoup de code pour seulement éviter 2 clics souris, à mon avis.

X Cellus, effectivement code très long pour deux clics.

J'avais trouvé ce code qui est dans ton lien et idem ça me renvoie une erreur.

Tu me fais remarquer que quand je me suis inscrit j'ai mal enregistrer ma version, car je suis sur office 2016 et non 2019.

Je vais rectifier suite à ce message. Merci.

2020 10 30 174511

Suite,

Tu peux aussi préciser que tu utilises plusieurs versions d'Excel éventuellement.

Mais informer dans le Forum si tu souhaites un code pour la version la plus ancienne. Cela évite de recevoir un code mal approprié.

Je vais laisser sur ce, le sujet Gestion Presse papiers. A plus.

Oui désolé pour cette erreur.

Merci pour ta participation sur ce sujet.

Bonne soirée.

Rechercher des sujets similaires à "gestion presse papiers"