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 répondre à ce besoin, je trouve particulièrement élégant de permettre à l'utilisateur, une fois qu'il a procédé à la sélection des fichiers concernés, de les placer où il le souhaite en faisant un simple collage depuis le presse papier. Dans ce but, je pensais ajouter un bonton 'Copier' sur cette page. Il me semble assez évident maintenant que le presse papier à utiliser n'est pas celui d'Excel, mais bien celui e Windows....
Je dispose des chemins complets des fichiers sélectionnés par l'utilisateur, mais je ne sais pas comment en vba, à partir de ces chemins, faire en sorte que les fichiers sélectionnés soient 'copier' dans le presse papier de Windows. En fait, j'aimerai faire en vba ce que nous faisons simplement dans l'explorateur en faisiant 'clic droit/copier' sur une sélection de fichiers...
Sérieux, arrête avec ton presse-papier ! 😅
Pourquoi veux-tu absolument passer par ce sacré presse-papier ?!?
 

CL91220

XLDnaute Nouveau
Merci TooFatBoy, malheureusement, effectuer un collage du presse papier dans ces conditions ne permet de coller uniquement que la chaine de caractère et non le fichier...

Phil69970, Je veux bien te montrer la variable dans le code contenant les chemins des fichiers que je souhaite voir coller dans le presse papier Windows, mais à quoi cela va te servir?. Cette image était destinée à montrer un contexte, et surtout le texte autour, à t'expliquer un besoin simple qui continue à ne pas être clairement exprimé semble-t-il, tout du moins si tu n'as pas arrêté la lecture du message au niveau de l'image. Phil6970, je n'ai pas un bug dans le code, j'ai juste une variable contenant les chemins de fichiers que je souhaite voir 'copier' dans le presse papier Windows.
Aucun souci si tu ne peux pas m'aider. Je regarderai comment clôturer cette discussion qui a effectivement bcp d'échanges sur une problématique simple mal formulée.
En tout cas merci pour ta tentative de venir à mon aide ;)
Je vais plutôt rechercher la solution sur internet car je n'arrive pas à croire que cela ne soit pas documenté. Après, j'ai vu des trucs qui me semblaient super compliqués, et pas en vba mais en vb... Sans doute transposable... a suivre donc.
Bon après midi
 

CL91220

XLDnaute Nouveau
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.
Merci pour ton aide et A+
 

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. ;)
 

CL91220

XLDnaute Nouveau
Merci bcp pour ce message TooFatBoy,

Effectivement, des solutions existent pour mettre à disposition de l utilisateur les fameux fichiers. Les propositions dont tu parles, je les ai intégrées il y a quelque temps suite aux premiers échanges et pour cela, cette discussion n aura pas du tout été un échec de mon point de vue.

Je comprends également que, pour des personnes qui souhaitent aider sur une problématique, il est important de connaître le contexte au maximum, car parfois, et sans doute assez souvent, le demandeur ne voit pas bien le champs des possibles et peut être aidé d une façon à laquelle il ne pensait pas du tout initialement. C est aussi comme cela qu on peut bénéficier de l expérience des aidants.

Ce qui est curieux, mais il faudra simplement que je m'habitue ( 😉), c est lorsque tu précises que tu as des solutions, que du coup, ce qui t intéresse est d employer une méthode particulière, qui ne nécessite pas d avoir le code car la donnée de départ est le contenu d une variable... Et que le code soit tout de même exigé. C est à dire que tu engages l aidant dans une démarche qui va nécessite de l energie (compréhension d un code). Je ne doute pas une seconde que cela soit bien moins gourmand en énergie pour un aidant que pour un type comme moi, mais quand tu précises que tu as une solution ! ! ! Soit on connaît la méthode et on la donne ( ici, une public sub avec arguments dans le cas présent) soit on dit simplement qu on ne sait pas et ce n est pas du tout un pb.

Comme il n'y a rien d autre que de la bienveillance dans chacun de ces messages, aucun souci pour moi :)
Et loin de moi l idée que les personnes intervenantes ne soient pas compétentes dans le domaine. Bien au contraire 👍

Passez tous de bonnes fêtes et encore merci à tous
 

TooFatBoy

XLDnaute Barbatruc
Je comprends également que, pour des personnes qui souhaitent aider sur une problématique, il est important de connaître le contexte au maximum, car parfois, et sans doute assez souvent, le demandeur ne voit pas bien le champs des possibles et peut être aidé d une façon à laquelle il ne pensait pas du tout initialement. C est aussi comme cela qu on peut bénéficier de l expérience des aidants.
C'est exactement ça. Tu as tout compris à 100 % ! 👍

Perso, je n'ai pas de solution, c'est pour ça que je te donnais des axes de réflexion, des idées de direction à prendre. Je ne saurais hélas t'aider plus. :(


Bonnes fêtes de fin d'année
🖖
 

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
Deadpool_CC,

Je pense effectivement que la solution existe côté Windows et non avec les fonctions de copier/coller interne à Microsoft office...
J ai déjà vu quelque chose du genre, mais effectivement, c est compliqué à comprendre pour mes 3 neurones, cela dit, je vais essayer. Je ne pourrai pas m y mettre avant plusieurs jours. Désolé. En tout cas merci beaucoup ! !
 

Discussions similaires

Statistiques des forums

Discussions
315 098
Messages
2 116 198
Membres
112 681
dernier inscrit
romain38