@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
C'est peut-être le problème, mais il n''y a rien de volontaire (pas de macro, pas de queries... Je fais des accès web, comme tout le monde, lit mon courrier et j'ai des accès RSS. Outre Excel et Outlook, j'ai en permanence Skype, Spotify et iTunes.
Daniel
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.
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 ?
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.
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 ?
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.
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
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
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
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
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.