Copie de fichiers à partir d'une liste Excel [VBA]

Bonjour à tous.

Je cherche une formule VBA permettant de copier des fichiers d'un dossier source vers un dossier destination, sans tenir compte de leur extension.
La liste des références à copier se trouve sur la colonne A de le feuil1.

Format type des noms de fichiers : 111111-A-222

6 premiers digits (chiffres) = code du projet / 8eme (lettre) = nature de la pièce / 10 à 12 (chiffre) = numéro de pièce.

Certaines références (sur la liste Excel) peuvent avoir un 13eme caractère, une lettre, en cas de révision. Exemple : 111111-A-222B (révision B)
Problème : la désignation des fichiers, dans le dossier source, n'est pas harmonisée.
Certains fichiers peuvent avoir une lettre de révision en 13eme position dans leur nom, alors que d'autres l'auront en 15eme position.
111111-A-222B ou 111111-A-222_B

Pour finir, je voudrait que sur la liste Excel, les références ayant été copiées avec succès soit repérables après exécution.
(changement de couleur de fond, de couleur de police ou ajout d'un caractère en colonne B)

J'espère que mon explication aura été clair.
Par avance, merci de votre aide.

Bonjour,

à tester.
Je suis parti du principe qu'il ne pouvait pas y avoir de doublons du style 111111-A-223B et 111111-A-223_B, à préciser.
Si c'est le cas les 2 fichiers sont copiés et un décalage se produira en B
eric

Bonjour Eric et merci beaucoup pour votre aide.

En effet, j'ai oublié de le préciser, mais il peut y avoir des doublons du style 111111-A-223B et 111111-A-223_B dans les noms des fichiers à copier.

Vous pouvez m'expliquer comment fonctionne votre code ?

Je pensais qu'il ne fonctionnerait que pour les références de 12 ou 13 caractères de long, mais il fonctionne aussi pour d'autres tailles.

Vous recherchez les correspondances entres les références renseignées sur la liste excel et les fichiers du dossier source (sans tenir compte de leurs longueurs) tout en analysant en parallèle les deux derniers caractères des fichiers à copier afin de déterminer s'il y a, oui ou non, une révision ?

Ci-joint le code initialement bricolé avec chatgpt. J'étais parti sur deux traitements différents en fonction de la taille de la référence à copier. Bien que super brouillon, ça fonctionnait sur mon pc (refs de 12 et 13 caractères) par contre sur une base de fichiers plus conséquente; mission impossible. A chaque fois ça me copie 1000+ fichiers qui n'ont pourtant aucune similitude dans leurs noms avec les références de la liste.

Je n'en ai pas parlé, mais j'ai aussi une minorité de références nommées ainsi : 111111D222/333 ou 111111D222/333A. Les 3 chiffres après le slash correspondent à la longueur de la pièce. Les fichiers à copier sont nommés différemment du fait du slash : 111111D222_333 ou 111111D222_333A (et/ou 111111D222/333_A)

Peut être que la prise en charge de ce type de codification est compliquée. Si c'est le cas, inutile de vous y atteler je peux les traiter à la main, vous m'avez déjà très largement faciliter les choses avec votre premier code.

Bonjour,

je dresse la liste de tous les fichiers sur le disque.
Je boucle sur ceux de ta liste et sur ceux du disque, je copie tous ceux qui commencent par ta liste (111111-A-223* , hors extension)
Si tu as des noms plus longs qu'il faut exclure, précise que j'ajoute ce point.
Faut-il contrôler aussi précisément la lettre de révision ?
Sans tous les détails j'évite d'ajouter des trucs inutiles...

Comme tu as des doublons je ferais démarrer (ou à la fin, à ton choix) par (2)... le nom du fichier avec le nombre de copies réalisées qu'il n'y ait plus de décalage. Seul le dernier nom apparaitra sauf si tu les veux tous bout à bout
Ca te va où autre idée plus adaptée à ton besoin ?
Mais pas tout de suite

Bonsoir,

Merci pour ces explications, je vais essayer de répondre à tes questions du mieux possible.

Si tu as des noms plus longs qu'il faut exclure, précise que j'ajoute ce point. C'est à dire des noms plus longs, peux-tu préciser ? Sur la liste je renseigne le nom "exact" du fichier à copier. La seule différence qu'il peut y avoir entre la référence et le nom réel du fichier réside dans la position de la lettre de révision (A ou _A), si révision il y a.

Dans mon cas les seuls noms plus long à traiter concernent les pièces de longueur :

Je n'en ai pas parlé, mais j'ai aussi une minorité de références nommées ainsi : 111111D222/333 ou 111111D222/333A. Les 3 chiffres après le slash correspondent à la longueur de la pièce. Les fichiers à copier sont nommés différemment du fait du slash : 111111D222_333 ou 111111D222_333A (et/ou 111111D222_333_A)

Faut-il contrôler aussi précisément la lettre de révision ? Qu'est ce que tu entends par précisément ? Il faut le prendre en compte oui.

Concernant les doublons (111111-A-223B / 111111-A-223_B), je n'ai pas besoin des 2 fichiers. Je ne sais pas ce qui est le plus simple, mais au lieu d'indiquer le nombre de copies réalisées, tu peux juste copier le fichier le plus récent et ne pas toucher l'autre.

C'est peut être volontaire et normal, mais lorsqu'il n'y a qu'une seule référence renseignée dans la colonne A, le calcul ne se fait pas : Incompatibilité de type.

Encore une fois merci pour ton aide, rien ne presse.

Bonjour,

C'est peut être volontaire et normal, mais lorsqu'il n'y a qu'une seule référence renseignée dans la colonne A, le calcul ne se fait pas

non, j'ai dû boguer. Pas fais beaucoup de contrôles du fait de l'heure.

C'est à dire des noms plus longs, peux-tu préciser ?
Faut-il contrôler aussi précisément la lettre de révision ? Qu'est ce que tu entends par précisément ?

Plus d'actualité. J'ai fait plus précis que ce que je pensais faire au début.

Bonjour,

l'arrivée des orages m'a fait rallumer le PC

Je pense que j'ai tenu compte de tous les compléments apportés.
Un fichier copié écrase toujours un existant.
Par contre je ne sais pas si tu crées un nouveau répertoire vierge à chaque fois, ou si tu utilises toujours le même.
Des anciennes copies pouvant être gênantes, j'ai ajouté un msgbox demandant s'il faut vider ce répertoire. Si c'est nettoyage systématique, enlève le msgbox et laisse seulement Kill dest & "\*.*"

Pas sûr d'avoir testé tous les cas de figure. Fais des tests exhaustifs.
eric

Bonsoir,

Merci pour ce nouveau fichier. Je le test demain en condition réelle.

Oui je crée un nouveau fichier destination pour chaque session de copie.

Je te tiens au courant.

Si jamais tu peux être amené à relancer après avoir modifié ta liste, garde le kill. Vider un truc vide ne mange pas de pain.

Bonsoir,

J'ai pu testé le programme aujourd'hui, voici ce qu'il en ressort :

Avec

If MsgBox("Supprimer fichiers du répertoire Destination ?", vbYesNo, "Nettoyer") = vbYes Then

Message "Supprimer fichiers du répertoire Destination ?" qui apparait même si répertoire destination vide. Pas gênant, mais voila ce qu'il ce passe ; Oui si vide = erreur d'exécution, fichier introuvable / Non si vide = fonctionnement normal.

Sans (Seulement avec Kill dest & "\*.*") + répertoire de destination vide = erreur d'exécution, fichier introuvable

Sans + fichier quelconque dans répertoire de destination = fonctionnement normal

Sans + un des fichiers à copier déjà dans répertoire destination = fonctionnement normal

Concernant les pièces de longueur (111111D222/333), je vient de remarquer qu'il y a plusieurs dénominations possibles dans le dossier source :

111111D222_333 mais également (je ne le savais pas encore) 111111D222-333 --> pour l'instant seul "_" est traitable et il y a un conflit dans le cas ou les deux noms existent dans source, la copie ne se fait pas + "argument ou appel de procédure incorrect".

La longueur de la pièce n'est pas forcement un nombre entier. Ex : 111111D222/333.5 --> peut donner 111111D222("_"ou"-")333("_"ou"-")5 dans dossier source. On peut partir du principe que si "_" est utilisé pour séparer les 10 premiers digits, le même symbole sera utiliser comme virgule et inversement avec "-".

J'ai l'impression que le traitement des pièces de longueur devient vraiment lourd. Ça peut très bien resté ainsi c'est déjà amplement suffisant, ces pièces sont minoritaires.

Dernier point, pour les lettres (nature de pièce --> "D" et révision --> "A" , "B" , ...) est il possible de ne pas prendre en compte majuscule/minuscule ?

Bonjour,

Supprimer fichiers du répertoire Destination ?

du coup je fais quoi ? Je supprime cette fonctionnalité ou je traite l'erreur ?

Pour le reste ça devient un peu fouillis et peu clair, ambigu avec des mots.
Fais un tableau avec tous les cas de figure et les noms de fichiers acceptés pour chaque (laisse tomber l'extension)
eric

Bonsoir,

Le mieux serait de garder la msgbox, mais de ne la faire apparaitre que si le dossier destination n'est pas vide. Si ce n'est pas possible, autant supprimer le contenu du dossier destination avant chaque copie, sans aucun message.

Concernant les différentes dénominations possibles, je vais te faire un tableau récapitulatif. En ce moment c'est compliqué, mais je vais essayer de tout rassembler avant la fin de cette semaine.

Bonjour,

Ci-dessous toutes les dénominations possibles :

RéférenceNoms dans dossier source
12345D123/312345D123-3
12345D123_3
12345D123/3B12345D123-3_B
12345D123_3_B
12345D123/12312345D123-123
12345D123_123
12345D123/123,412345D123-123-4
12345D123-123_4
12345D123_123-4
12345D123_123_4
12345D123/123.4B12345D123-123-4_B
12345D123-123_4_B
12345D123_123-4_B
12345D123_123_4_B
123456D123/2123456D123-2
123456D123_2
123456D123/2A123456D123-2_A
123456D123_2_A
123456D123/123123456D123_123
123456D123-123
123456D123/123B123456D123_123_B
123456D123-123_B
123456D123/123.4B123456D123-123-4_B
123456D123-123_4_B
123456D123_123-4_B
123456D123_123_4_B

Les lettres de révision sont toujours ajoutées après un symbole "_" alors que le chiffre des dixième sur la longueur de la pièce peut être après un "." ou une "," dans le nom de la référence.

Rechercher des sujets similaires à "copie fichiers partir liste vba"