Résolu copier une variable type string dans le presse papier

jhlamoustache

XLDnaute Occasionnel
Bonjour les amis,

Voici mon souci : j'ai une procédure qui concatène les valeurs d'un lot de cellules parfois nombreuses
Actuellement je colle le résultat de cette concaténation (variable "Chaine") dans une cellule et je la copie dans le presse papier style :
Cellulequivabien .select
activecell = Chaine
selection.copy

Mon souci est que lorsque le nombre de caractères de la variable Chaine dépasse 32766, seuls ces 32766 premiers sont écrit dans Cellulequivabien, par conséquent copiés dans le presse papier.
Pour éviter cela, est-il possible de copier la variable Chaine directement dans le presse papier sans repasser par la feuille de calcul ?

J'avoue que mes lectures des post similaires sur ce site ou d'autre ne correspondent pas exactement à mon besoin.
Cordialement
 

jhlamoustache

XLDnaute Occasionnel
Bonjour Danreb,

Merci de votre réactivité

Comme je le craignais (pour l'avoir lu ailleurs) en débogantle code, j'ai un message "Type défini par l'utilisateur non défini"
Car je n'ai pas de MSform dans mon fichier.
Je prépare un fichier que je vais joindre dans le post suivant.
 

Dranreb

XLDnaute Barbatruc
Notez que j'aurais écrit le reste du code un peu différemment.
Quelque chose comme ça :
VB:
Dim Zones As Range, Plage As Range, Tablo(), TCar() As String, N&, L&
Set Zones = ActiveSheet.AutoFilter.Range.SpecialCells(xlCellTypeVisible)
Set Zones = Intersect(Zones, ActiveCell.EntireColumn)
For Each Plage In Zones.Areas
   If Plage.Rows.Count > 1 Then
      Tablo = Plage.Value
      ReDim Preserve TCar(1 To N + UBound(Tablo, 1))
      For L = 1 To UBound(Tablo, 1): N = N + 1: TCar(N) = "=" & Tablo(L, 1): Next L
   Else
      N = N + 1: ReDim Preserve TCar(1 To N): TCar(N) = "=" & Plage.Value: End If: Next Plage
With New MSForms.DataObject: .SetText Join(TCar, ","): .PutInClipboard: End With
 

jhlamoustache

XLDnaute Occasionnel
Merci chaleureusement, Ca fonctionne très bien avec mon code, et vos indications.

Votre code, bien que nettement plus efficace, concatène la totalité des cellules visibles, mais ne commence pas à la cellule active pour se poursuivre jusqu'à le dernière visible. De plus, il prend en compte le titre, ce qui est à exclure.

Une réponse amenant une nouvelle question, la voici :
Cette procédure est destinée à être implantée dans le classeur des macros personnelles de collaborateurs inconnus, et pas du tout familiers avec VBA. Selon votre expérience comment m'organiser ? Quels risques envisagez-vous ? Comment gérer les MAJ ?
 

Dranreb

XLDnaute Barbatruc
Bon ben modifiez comme ceci:
VB:
Dim Zones As Range, Plage As Range, Tablo(), TCar() As String, N&, L&
Set Zones = ActiveSheet.AutoFilter.Range
Set Zones = Intersect(ActiveCell.Resize(Rows.Count - ActiveCell.Row + 1), zones)
Set Zones = Zones.SpecialCells(xlCellTypeVisible)
For Each Plage In Zones.Areas
   If Plage.Rows.Count > 1 Then
      Tablo = Plage.Value
      ReDim Preserve TCar(1 To N + UBound(Tablo, 1))
      For L = 1 To UBound(Tablo, 1): N = N + 1: TCar(N) = "=" & Tablo(L, 1): Next L
   Else
      N = N + 1: ReDim Preserve TCar(1 To N): TCar(N) = "=" & Plage.Value: End If: Next Plage
With New MSForms.DataObject: .SetText Join(TCar, ","): .PutInClipboard: End With
Je ne sais trop quoi vous répondre, à part que ce serait peut être pas mal qu'elle soit affectée à une commande de leur barre d'outils Accès rapide.
 

jhlamoustache

XLDnaute Occasionnel
Bonsoir Dranreb,

C'est une bonne idée. Je verrai plus tard comment diffuser ce code avec le service informatique. Pour cela, il faut que je présente un code robuste.

Or, pour le moment, j'ai un souci avec les conditions initiales : il ne faut pas que la procédure se déclenche si l'utilisateur a sélectionné la dernière cellule de la colonne (filtrée ou non). Sachant qu'il n'existe jamais de cellule vide dans la colonne avant la dernière remplie
Cela fonctionne si je me place sur la dernière cellule visible, mais les conditions sont également vérifiées si je ma place sur une cellule et que la suivante est masquée.
Votre code fonctionne (pas de bug) si je me place sur le dernière cellule de la liste sans filtre (sans toutefois concaténer le signe =); et bugue si je me place sur la dernière cellule de la liste filtrée.

Pouvez-vous à nouveau m'aider?
 

jhlamoustache

XLDnaute Occasionnel
Bonsoir Dranreb,

votre code ne plantait pas en réalité, sauf si l'on filtre par mégarde et que la cellule de départ se retrouve masquée. Et encore pas dans tous les cas.
Donc j'ai ajouté ceci après la déclaration de variable :
If Rows(ActiveCell.Row).Hidden = True Then
MsgBox ("cellule de départ masquée" & Chr(10) & "Veuillez sélectionner la cellule de départ de la concaténation")
Exit Sub
End If
Merci de votre aide.
je pense que l'on peut clore cette discussion, mais je ne sais pas le faire.
 

Discussions similaires

Statistiques des forums

Discussions
312 305
Messages
2 087 081
Membres
103 457
dernier inscrit
fab2614