Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2013 [Résolu] Macro Copie Colle des fichiers

Schmi067

XLDnaute Nouveau
Bonjour a tous,

Je poste sur le forum pour vous exposer une problématique que je rencontre avec une macro que j'ai réadaptée.

Son but final est de copier coller un certains nombre de fichiers d'un répertoire source a un répertoire de destination.

Cette partie la fonctionne.

Par contre, la macro génère une erreur a partir du moment où le fichier n'existe pas dans le répertoire source. La macro s’arrête donc et n'arrive pas a passer à la cellule du dessous.

J'ai bien essayé de faire une condition du style "si le fichier dans le répertoire source n'existe pas alors next sinon tu continues la macro" mais je ne suis pas arrivé à le faire fonctionner.

Voici ci dessous la macro utilisée :

Code:
Sub copievf()
Dim FL1 As Worksheet, Cell As Range, NoCol As Integer
Dim NoLig As Long, DerLig As Long, Var As Variant
 
    Set FL1 = Worksheets("Feuil1")
     
    'Détermine la dernière ligne renseignée de la feuille de calculs
    DerLig = Split(FL1.UsedRange.Address, "$")(4)
     
    'Fixe le N° de la colonne à lire
    NoCol = 1
     
    'Utilisation du N° de ligne dans une boucle For ... Next
    For NoLig = 2 To DerLig
        Var = FL1.Cells(NoLig, NoCol)
         
        'Pour tester : Affiche les variables dans la fenêtre Exécution de VBA
        Debug.Print Var
        
        Dim fso As Object, Src$, Dest$, Fich$

            Set fso = CreateObject("Scripting.FileSystemObject")
            Destination = FL1.Cells(NoLig, 3).Value
            Src = ThisWorkbook.Path & "\"
            Dest = Destination
            Fich$ = Var & ".txt"
            'MsgBox Src & Fich
            'MsgBox Dest & Fich
            fso.CopyFile Src & Fich, Dest & Fich
        
    Next
    Set FL1 = Nothing
End Sub

En gros j'ai des noms de fichiers qui sont repris dans la plage A2:Axx (derniere ligne) et c'est la ou elle regarde la concordance entre le contenu de la cellule d'un coté et l'existence du fichier de l'autre dans le repertoire source.

Et la macro ne trouve pas a un moment le nom/fichier alors elle se met en erreur.

Pourriez vous m'éclairer sur ce point ?

Merci !
 
Dernière édition:

CPk

XLDnaute Impliqué
Re : Macro Copie Colle des fichiers

Bonjour, une petite macro qui vérifie dans un repertoire, vous voulez essayez de l'adapter vous même ?

Code:
Sub vérif()
chemin = "C:\Users\toto\Desktop\test\" 'renseigner ici votre répertoire de recherche en string
fichier = Dir(chemin & "*.xlsx") 'renseigner une extension de fichier pour cibler ou "*.*" pour le tout venant
Do While fichier <> "" 'tant qu'on trouve un nom de fichier
If fichier = "Classeur1.xlsx" Then MsgBox fichier 'si il porte bien le nom que je veux alors afficher une msgbox
fichier = Dir 'passe au fichier suivant
Loop 'fin de la boucle
End Sub
 
Dernière modification par un modérateur:

CPk

XLDnaute Impliqué
Re : Macro Copie Colle des fichiers

Dans les possibilités qu'il y a, vous pouvez coller cette fonction à la suite de votre macro

Code:
Function vérif() As Boolean
fichier = Dir(Src & "*.*")
Do While fichier <> ""
If fichier = Fich Then 
vérif = True
else
vérif = False
end if
fichier = Dir
Loop
End Function

Et dans votre macro, modifiez la ligne pour intégrer la condition que si le fichier existe alors il sera copié
Code:
If vérif() = True Then fso.CopyFile Src & Fich, Dest & Fich
 
Dernière modification par un modérateur:

Schmi067

XLDnaute Nouveau
Re : Macro Copie Colle des fichiers

Bonjour CPK

Merci pour votre nouvelle réponse, j'ai intégré vos macro notamment celle qui fait la vérif du fichier mais ca ne fonctionne pas au niveau de la "reconnaissance" de fichier =>fichier = Dir(Src & "*.*").
Il n'arrive pas a retrouver dans la macro copievf les noms de fichiers
 

CPk

XLDnaute Impliqué
Re : Macro Copie Colle des fichiers

Bonjour, Schmi, vérifiez s'il y a le dernier "\" dans la variable Src.
Ex:
Src = "c:\desktop\user\dossier\"
 
Dernière modification par un modérateur:

Schmi067

XLDnaute Nouveau
Re : Macro Copie Colle des fichiers

La variable Src de votre function vérif doit reprendre automatiquement celle indiquée dans la macro copievf() ?

Car en exécutant en pas a pas en partant de la macro copievf(), j'arrive a aller jusqu'au moment où il teste l'existence du fichier via la function vérif() mais lorsqu'il passe à la ligne du fichier = Dir(Src & "*.*").

En l'état il me trouve pas de Src et prend comme fichier l'icone de bureau.

Solution apportée suite à votre dernier message :

j'ai rajouté en dur le chemin de fichier via Src =Src = "C:\Users\67R0008\Desktop\Test\"
Et la en continuant en pas a pas (via F8) il check et passe en revue les fichiers du répertoire mais il ne va pas switcher vers la fin de la macro et copier le fichier.

Au cas où je poste le code :
Code:
Sub copievf()

Dim FL1 As Worksheet, Cell As Range, NoCol As Integer
Dim NoLig As Long, DerLig As Long, Var As Variant
 
    'Instance de la feuille qui permet d'utiliser FL1 partout dans
    'le code à la place du nom de la feuille
    Set FL1 = Worksheets("Feuil1")
     
    'Détermine la dernière ligne renseignée de la feuille de calculs
    '(Voir explication sur l'utilisation de Split en bas de cette discussion)
    DerLig = Split(FL1.UsedRange.Address, "$")(4)
     
    'Fixe le N° de la colonne à lire
    NoCol = 2
     
    'Utilisation du N° de ligne dans une boucle For ... Next
    For NoLig = 2 To DerLig
        Var = FL1.Cells(NoLig, NoCol)
         
        'Pour tester : Affiche les variables dans la fenêtre Exécution de VBA
        Debug.Print Var
        
        Dim fso As Object, Src$, Dest$, Fich$


            Set fso = CreateObject("Scripting.FileSystemObject")
            Destination = FL1.Cells(NoLig, 4).Value
            'Src = ThisWorkbook.Path & "\"
            Src = "C:\Users\67R0002\Desktop\Test\"
            Dest = Destination
            Fich$ = Var & ".pdf"
            'MsgBox Src & Fich
            'MsgBox Dest & Fich
        
           'fso.CopyFile Src & Fich, Dest & Fich
           If vérif() = True Then fso.CopyFile Src & Fich, Dest & Fich
Next


    Set FL1 = Nothing
    
'

 End Sub

et le code de la function verif()

Code:
Function vérif() As Boolean
Src = "C:\Users\67R0002\Desktop\Test\"
 Fichier = Dir(Src & "*.*")
 Do While Fichier <> ""
 If Fichier = Fich Then
 vérif = True
 Else
 vérif = False
 End If
 Fichier = Dir
 Loop
 End Function

Cordialement
 

CPk

XLDnaute Impliqué
Re : Macro Copie Colle des fichiers

Bonjour, oui ma fonction lis la variable Src mais je pense savoir d'où vient la problématique.
Pour qu'une variable soit lu par d'autre procédure il faut qu'elle soit déclarée en public et non en private. Donc procédé comme le code ci dessous en la déclarant avant la macro (Public Src$)

Ensuite s'il la macro ne s'arrête pas sur le bon fichier il faut surveiller en pas en pas comme vous faite la syntaxe d'écriture entre fich et Fichier. Là je n'ai pas beaucoup de temps pour évaluer d'où provient le problème mais je ce soir je reviens faire un tour


Code:
Public Src$

Sub copievf()
Dim FL1 As Worksheet, Cell As Range, NoCol As Integer
Dim NoLig As Long, DerLig As Long, Var As Variant
...
...
end sub
 

Schmi067

XLDnaute Nouveau
Re : Macro Copie Colle des fichiers

Alors j'ai intégré le "Public Src$" avant la macro et réessaye en pas à pas mais pareil la variable Src de la function verif
est vide.

Je pense avoir contourné ce pb en ayant rajouté le chemin "Src = blabla" car la il vérifie bien tout les fichiers contenus dans le répertoire Src (il trouve meme la présence du fichier excel).

J'ai l'impression qu'entre la macro et la function vérif, il n'y a plus de "lien" sur les fichiers à tester puis a copier et ceux vérifiés car si je regarde le comportement en pas à pas :

La macro copie prend le 1er nom en A2 va jusqu'à la function verif, et la au niveau de la function verif, il check les fichiers existants dans le repertoire Src mais tout en restant bloqué dans la macro copie au 1er nom de A2
 
Dernière édition:

Schmi067

XLDnaute Nouveau
Re : Macro Copie Colle des fichiers

Je viens de me repencher sur la gestion de l'erreur et je pense avoir trouvé la solution du moins j'ai reproduis un environnement de Test et ca a l'air de fonctionner.

Pour gérer l'erreur j'ai ajouter la commande "On Error Resume Next".

Dans mon test, j'ai volontairement généré des noms de fichier se suivent en A2 ( par ex : test1, test2 jusqu'a test10) et au niveau des fichiers a copier, j'ai volontairement laissé des fichiers inexistants par exemple pas de test3 pour voir comment la commande gère l'erreur (le fait de pas trouver le fichier)

Il ne bloque donc plus et continue la macro, a priori la problématique devrait etre résolue !!!
 

Schmi067

XLDnaute Nouveau
Re : Macro Copie Colle des fichiers

Ah lol CPK,

Bon le "On Error Resume Next" n'est pas la solution ultime car ce code va laisser passer tout type d'erreur mais vu la finalité de la macro cela ne "dérange" pas vraiment.

Merci en tout cas de vous etre penché sur mon pb ca a également permis de me questionner !
 

CPk

XLDnaute Impliqué
Re : [Résolu] Macro Copie Colle des fichiers

Bonjour Shmi, si le problème n'est pas résolu il ne faut pas abandonner pour autant. Je vais me créer un environnement de test pour revoir la globalité du process et trouver ce qui cloche. laissez-moi encore aujourd'hui pour ça
 

CPk

XLDnaute Impliqué
Re : Macro Copie Colle des fichiers

Il faut modifier votre macro de façon à déclarer deux variables en public (src et Fich) , et deux variables en private (fso & dest) donc cela revient à faire comme dans l'exemple qui suit

Code:
Public src$, fich$
Sub test()
Dim fso As Object, Dest$
...
...
end sub

Et surtout ne pas oublier de les supprimer quelques lignes plus loin en dessous de Debug.Print Var sinon vous allez rebasculer les variables en private et elles ne seront plus visible par la fonction vérif().

Pour la fonction vérif() c'est normal qu'elle ne fonctionnait pas car elle était mal codée. Essayez plutôt celle-ci.

Code:
 Function vérif() As Boolean
 Fichier = Dir(src & "*.*")
 Do While Len(Fichier) > 0
 On Error Resume Next
 If Fichier = fich Then
 vérif = True
 Exit Do
 Else
 vérif = False
 Fichier = Dir
 End If
 Loop
 End Function


J'ai testé est je n'ai trouvé aucune anomalie apparente.
 
Dernière modification par un modérateur:

Schmi067

XLDnaute Nouveau
Re : [Résolu] Macro Copie Colle des fichiers

Ok je vais tester ! Merci CPk.

Ps : J'aime pas abandonner, j'ai essayé de contourner le pb pour trouver une solution "acceptable" pour revoir le processus !
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…