Recherche de fichier dans repertoire + traitement de donnée
Bonjour,
Je fais de nouveau appel à vos lumières.
Pour le coup je nage complètement dans la semoule.
Je vais vous expliquer le plus clairement possible :
J’ai un répertoire « Devis » dans lequel je stock des devis en attente de validation : Le nom des fichiers on la structure suivant « yyyy_mm_dd-1 Matériel_saisie aléatoire » ou « yyyy_mm_dd-2 Main d’œuvre_saisie aléatoire ».
Je voudrais grâce à la maccro allez chercher dans tous les fichiers « 1 Matériel » des cellules que je colle dans mon fichier actif pour renseigner un BPU. Et une fois cella fait déplacer le fichier dans un répertoire « Traité » qui se trouve dans le répertoire « Devis ».
J’aurais besoin de la structure de code pour aller chercher c’est fameux fichier (Le code pour copier les données est déjà fonctionnel) mais que ceux contenant « 1 Matériel » dans leur nom. Si vous avez des pistes pour m’aiguillé je suis preneur.
Je ne mets pas de fichier en PJ car pour le coup je n’en vois pas l’utilité si jamais vous en avez besoin je peux en mettre un.
Merci d’avance.
- Messages
- 1'794
- Excel
- 2010
- Inscrit
- 25/08/2014
- Emploi
- Consultant VB6 / SQL / VBA / Excel / Access
Bonsoir,
Ci-joint une proposition à tester.
> Renseigner le chemin du répertoire "Devis"
> ce répertoire contient tous les devis
> ce répertoire contient un sous-répertoire "Traité"
Et lancer le traitement
> les fichiers contenant le nom "1 Matériel_saisie"
- sont ouverts
* qq cellules sont récupérées (pour l'exemple A1 & A2 du premier onglets)
- met à jour l'onglet "Résultat"
- le fichier est déplacé
Bonne soirée
Bouben
Salut !
J'ai regardé ton code. Je pense que c'est ce dont j'ai besoin. Je te confirmerai tout ça la semaine prochaine n'ayant pas accès à mon PC pro avant ça.
En tout cas merci pour ta réponse.
En tout cas ta description c'est exactement ce qu'il me fallait.
Bonne soirée.
Bonjour,
Tout d'abord je te confirme que ton code marche au poil et je t'en remercie. Je ne pense pas que j'aurais trouvé tout seul.
J'ai des petits questions car il y a certaine chose que je ne suis pas sur de comprendre donc si tu as le temps de me donner plus de détails histoire que je me couche moins bête.
J'ai repris que le code qui me pose "soucis". et j'ai commenté se que je pense avoir compris.
Dim oFSO As FileSystemObject 'Je t'avoue ne pas comprendre le FSO, en gros on autorise l'utilisation de ce dernier ??
Set oFSO = New FileSystemObject
For Each oFic In oFSO.GetFolder(sRepDevis).Files 'Pour chaque Fichier dans mon répertoire
If InStr(1, oFic.Name, S_LIBELLE) >= 1 Then 'Si je trouve mon libelle la valeur qui sort est égal ou sup à 1 donc
Set oWB = Workbooks.Open(oFic.Path, , True) ' 'On ouvre le 1ere fichier contenant mon libelle
Set oSh = oWB.Worksheets(1) 'on travaille sur la feuille 1 si j'avais mis worksheets(2) ça m'aurait pris la feuille 2??
oShRes.Range("A" & iLigEcr).Value = oFic.Name 'ras
oShRes.Range("B" & iLigEcr).Value = oSh.Range("A1").Value 'ras
oShRes.Range("C" & iLigEcr).Value = oSh.Range("A2").Value 'ras
iLigEcr = iLigEcr + 1 'Du fait qu'on va boucler sans "recharger" la variable iligecr tu l'incrémentes ici. Petit question pourquoi ne pas mettre dans la boucle de nouveau la recherche de la dernière ligne?
Set oSh = Nothing 'Tu vides ?
oWB.Close
Set oWB = Nothing 'Tu vides?
oFic.Move sRepTraites
End If
Next oFic 'Donc la le code nous fait boucler jusqu'à qu'il n'y est plus de fichier contenant le libelle ?
Set oFSO = Nothing 'Tu vides ?
Set oShRes = Nothing 'Tu vides? Question les 4 vidages que tu demandes servent à éviter quoi ? je suppose que tu ne le fais pas pour le plaisir.
MsgBox "Traitement terminé !", vbExclamation- Messages
- 1'794
- Excel
- 2010
- Inscrit
- 25/08/2014
- Emploi
- Consultant VB6 / SQL / VBA / Excel / Access
Bonsoir,
Ci-dessous mes commentaires sur les commentaires
Dim oFSO As FileSystemObjectFileSystemObject est une dll de gestion de fichiers & répertoires, qui a plein de méthodes intéressantes.
InStr(1, oFic.Name, S_LIBELLE) >= 1 Then Recherche une chaîne de caractère dans une autre chaîne de caractère et renvoie la position de la chaîne (donc 0 : non trouvé, 1 ou plus : trouvé)
oWB.Worksheets(1) (1) : c'est le n° de l'onglet du fichier (donc oui, le 2ème onglet, c'est 2)
iLigEcr = iLigEcr + 1 On aurait pu faire l'autre solution. A ce stade là du traitement, on sait qu'on passe à la ligne suivante, donc pas la peine de prendre la dernière ligne
Next oFic
On boucle sur tous les fichiers du répertoires, le test sur le nom de fichier est fait plus haut
Set xxxxx= Nothing 'Tu vides ?Quand on crée un objet, par habitude, il faut le désinstancier (une histoire de libération de mémoire, même si dans notre cas, pas sûr que ce soit utile). Ces notions sont un peu plus complexes, pas grave si pas compris
Pour faire une comparaison :
avec une variable :
toto = "A" => affectation de valeur
toto = "" => vide la valeur
Avec un objet
set toto = new xxxxx => création de l'objet
set toto = nothing => destruction de l'objet
Bonne soirée
Bouben
Bonjour,
Merci pour le temps passé pour répondre à mes questions.
Tu m'as étais d'une grande aide en tout cas.
Au plaisir et bonne journée !