XL 2016 Coller plusieurs fichiers 'entiers' dans le presse papier

CL91220

XLDnaute Nouveau
Bonsoir,
A l aide d'une macro Excel 2016, je cherche à copier plusieurs fichiers dans le presse papier afin que l opérateur du programme puisse manuellement les coller dans un mail par un CTRL+V. Les fichiers en questions sont de tous types (PDF, Docx, msg, etc...). L objectif est que depuis une form Excel, je puisse copier des fichiers dans le presse papier comme je pourrai le faire manuellement depuis l explorateur Windows...
Merci par avance pour votre aide.
 

TooFatBoy

XLDnaute Barbatruc
Pour joindre un fichier à un mail, il n'est pas question d'utiliser le presse-papier.
Il faut donner le nom et le chemin du fichier dans les paramètres du mail.

Tu trouveras de nombreux exemples en faisant une recherche sur le forum. ;)

Un exemple parmi tant d'autres :
 
Dernière édition:

TooFatBoy

XLDnaute Barbatruc
Je comprends un peu mieux ce que tu veux faire.

En revanche, je ne comprends toujours pas cette obsession de vouloir absolument utiliser le presse-papier.
Ton interface permet de visualiser les fichiers, donc il doit être possible d'ajouter un bouton "Copier" qui mettrait le nom et le chemin des fichiers dans une liste ; liste qui pourrait être utilisée pour "Coller", soit dans un dossier, soit dans un mail.
Mais il faudrait tout gérer toi-même dans tes macros...

J'avoue que ça dépasse largement mes capacités.
 

Phil69970

XLDnaute Barbatruc
Bonjour @CL91220 et bienvenu sur XLD
Bonjour à tous

En passant quelques remarques :

1) Il y a manifestement un problème de compréhension dans la demande. o_O
Un peu comme si nous parlions en Français et toi en patois très localisé !!! 🤣et forcément le dialogue tourne en rond.
==> 11 messages et on comprend pas complètement ce que tu veux faire ou plutôt on devine légèrement ... 🤔mais on est encore dans le très vague.;)
Je tente une traduction tu veux envoyer un mail avec des fichiers joints au mail ?

2) Et si tu nous mettais un fichier de ce que tu as déjà fait en nous expliquant dans le fichier je veux faire ci ou ça dans tel ou tel condition etc....
Car pour l'instant c'est comme si tu demandais à un aveugle de peindre la Joconde dans le noir.
Ok si il est aveugle c'est pas très grave d'être dans le noir ! 😂😂😂
Mais pour l'observateur qui lui décrit la Joconde il fait comment ?😳

Bonne lecture et bonnes fêtes

@Phil69970
 

TooFatBoy

XLDnaute Barbatruc
TooFatBoy, je suis intéressé par ce moyen car c'est la réponse à plusieurs objectifs (coller fichiers dans mail ou dans un répertoire)... Pas de code à produire au cas par cas, plus de lisibilité, etc... D'où l'élégance à mes yeux :). En plus une fois que je saurai cela, je pourrai l'utiliser dans d'autres circonstances.
Ok, je comprends parfaitement ce que tu dis et ce que tu veux faire, mais perso je ne sais pas faire ça.

C'est pourquoi je te disais de remplir une liste avec les noms des fichiers et leurs chemins, puis effectuer le reste par macro, selon ce que veut faire l'utilisateur :
- soit les copier un par un dans un autre dossier,
- soit les joindre un par un dans un e-mail.


Crois-moi, Phil69970 ou patricktoulon sont très bien placés pour te fournir une solution parfaitement fonctionnelle. Tu peux leur faire 100 % confiance. Tu as juste à te laisser guider. ;)
 

Deadpool_CC

XLDnaute Accro
Bonsoir,
pour ma part je pense qu'il n'y a pas de solution pour contourner la gestion du presse-papier car Excel a des routine bien particulière (copy d'un cellule, d'une plage de cellules contiguë ou pas, ...) pour transmettre l'info correcte au presse-papier système.
 

Deadpool_CC

XLDnaute Accro
Après faudrait utiliser les API windows directement concernant le clip board et redévelopper une fonction qui permettre de "Copier un fichier Système dans le Clipboard ... une vrai usine à gaz.
en excel 2010 j'avais utiliser un truc du genre mais avec le nouveau presse-papier depuis Win 8 ... je ne saurait dire si cela fonctionne.
Et en plus faudrait revoir la fonction pour choper non pas une chaine mais un pointeur sur un objet filesystem.

VB:
Option Explicit
#If Mac Then
    ' ignore
#Else
    #If VBA7 Then
        Declare PtrSafe Function GlobalUnlock Lib "kernel32" (ByVal hMem As LongPtr) As LongPtr
        Declare PtrSafe Function GlobalLock Lib "kernel32" (ByVal hMem As LongPtr) As LongPtr
        Declare PtrSafe Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, _
                                                             ByVal dwBytes As LongPtr) As LongPtr

        Declare PtrSafe Function CloseClipboard Lib "User32" () As Long
        Declare PtrSafe Function OpenClipboard Lib "User32" (ByVal hwnd As LongPtr) As LongPtr
        Declare PtrSafe Function EmptyClipboard Lib "User32" () As Long

        Declare PtrSafe Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, _
                                                         ByVal lpString2 As Any) As LongPtr

        Declare PtrSafe Function SetClipboardData Lib "User32" (ByVal wFormat _
                                                                As Long, ByVal hMem As LongPtr) As LongPtr
    #Else
        Declare PtrSafe Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
        Declare PtrSafe Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
        Declare PtrSafe Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, _
                                                     ByVal dwBytes As Long) As Long

        Declare PtrSafe Function CloseClipboard Lib "User32" () As Long
        Declare PtrSafe Function OpenClipboard Lib "User32" (ByVal hwnd As Long) As Long
        Declare PtrSafe Function EmptyClipboard Lib "User32" () As Long

        Declare PtrSafe Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, _
                                                 ByVal lpString2 As Any) As Long

        Declare PtrSafe Function SetClipboardData Lib "User32" (ByVal wFormat _
                                                        As Long, ByVal hMem As Long) As Long
    #End If
#End If
Public Const GHND = &H42
Public Const CF_TEXT = 1
Public Const MAXSIZE = 4096

Sub ClipBoard_SetData(MyString As String)
    #If Mac Then
        With New MSForms.DataObject
            .SetText MyString
            .PutInClipboard
        End With
    #Else
        #If VBA7 Then
            Dim hGlobalMemory As LongPtr
            Dim hClipMemory   As LongPtr
            Dim lpGlobalMemory    As LongPtr
        #Else
            Dim hGlobalMemory As Long
            Dim hClipMemory   As Long
            Dim lpGlobalMemory    As Long
        #End If

        Dim x                 As Long

        ' Allocate moveable global memory.
        '-------------------------------------------
        hGlobalMemory = GlobalAlloc(GHND, Len(MyString) + 1)

        ' Lock the block to get a far pointer
        ' to this memory.
        lpGlobalMemory = GlobalLock(hGlobalMemory)

        ' Copy the string to this global memory.
        lpGlobalMemory = lstrcpy(lpGlobalMemory, MyString)

        ' Unlock the memory.
        If GlobalUnlock(hGlobalMemory) <> 0 Then
            MsgBox "Could not unlock memory location. Copy aborted."
            GoTo OutOfHere2
        End If

        ' Open the Clipboard to copy data to.
        If OpenClipboard(0&) = 0 Then
            MsgBox "Could not open the Clipboard. Copy aborted."
            Exit Sub
        End If

        ' Clear the Clipboard.
        x = EmptyClipboard()

        ' Copy the data to the Clipboard.
        hClipMemory = SetClipboardData(CF_TEXT, hGlobalMemory)

OutOfHere2:

        If CloseClipboard() = 0 Then
            MsgBox "Could not close Clipboard."
        End If
    #End If

End Sub

faut vraiment avoir du temps à perdre :)
et en plus en version x64, je pense que beaucoup de chose sont à revoir ... lol
 

CL91220

XLDnaute Nouveau
Je me rends compte que ma dernière précision n apporte pas la clarté que j espérais.
La sélection par l opérateur des fichiers sur la form Excel , j en fais mon affaire. Ce que je ne sais pas faire, (info non trouvée malgré mes recherches), c est introduire dans le presse papier les informations permettant à l opérateur de coller dans un mail les fichiers initialement sélectionnés...
J espère que c est plus clair ainsi.
Bonne fin de soirée et bonnes fêtes à tous :)
 

CL91220

XLDnaute Nouveau
Bonjour PatrickToulon,

merci pour cette orientation. J'ai cherché et je suis arrivé aux résultats suivants:

A partir de ce code là:
Sub ClipAjout()
Dim Clipboard As MSForms.DataObject
Dim t As String
Set Clipboard = New MSForms.DataObject
Clipboard.SetText "C:\Users\CL145667\Desktop\Localisation.xlsx"
Clipboard.PutInClipboard
t = "C:\Users\CL145667\Desktop\Localisation.xlsx"
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
En collant dans un mail, j'obtient la même chose qu'en procédant au collage dans une cellule d'un onglet excel, c'est à dire la chaine de caractère suivante: 'C:\Users\CL145667\Desktop\Localisation.xlsx'

Quand je veux coller dans l'explorateur windows (ce n'était pas ma question à l'origine), je n'ai pas la possibilité du tout de coller, comme si le presse papier était vide...
Il doit manquer quelque chose qui permet à windows de comprendre qu'il ne faut pas copier le texte, mais coller le fichier dont le chemin est défini par la chaine de caractère...
Il doit aussi y avoir l'influence de la distinction entre presse papier Windows et presse papier office...

Je continue de chercher encore dans cette direction. Si éventuellement tu as quelques éléments supplémentaires, ils seraient les bien venus 😉
 

CL91220

XLDnaute Nouveau
Merci beaucoup TooFatBoy!!

je me rends compte que je n'utilise pas le bon vocabulaire!! :confused:

C'est justement ce que je souhaite, permettre à l'utilisateur de mon programme de joindre des fichiers à un mail en passant par la fonction coller du presse papier.
De même, je souhaite permettre à un utilisateur de coller des fichiers dans l'application Explorateur Windows en passant par la fonction coller du presse papier. Mais pour permettre à l'utilisateur de mon programme de pouvoir faire cela, il faut que je formalise le contenu du presse papier en conséquence et là, je ne trouve toujours pas la solution... 😐
 

CL91220

XLDnaute Nouveau
Bonjour TooFatBoy,

Merci beaucoup pour cette réponse. je réalise effectivement qu'il y a de la diversité dans les méthodes pour joindre des fichiers à des mails via vba. Ta proposition sera appliquée avec plaisir si je ne réussie pas à placer dans le presse papier les infos permettant à l'utilisateur de l'outil de 'coller' les fichiers n'importe où (mail, bureau, explorateur windows)... En effet, utiliser le presse papier (de Windows je suppose) permet de répondre à toute cette diversité de cas qui pourrait être utile à l'utilisateur de l'outil. Je n'avais pas donné tous les exemples possibles justifiant la demande initiale, désolé ToofatBoy.

Si ma demande est trop compliquée, je peux éventuellement passer par une autre méthode du genre copier en vba les fichiers en question dans un répertoire dédié à la 'récupération de fichiers' et ouvrir ce répertoire en lançant l'application explorateur pour permettre à l'utilisateur d'en faire ce qu'il veut... Il suffirait que j'initialise le contenu du répertoire à chaque fois avant de l'utiliser à nouveau. C'est moins sympa, mais cela aurait le mérite de facilité l'utilisation des fichiers en question par l'utilisateur...

Je vais essayé de voir sur cette seconde voie si aucune solution 'simple' ou 'clef en main' ne se présente pour l'utilisation du copier/coller.

En tout cas encore merci!
 

TooFatBoy

XLDnaute Barbatruc
Le problème c'est que je ne comprends pas exactement ce que tu veux faire. Mais de toute façon, tu ne peux pas copier le contenu de plusieurs fichiers dans le presse-papier puisque quand tu fais le "Copier" ça écrase l'ancien contenu du presse-papier par le contenu que tu viens de "Copier".
 
Dernière édition:

CL91220

XLDnaute Nouveau
Merci bcp pour ta patience ToofFatBoy ! Je vois bien que je ne suis toujours pas clair... Désolé!

L outil que j ai créé est un gestionnaire d équipements utilisant uniquement des form en interface. Il assure les opérations en lien avec l inventaire, les fiches de vie et l édition des planning des tâches à faire. A terme, c est entre 200 et 300 équipements avec un peu d historique dans leur fiche de vie qui seront digérés par l outil. A chaque enregistrement dans une fiche de vie, l utilisateur peut associer des documents (certificat d étalonnage, constat de maintenance, etc...) ces documents sont 'rangés' dans des répertoires très divers. Du coup, une interface existe pour présenter tous les documents en lien avec un numéro de série spécifique choisi par l'utilisateur . Pour l instant, cette interface ne permet que la visualisation des fichiers. Mais les utilisateurs peuvent avoir à adresser par mail un ou plusieurs de ces documents ou simplement les placer sur une clef USB. Il faut donc permettre à l'utilisateur de manipuler les fichiers également. D où la volonté d utiliser le presse papier. Mais ma seconde option me semble pas mal séduisante. Je veux parler de celle abordée à la fin de mon dernier message. Du coup, surtout ne perd pas trop de temps à essayer de répondre à ma problématique. Si je suis bien sûr toujours très intéressé pour utiliser le presse papier pour y placer des fichiers, ma solution de secours est sympa et les premiers essais semblent concluants.👍
 

Discussions similaires

Statistiques des forums

Discussions
311 720
Messages
2 081 910
Membres
101 837
dernier inscrit
Ugo