XL 2016 VBA - Anomalie avec le presse-papiers

danielco

XLDnaute Accro
Bonjour,

J'ai ce code qui fonctionne en début de journée pour copier le contenu d'une cellule dans le presse-papiers :

VB:
  Dim obj As New DataObject
  Dim txt As String
  obj.SetText Target.Value
  obj.PutInClipboard

Il n'y a pas d'erreur mais au lieu de la valeur de la cellule, le coller donne deux points d'interrogation encadrés.

Connaissez-vous ce problème et connaissez-vous un contournement ?

Merci d'avance.

Daniel
 

danielco

XLDnaute Accro
Je suis surpris que ton diagnostic soit si rapide et direct.
J'utilise cette méthode MSForms dans un fichier de banque depuis des années et je n'ai jamais rencontré de problème.
Loin de moi l'idée de défendre cette méthode mais ça me surprend que tu arrives à la planter immédiatement. Mais bon, je veux bien te croire ;)

C'est quoi l'erreur qui se produit ?
Je n'ai pas voulu être abrupt, en aucun cas. J'ai constaté ce matin que le problème se produisait. J'ai essayé ton code ainsi que ceux de Dranreb et de Patricktoulon. Il ne corrige pas l'erreur. J'obtiens toujours ces deux points d'interrogation au lieu du texte collé.

Capture d’écran 2021-08-12 141537.png

Il n'y a pas d'erreur à l'exécution. Le résultat est seulement incorrect.
Daniel
PS. J'utilisais également un code semblable au tien (au late binding près)
 

Dudu2

XLDnaute Barbatruc
Bon, tu n'es pas seul apparemment...
There's An Excel Office Bug!
I initially started investigating how to copy text to the clipboard while running someone else's code. This code worked perfectly on my work computer (using Windows 7/Excel 2007), however it kept copying just two question marks to the clipboard while executing the VBA code on my home computer (using Windows 8.1/Excel 2013). It took me forever to narrow down what was causing this to happen (the source code was very long) and of course, the problem ended up being a bug on the part of Microsoft!

Donc ça dépend de l'environnement. Et la solution c'est effectivement l'API (solution MS améliorée par @Dranreb) ou la solution très originale de @patricktoulon.

Merci, j'ai appris un truc avec ton retour !
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
Ce problème apparait à partir de Windows 8(.1 ?).
 

patricktoulon

XLDnaute Barbatruc
re
le data object est une passerelle pour le clipboard (il es affublé des deux fonctions putinclipboard et getclipboard
avec ma solution "originale" ou les apis on passe directe par le clipboard Windows
car en passant par un htmldocument virtuel(en mémoire) le parent c'est 0

@Dudu2 oui normalement en late binding en utilisant le CLISD il ne devrait pas avoir de souci
 

Dudu2

XLDnaute Barbatruc
En fait, sur mon Laptop Windows 8.1 (à jour de toutes les m.a.j.) Office 2010, tout fonctionne sans problème.
Donc je ne sais pas vraiment définir les conditions d'occurrence de ce problème.
 

Pièces jointes

  • Classeur2.xlsm
    14.8 KB · Affichages: 8
Dernière édition:

Dudu2

XLDnaute Barbatruc
La question éventuellement restante à @danielco serait donc: est-ce que le ou les PCs qui ont ce problème ont bien les dernières mises à jours de Windows Update installées ?
Car il est probable que ce bug ait été corrigé par MS. Probablement dans les m.a.j. facultatives.
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Chez moi le phénomène apparaît de temps à autre, mais le plus souvent ça marche normalement. Ce qui est rageant c'est qu'on ne sait pas pourquoi ni quoi y faire. Je pense vaguement que c'est quand le presse-papier contient déjà plusieurs choses à la fois, du texte mais aussi une image, qui contiendrait d'ailleurs le texte en incrustation ou un imbroglio de ce genre. Je ferai des tests la prochaine fois que ça m'arrivera.
Le MSForms.DataObject possède aussi une méthode Clear, et dans la SetText un second argument peut être spécifié à 1. Voir si ça changerait des choses …
Quand on copie une cellule par exemple, on peut coller son image dans Paint.net mais aussi son texte dans le bloc notes. Mais ça doit être plus compliqué que ça car ça ne suffit pas à fusiller le fonctionnement du DataObject, je viens de faire l'essai.
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
HAH CA SE PRÉCISE !!!!mais alors il faut faire vite
j'ai donc
VB:
Sub a()
   sheets(1).shapes(1).copypicture
 Call b2([A1])
End Sub
si je vais suffisamment vite pour aller coller dans une fichier texte ouvert j'ai bien le "??"
il y a donc bien une latence de remplacement de data

j'ai tester avec une capture d’écran aussi en bitmap(bien lourd) et la la latence est plus longue encore
j'ai bien testé l'image n'y ai plus
conclusion comme on fait avec les apis (open/empty/close), il faudrait le faire avec le dataobject accompagné d'un do/loop sur le type de data a l’intérieur je sais pas si ça existe sans apis isclipboardavailable
 

danielco

XLDnaute Accro
La question éventuellement restante à @danielco serait donc: est-ce que le ou les PCs qui ont ce problème ont bien les dernières mises à jours de Windows Update installées ?
Car il est probable que ce bug ait été corrigé par MS. Probablement dans les m.a.j. facultatives.
A ma connaissance, pour ce qui est du mien, oui. Ca devient compliqué d'éviter une mise à jour. Je doute aussi que MS apporte beaucoup d'attention à un problème potentiellement lié à VBA (sauf si tu gères 30000 licences et que c'est bloquant).
Daniel
 

Dudu2

XLDnaute Barbatruc
@patricktoulon,
Je n'arrive pas à reproduire ton cas de ??.

Si ça va trop vite pour avoir le temps de charger le texte peut-être:
VB:
Sub b2(Target As Range)
    Dim DataObject As New MSForms.DataObject
  
    With DataObject
        .SetText CStr(Target.Value)
        .PutInClipBoard
      
        Do While Application.ClipboardFormats(1) <> 0
            DoEvents
        Loop
    End With
  
    Set DataObject = Nothing
End Sub

De toutes façons, si je peux comprendre des circonstances particulières décrites par @Dranreb, je ne comprends pas le plantage systématique de @danielco. Certes on ne sait pas ce qu'il y a avant dans son code, mais ça ne rentre manisfestement pas dans le cadre de ces circonstances particulières.
Et pour lui, il y a un problème structurel à la base.
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
C'est vrai, mais quand il a essayé le code proposé avec le "late binding", sa réponse a été immédiate.
On était peut-être en "fin de journée" :cool:

Ce serait intéressant de faire le test après reboot du PC pour voir si c'est d'entrée de jeu ou si ça attend que le soleil passe le zénith.
 

Dranreb

XLDnaute Barbatruc
Parce qu'il était depuis un moment dans le cas où ça avait cessé de fonctionner. Il n'a pas redémarré son ordinateur pour ça que je sache.
À mon avis l'utilisation du DataObject en liaison tardive n'a aucune chance de réparer la chose
Les liaisons anticipées sont toujours mieux.
 

Discussions similaires

Réponses
47
Affichages
2 K

Statistiques des forums

Discussions
312 206
Messages
2 086 220
Membres
103 158
dernier inscrit
laufin