Macro de copie de fichier trop lente

Chris57

XLDnaute Occasionnel
Bonjour à tous

avec une macro je copie une vidéo d'un dossier vers un autre. Ces fichiers sont gros et donc la copie dure longtemps. L’inconvénient est qu'Excel est bloqué durant cette période de transfert.


Code:
    Dim SourceFichier, DestinationFichier, fso As Object, x As Boolean

    SourceFichier = [K1] & "\" & Selection.Value
    DestinationFichier = "E:\Deja Vue\" & Selection.Value   
        
    FileCopy SourceFichier, DestinationFichier


n'y a t'il pas une autre procédure qui ne bloque pas excel ?
 

Chris57

XLDnaute Occasionnel
Re : Macro de copie de fichier trop lente

Ah bin non, je peux pas utiliser un .bat ou .cmd car le nom du fichier à copier est variable et sera celui de la cellule sélectionnée !
Je peux pas envoyer une variable Excel dans un .bat !!


Quelqu'un aurait une autre idée ?
 

camarchepas

XLDnaute Barbatruc
Re : Macro de copie de fichier trop lente

Bonjour Bruno, Chris,

'Eh Bin" si d'abord tu peux, voici comment :

En effet pas la variable directement ,

mais tu peux transmettre un paramètre a ton fichier Bat.

du coté Excel comme ceci

Code:
Sub AppelBat()
Dim Message As String
'Ici il faudra peut être adapter l'acquisition
Message = ActiveCell
'Si dans la cellule active l'on a "camarche" alors
Message = "camarche" ' Ligne juste pour l'exemple
Shell "c:\temp\travail.bat " & Message
End Sub

et du coté .bat comme cela , Le pause n'est là que pour avoir le temps de voir quelque chose

Travail.bat situé dans le répertoire c:\temp à adapter au besoin et à l'arborescence
Code:
@echo off

echo "parametre passe" %1

pause
 
Dernière édition:

Chris57

XLDnaute Occasionnel
Re : Macro de copie de fichier trop lente

merci pour l'info !!

Alors si je comprends bien c'est la variable "Message" qui est transmise dans le .bat.

Seulement voilà, j'ai 2 variables à passer : le fichier source et le dossier destination.

Autre problème, il semble qu'en .bat on ne peut pas copier des fichier qui contiennent des espaces... Et la plupart de mes fichiers en contienne

Avec les faibles connaissances que j'ai en .bat, ça donnerai un truc comme ça :

Sur excel :

Code:
    Dim SourceFichier, DestinationFichier, fso As Object, x As Boolean

    SourceFichier = [K1] & "\" & Selection.Value
    DestinationFichier = "E:\Deja Vue\" & Selection.Value   
        
    Shell "c:\temp\travail.bat " & SourceFichier & DestinationFichier

Dans le Bat

Code:
@echo off
copy "SourceFichier" "DestinationFichier "
 

camarchepas

XLDnaute Barbatruc
Re : Macro de copie de fichier trop lente

Chris,
C'est presque ça , en tout cas tu as compris le principe

Pour les espaces , c'est vrai si tu utilises certains serveurs, mais sur d"autre et en local pas de souci, ça marchesinon tu peux remplacer les espaces par des _ et voilà , enfin si tu es maitre de l'appelation de ces fichiers

Copieur.Bat
Code:
@echo off
copy %1  %2

et pour Excel, il faut un espace entre chaque parametre

Code:
    Dim SourceFichier as string, DestinationFichier as string 

    SourceFichier = [K1] & "\" & Selection.Value
    DestinationFichier = "E:\Deja Vue\" & Selection.Value  
       
    Shell "c:\temp\copieur.bat " & SourceFichier & " " & DestinationFichier
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Macro de copie de fichier trop lente

Bonjour Chris57, camarchepas, BrunoM45, à tous,

Un essai (windows 7 et Excel 2010) sans utiliser de fichier .bat stocké mais en passant directement une instruction à CMD (mais le principe est le même)

La 1ere macro est une macro de copie (remplacez F1 et F2 par vos chemins & noms de fichiers).
la 2eme macro liste les fichiers de C: pendant que la macro continue à s'exécuter.

Le paramètre /K de cmd indique que la fenêtre cmd reste ouverte après l'exécution. Pour la refermer automatiquement après exécution, remplacer /K par /C.

Le paramètre /Y de la commande copy indique que si le fichier destination existe déjà alors ce fichier est remplacé sans demande de confirmation. Si vous désirez avoir le choix, remplacez /Y par /-Y. Il faudra, dans ce cas, activer la fenêtre cmd pour confirmer ou non la demande d'écrasement du fichier destination.

On peut lancer plusieurs instances de cmd simultanément (par ex. en arrêtant la macro Dir_C puis en la relançant).

Code pour copie:
VB:
Sub CopierFichier()
Const Guil = """"
Dim Phr, F1, F2

F1 = Guil & "E:\AAA BBB.CCC\Fichier à copier.exe" & Guil
F2 = Guil & "F:\Vers Rep1\Vers Rep2\Fic-Dest.exe" & Guil
Phr = "cmd /K copy /Y " & F1 & " " & F2
MsgBox Phr
Shell Phr, vbNormalNoFocus

End Sub
 

Pièces jointes

  • cmd.xls
    35.5 KB · Affichages: 38
Dernière édition:

camarchepas

XLDnaute Barbatruc
Re : Macro de copie de fichier trop lente

Chris, Ma Pomme,

Et oui Christ tu étais dans l'embarras , maintenant tu n'as que l'embarras du choix.

Il n'y a pas de problème sans solution , il n'y a que des problèmes mal posés

l'avantage de la proposition de Ma Pomme est qu'il n'y a pas de fichier en dehors du code.
 

Chris57

XLDnaute Occasionnel
Re : Macro de copie de fichier trop lente

Effectivement j'ai l'embarras du choix !!!

Je test actuellement la procédure de Mapomme. Elle fonctionne à merveille !! Effectivement Excel n'est plus bloqué lors de la copie.
Et cela reste plus facile pour moi qu'un .batch


Mais il me reste un souci :

Une fois la copie terminée, ma macro vérifie si le fichier est bien arrivé à destination, et si c'est le cas elle efface l'original. (je pourrai utiliser la fonction couper ou move, mais comme je suis sur réseau domestique, je préfère prendre des précautions...)

Ceci dit ça me pose un problème : il lance la vérification avant la fin de la copie et la considère comme OK (car des que l'on lance une copie, le ficher s'affiche immédiatement dans le dossier destination)...
Et donc il cherche immédiatement à supprimer le fichier, mais comme celui-ci est en réalité en train d'être copié, il met une erreur.

en gros je me suis tapé moi même sur les c... !

Donc je me demande si je ne devrait pas tout de même utiliser la fonction move. Vous en pensez quoi ?
 
Dernière édition:

camarchepas

XLDnaute Barbatruc
Re : Macro de copie de fichier trop lente

Bonjour,

Xcopy ou replace pourraient être une bonne alternative si disponible . a voir.

Finalement, ce n'est pas la macro qui est lente semble t'il mais la copie elle même.

Et oui en réseau toujours plus long qu'en local.

Est-ce que ton traitement ce résume à déplacer des fichiers ou bien tu fait autre chose en meme temps .

Ex : tu pourrais lancer la tache de copie parallèle, effectuer des controles sur le fichier suivant puis lorsque ces controles sont terminés tu testes la fin de la copie par ( Par exemple un truc souvent employé,) une boucle dont la sortie est conditionnée par l'autorisation d'accès en écriture au fichier en cours de copie + éventuellement un time out pour ne pas finir dans une boucle infernale) voilà le principe.

Mais si ton traitement ce résume uniquement à déplacer des fichiers, alors le filecopy d'excel sera encore le moyen le plus simple.
 

Chris57

XLDnaute Occasionnel
Re : Macro de copie de fichier trop lente

Finalement, ce n'est pas la macro qui est lente semble t'il mais la copie elle même.
Oui, c'est ce que je disais dans mon 1er post :
Ces fichiers sont gros et donc la copie dure longtemps. L’inconvénient est qu'Excel est bloqué durant cette période de transfert.




Xcopy ou replace pourraient être une bonne alternative si disponible . a voir.
Xcopy c'est l'équivalent de couper/coller ?






Est-ce que ton traitement ce résume à déplacer des fichiers ou bien tu fait autre chose en meme temps .
Non rien d'autre. Dans l'ordre la macro établit les chemins (ça c'est très rapide), puis effectue la copie puis effectue la vérif de la copie.






Ex : tu pourrais lancer la tache de copie parallèle, effectuer des controles sur le fichier suivant puis lorsque ces controles sont terminés tu testes la fin de la copie par ( Par exemple un truc souvent employé,) une boucle dont la sortie est conditionnée par l'autorisation d'accès en écriture au fichier en cours de copie + éventuellement un time out pour ne pas finir dans une boucle infernale) voilà le principe..
Là ça me dépasse !! Actuellement j'effectue la vérification de la copie avec ceci :
Code:
        Set fso = CreateObject("Scripting.FileSystemObject")
        x = fso.FileExists(DestinationFichier)        
        If x = True Then
                Kill (SourceFichier) ' Si oui alors supprime l'original
        End If





Mais si ton traitement ce résume uniquement à déplacer des fichiers, alors le filecopy d'excel sera encore le moyen le plus simple.
Le filecopy est ce que j'utilisait au départ et qui ma poussé à créer ce post :
Code:
    Dim SourceFichier, DestinationFichier, fso As Object, x As Boolean

    SourceFichier = [K1] & "\" & Selection.Value
    DestinationFichier = "E:\Deja Vue\" & Selection.Value   
        
    FileCopy SourceFichier, DestinationFichier
Avec la filecopy Excel est bloqué tout le long de la copie du fichier !
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Macro de copie de fichier trop lente

Bonjour Chris57,

Move semble intéressant en testant l'absence du fichier source, Il suffit, je pense, de remplacer copy par move dans la variable Phr dans la macro du post #8.

Sinon, en restant sur une copie, un essai dans le fichier joint.
On utilise un répertoire "Aux-copie" qui contient les fichiers indiquant si les copies se sont bien terminées ou non. Le répertoire est créé s'il n'existe pas.
On fixe une tempo: Const DureeMax = "00:02:00" (ici 2 mn). Si cette tempo est dépassée, on considère que la copie s'est probablement mal passée.

VB:
Sub CopierFichier()
Const Guil = """"
Const DureeMax = "00:02:00"
Dim Phr, F1, F2, Fini, i, Hlimite

If Dir("c:\Aux-copie\nul") = "" Then MkDir "c:\Aux-copie"
ChDir "c:\"
Fini = "C:\Aux-copie\F" & Format(Now, "dd-mm-yyyy-") & Format(Time, "hh-mm-ss.txt")
F1 = Guil & "E:\AAA BBB.CCC\Film a copier.avi" & Guil
F1 = Guil & "E:\AAA BBB.CCC\Film a copier.avi" & Guil
F2 = Guil & "F:\Vers Rep1\Vers Rep2\Fic-Dest.exe" & Guil

Phr = "cmd /K copy /Y " & F1 & " " & F2 & " && " & "echo FINI > " & Guil & Fini & Guil
MsgBox Phr
Hlimite = Time + TimeValue(DureeMax)
Shell Phr, vbNormalNoFocus

' Autres instructions
Do
DoEvents
Loop Until Dir(Fini) <> "" Or Time > Hlimite


'Résultat
If Dir(Fini) <> "" Then
  MsgBox "la copie est terminée - le fichier source peut-être effacé (avec prudence)"
Else
  MsgBox "Le délai de " & DureeMax & " a été dépassé !" & vbLf & _
    "La copie s'est vraisemblablement mal passée."
End If

End Sub
 

Pièces jointes

  • cmd v2.xls
    34.5 KB · Affichages: 36
Dernière édition:

Chris57

XLDnaute Occasionnel
Re : Macro de copie de fichier trop lente

Je reviens sur le sujet après quelques jours d'absence pendant lesquels j'étais sur un autre projet.

J'ai testé ta procédure Mapomme et elle marche à merveille !! Le plus étonnant, c'est que durant la tempo je peux tranquillement lancer une autre macro !

Je vais donc l'adapter à mon fichier et je vous posterai le résultat.

MERCI !!



Un question tout de même : pourquoi tu mets ceci
F1 = Guil & "E:\AAA BBB.CCC\Film a copier.avi" & Guil

F2 = Guil & "F:\Vers Rep1\Vers Rep2\Fic-Dest.exe" & Guil

le fichier doit porter le même nom à l'arrivée non ?



Encore une question :
Si j'ai bien compris c'est la boucle Do , DoEvents etc qui est une sorte de tempo. C'est durant cette boucle qu'Excel semble libre. Est ce que le lancement d'une autre macro pourrai perturber cette boucle ?
 
Dernière édition:

Statistiques des forums

Discussions
311 729
Messages
2 081 971
Membres
101 852
dernier inscrit
dthi16088