IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Copie de fichiers avec CreateObject("Shell.Application")


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 17
    Par défaut Copie de fichiers avec CreateObject("Shell.Application")
    Bonjour

    Je vous sollicite afin de trouver une solution quant à la copie de fichier avec VBA.
    Je sélectionne plusieurs fichiers dont les noms alimentent un Tableau, or je n'arrive pas à prendre en considération tous les fichiers en une fois mais les copie l'un après l'autre en utilisant:
    For N=0 to Ubound(TbloCheminFichier)
    CreateObject("Shell.Application").Namespace(DossDest).CopyHere (TbloCheminFichier(N))
    Next N

    Comment pourrais je copier tous les fichiers sans utilser la boucle FOR, NEXT

    Merci à vous, pour votre aide
    Cordialment, Bernardrustrel

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 466
    Par défaut
    Salut,

    D'après la documentation, CopyHere copie un dossier, ce n'est pas l'instruction qu'il te faut.

    tu n'as pas 36 solutions, au choix:
    - Construire une ligne de commande, passer par ShellExecute, et exécuter la commande robocopy (https://learn.microsoft.com/fr-fr/wi...mands/robocopy).
    - Copier les fichiers 1 par 1, dans ce cas, l'objet Shell n'est pas recommandé, mais plutôt FSO (File System Object).

  3. #3
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 560
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 560
    Par défaut
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    Function CopierFichiers(sourceDir As String, destDir As String, overwrite As Boolean) As Variant
        On Error GoTo ErrorHandler
     
        With CreateObject("Scripting.FileSystemObject")
            ' Vérifier l'existence du répertoire source
            If Not .FolderExists(sourceDir) Then
                CopierFichiers = "Le répertoire source n'existe pas."
                Exit Function
            End If
     
            ' Créer le répertoire de destination s'il n'existe pas
            If Not .FolderExists(destDir) Then
                .CreateFolder destDir
            End If
     
            ' Copier chaque fichier du répertoire source vers le répertoire de destination
            Dim sourceFolder As Object
            Dim file As Object
     
            Set sourceFolder = .GetFolder(sourceDir)
     
            For Each file In sourceFolder.Files
                If Not .FileExists(destDir & "\" & file.Name) Or overwrite Then
                    file.Copy destDir & "\" & file.Name, overwrite
                End If
            Next file
        End With
     
        ' Si tout s'est bien passé
        CopierFichiers = True
        Exit Function
     
    ErrorHandler:
        CopierFichiers = "Erreur: " & Err.Description
    End Function
    Tu peux utiliser cette fonction de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub TestCopierFichiers()
        Dim resultat As Variant
        resultat = CopierFichiers("C:\Source", "C:\Destination", True)
     
        If resultat = True Then
            Debug.Print "La copie des fichiers a réussi."
        Else
            Debug.Print "Erreur lors de la copie des fichiers : " & resultat
        End If
    End Sub

  4. #4
    Invité
    Invité(e)
    Par défaut
    Pour afficher le dialogue de transfère des fichiers essaye avec SHFileOperation, il existe pleins d'exemples sur le net sur cette fonction

    https://learn.microsoft.com/fr-fr/wi...hfileopstructa

    pFrom...
    Bien que ce membre soit déclaré comme une seule chaîne terminée par null, il s’agit en fait d’une mémoire tampon qui peut contenir plusieurs noms de fichiers délimités par des valeurs Null. Chaque nom de fichier est terminé par un seul caractère NULL . Le nom du dernier fichier se termine par un double caractère NULL (« \0\0 ») pour indiquer la fin de la mémoire tampon.

    Regarder dans le code la fonction TransfereFichiers

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    Private Declare PtrSafe Function SHFileOperation Lib "shell32.dll" Alias "SHFileOperationW" (lpFileOp As SHFILEOPSTRUCT) As Long
    Private Type SHFILEOPSTRUCT
        hwnd                            As LongPtr
        wFunc                           As Long
        pFrom                           As LongPtr
        pTo                             As LongPtr
        fFlags                          As Integer
        fAnyOperationsAborted           As Long
        hNameMappings                   As LongPtr
        lpszProgressTitle               As LongPtr
    End Type
     
    Private Const FO_COPY = 2
    Private Const FOF_MULTIDESTFILES = &H1
    'Private Const FOF_NOCONFIRMATION = &H10
    'Private Const FOF_SIMPLEPROGRESS = &H100
     
    Public Sub TransfereFichiers(ByVal aSrc As Collection, ByVal Dest As String)
      Dim fso As Object
      Dim DstPath As String, elem
      Dim SrcList As String, DstList As String
      Set fso = CreateObject("Scripting.FileSystemObject")
     
      If aSrc.Count = 0 Then: Exit Sub
     
      For Each elem In aSrc
        SrcList = SrcList & elem & vbNullChar
        DstPath = fso.BuildPath(Dest, fso.GetFileName(elem))
        DstList = DstList & DstPath & vbNullChar
      Next
      SrcList = SrcList & vbNullChar
      DstList = DstList & vbNullChar
     
      Dim lpFileOp As SHFILEOPSTRUCT
      lpFileOp.pFrom = StrPtr(SrcList)
      lpFileOp.pTo = StrPtr(DstList)
      lpFileOp.wFunc = FO_COPY
      lpFileOp.fFlags = FOF_MULTIDESTFILES
     
      SHFileOperation lpFileOp
     
    End Sub
    Dernière modification par Invité ; 29/05/2024 à 20h47.

Discussions similaires

  1. Copie de fichier avec Runtime
    Par seb591 dans le forum Langage
    Réponses: 8
    Dernier message: 24/07/2007, 16h07
  2. Copie de fichier avec un autre utilisateur
    Par cretindezalpes dans le forum Delphi
    Réponses: 7
    Dernier message: 02/04/2007, 17h01
  3. [cURL] Copie de fichier avec Curl
    Par eowene dans le forum Bibliothèques et frameworks
    Réponses: 9
    Dernier message: 17/11/2006, 15h03
  4. Copie de fichiers avec progressbar
    Par serialmatrix dans le forum C++
    Réponses: 3
    Dernier message: 11/02/2006, 18h30
  5. Réponses: 3
    Dernier message: 19/10/2005, 15h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo