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
@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.
Bonjour,
Il me semble que je n'ai pas dit que le problème est systématique. Il est au contraire aléatoire, mais assez fréquent. Voici mon code (avant modif, bien sûr) :
VB:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
  Dim obj As New DataObject
  Dim txt As String
  Cancel = True
  If Target.Column = 2 Or Target.Column = 3 Then
    obj.SetText Target.Value
    obj.PutInClipboard
  End If
End Sub
Daniel
 

Dudu2

XLDnaute Barbatruc
Bonjour,
Je ne crois pas qu'on trouvera. Il faut accepter le mystère et s'en remettre à l'API ou au "html".

Cependant, juste une confirmation...
Ce Dim obj As New DataObject, il est bien libéré automatiquement lors de la sortie de la fonction, correct ? Y a pas besoin d'un Set obj = Nothing avant de sortir de la fonction.
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
En fait on ne sait pas bien quand ce phénomène aléatoire de retour "??" se produit.
- Après un reboot du PC, immédiatement ou après un "certain" temps ?
- Après fermeture puis ré-ouverture du classeur, voire d'Excel, immédiatement ou après un "certain" temps ?
 

Dudu2

XLDnaute Barbatruc
Et en passant le DataObject en Static (Ou le sortir de la fonction) ? Pour éviter les multiples instanciations.
VB:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
  Static obj As MSForms.DataObject
 
  If obj Is Nothing Then Set obj = New MSForms.DataObject
 
  Cancel = True
  If Target.Column = 2 Or Target.Column = 3 Then
    obj.SetText CStr(Target.Value)
    obj.PutInClipboard
  End If
End Sub

Et encore une fois je préfère un CStr(Target.Value) qui va passer quoiqu'il arrive un String au SetText.
Je ne sais pas trop comment le SetText réagit quand on lui passe directement un VarType = 0 (vbEmpty) d'une cellule vide. Et si c'est un VarType = 10 (vbError) d'une cellule en erreur, c'est sûr ça plante.
 
Dernière édition:

danielco

XLDnaute Accro
En fait on ne sait pas bien quand ce phénomène aléatoire de retour "??" se produit.
- Après un reboot du PC, immédiatement ou après un "certain" temps ?
- Après fermeture puis ré-ouverture du classeur, voire d'Excel, immédiatement ou après un "certain" temps ?
Le problème disparaît toujours au reboot. Quand il apparaît,, il persiste jusqu'au redémarrage de l'ordi.
Daniel
 

danielco

XLDnaute Accro
Et en passant le DataObject en Static (Ou le sortir de la fonction) ? Pour éviter les multiples instanciations.
VB:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
  Static obj As MSForms.DataObject
 
  If obj Is Nothing Then Set obj = New MSForms.DataObject
 
  Cancel = True
  If Target.Column = 2 Or Target.Column = 3 Then
    obj.SetText CStr(Target.Value)
    obj.PutInClipboard
  End If
End Sub

Et encore une fois je préfère un CStr(Target.Value) qui va passer quoiqu'il arrive un String au SetText.
Je ne sais pas trop comment le SetText réagit quand on lui passe directement un VarType = 0 (vbEmpty) d'une cellule vide. Et si c'est un VarType = 10 (vbError) d'une cellule en erreur, c'est sûr ça plante.
J'essaie ce code quand l'erreur se reproduit.
Daniel
 

patricktoulon

XLDnaute Barbatruc
re
te toute façon je vois pas pourquoi s'obstiner alors que l'on t'a donné 2 autres solutions clé en main(apis/html) et qui ont fait leur preuve et qui ( en ce qui concerne mon expérience) a ce jour ne m'ont jamais fait défaut
perso a l'époque même sur 2007 j'avais déjà des soucis avec le dataobject des qu'on le titillait un peu trop
après tu fait comme tu veux ;)
en ce qui concerne le post #53 je mettrais le cancel a la fin moi ;)
je dis ça car vu qu'il est sensé annulé le selstart dans la cellule ( au double click) il est fort possible qu'il y ai un focus et perte de focus qui annulerait peut être la main sur le dataobject
je dis moi j'en sais rien je suppute tout au plus ,perso c'est un object que j'utilise plus depuis longtemps dans mes créations
 

patricktoulon

XLDnaute Barbatruc
re
parmi les vieilleries que j'utilisais déjà en vbs ,il y a des décennies et qui surtout fonctionnent encore même sur W 10
adapté en VBA
pour écrire dans le clipboard
VB:
Sub test()
    PuInClipBoard "je te met des trucs la dedans moi  et va y que je te bourre le clip à mort"
    [A1].Select
    ActiveSheet.Paste
End Sub
Function PuInClipBoard(texte)
    CreateObject("WScript.Shell").Run "cmd.exe /C echo """ & texte & """| clip", 0, True
End Function
 

danielco

XLDnaute Accro
re
parmi les vieilleries que j'utilisais déjà en vbs ,il y a des décennies et qui surtout fonctionnent encore même sur W 10
adapté en VBA
pour écrire dans le clipboard
VB:
Sub test()
    PuInClipBoard "je te met des trucs la dedans moi  et va y que je te bourre le clip à mort"
    [A1].Select
    ActiveSheet.Paste
End Sub
Function PuInClipBoard(texte)
    CreateObject("WScript.Shell").Run "cmd.exe /C echo """ & texte & """| clip", 0, True
End Function
Bonjour,
J'essaierai aussi.
Daniel
 

danielco

XLDnaute Accro
re
parmi les vieilleries que j'utilisais déjà en vbs ,il y a des décennies et qui surtout fonctionnent encore même sur W 10
adapté en VBA
pour écrire dans le clipboard
VB:
Sub test()
    PuInClipBoard "je te met des trucs la dedans moi  et va y que je te bourre le clip à mort"
    [A1].Select
    ActiveSheet.Paste
End Sub
Function PuInClipBoard(texte)
    CreateObject("WScript.Shell").Run "cmd.exe /C echo """ & texte & """| clip", 0, True
End Function
Ca fonctionne. Merci.
Daniel
 

danielco

XLDnaute Accro
Et en passant le DataObject en Static (Ou le sortir de la fonction) ? Pour éviter les multiples instanciations.
VB:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
  Static obj As MSForms.DataObject
 
  If obj Is Nothing Then Set obj = New MSForms.DataObject
 
  Cancel = True
  If Target.Column = 2 Or Target.Column = 3 Then
    obj.SetText CStr(Target.Value)
    obj.PutInClipboard
  End If
End Sub

Et encore une fois je préfère un CStr(Target.Value) qui va passer quoiqu'il arrive un String au SetText.
Je ne sais pas trop comment le SetText réagit quand on lui passe directement un VarType = 0 (vbEmpty) d'une cellule vide. Et si c'est un VarType = 10 (vbError) d'une cellule en erreur, c'est sûr ça plante.
Désolé, ça ne fonctionne pas.
Merci.
Daniel
 

Discussions similaires

Réponses
47
Affichages
2 K

Statistiques des forums

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