Boucler sur l'ouverture d'une liste de fichiers

[Résolu/Fermé]
Signaler
Messages postés
98
Date d'inscription
vendredi 20 janvier 2017
Statut
Membre
Dernière intervention
13 décembre 2017
-
Messages postés
98
Date d'inscription
vendredi 20 janvier 2017
Statut
Membre
Dernière intervention
13 décembre 2017
-
Bonjour,

J'ai des fichiers dans un répertoire. Un fichier doit recevoir des informations des autres fichiers. Ces informations sont dans un onglet qui porte le meme nom pour chacun des fichiers.
Je cherche à créer une boucle qui me permette d'ouvrir tout ces fichiers les uns après les autres, puis à copier les données de l'onglet pour les copier dans l'onglet de destination.

Merci pour un éventuel coup de main.
Benoit

5 réponses

Messages postés
16519
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
25 septembre 2021
3 221
Bonjour,

pour pouvoir envisager une réponse, il faudrait savoir sur les classeurs source sur quelle feuille et quelles coordonnées se situent les tableaux à copier en supposant que les tableaux soient identiques soient identiques

le mieux serait de présenter un des ces classeurs

pour cela
Mettre le classeur sans données confidentielles en pièce jointe sur « mon-partage.fr »
et faire un clic droit-coller le raccourci dans votre message

Dans l’attente

ps: discussion transférée dans le forum programmation
Messages postés
98
Date d'inscription
vendredi 20 janvier 2017
Statut
Membre
Dernière intervention
13 décembre 2017
1
Bonjour Michel,


https://mon-partage.fr/f/IJed4bJN/

Voici le code que l'on a réussi à faire


Sub MajFichiersIndividuelsCommit()
Dim dossier As String 'variable qui va contenir le chemin du dossier à analyser
Dim fichier As String 'variable qui va contenir le nom du fichier execel à analyser mais sans son chemin complet
Dim feuille As Worksheet 'variable qui va permettre de boucler sur des feuilles Excel
Dim Base As String 'variable qui contient le nom du fichier Base
Dim Rg1 As Range 'pour tri onglet par date
Dim Rg2 As Range 'pour tri onglet par date

Dim ColDebCommit As Integer 'colonne de début des données dans onglet Commit
Dim ColFinCommit As Integer 'Colonne de fin des données dans onglet Commit
Dim ColDebCopie As Integer 'colonne de début des données de l'onglet Commit à copier dans Liste complète
Dim ColTri As Integer 'Colonne de tri dans onglet Commit - DATE DE MAJ -
Dim ColRech As Integer 'Colonne de recherche dans l'onglet Commit
Dim DtH As String 'Date Heure pour traçabilité

DtH = Date & " " & Time
ColDebCommit = 1
ColFinCommit = 32
ColDebCopie = 5

ColTri = 4
ColRech = 5

Application.DisplayAlerts = False 'on désactive les alertes de sécurité

'------------
'ATTention : 1) cette macro ne fonctionne que si le fichier Base est actif (ouvert dans Excel)
' et si tous les fichiers contenant les mises à jour sont, avec le fichier Base, dans le même répertoire
' 2) On ne vide pas l'onglet Commit du fichier Base (fichier principal) en fin de traitement, on peut conserver ainsi
' cet onglet "pour vérification" après le traitement. Par contre il est vidé au début du traitement suivant.
' 3) On vide les onglets Commit des fichiers secondaires après chaque copie dans l'onglet Commit principal
' Cette Macro ne fait pas de copie de sauvegarde de ces fichiers - a rajouter ou à faire à la main avant exécution si besoin de précaution
'Principe: Remise à zero onglet Commit de la base, recopie des onglets Commit de chaque fichier du répertoire dans l'onglet Commit de la base,
' Remise à zéro des ongelts Commit de chaque fichiet et enregistrement, Tri de l'onglet Commit de la base sur la date de màj
' Màj des données de la liste Complete de la base à partir de l'onglet Commit de la Base, sauvegarde du fichier Base
'------------

dossier = ActiveWorkbook.Path & "\" 'dossier du fichier Base
Base = ActiveWorkbook.Name 'Nom du fichier Base

fichier = Dir(dossier & "*.xl??") 'on utilise la fonction DIR lister les fichiers qui ont une extension qui commence par xl ce qui inclu xlsx xlsm ...

'------------
'ATTENTION: Remet à Zero l'onglet COMMIT de la Base
'------------
i = 2
Do While Workbooks(Base).Sheets("Commit").Cells(i, ColDebCommit) <> ""
i = i + 1
Loop
With Workbooks(Base).Sheets("Commit")
.Activate
.Range(Cells(2, 1), Cells(i, ColFinCommit + 2)).Delete Shift:=xlUp
End With

'------------
'RECOPIE des données de tous les onglets COMMIT des fichiers dans le répertoire vers l'onglet COMMIT du fichier Base
'------------
Lig_Base = 2
Do While fichier <> "" 'tant que le nom du fichier n'est pas vide

If fichier <> Base Then 'on ne traite pas le fichier Base lui même !!

Workbooks.Open (dossier & fichier) 'on ouvre le fichier excel en fournissant le chemin complet donc dossier + fichier

'------------
'Copie de l'onglet Commit du fichier ouvert dans l'onglet Commit du fichier Base
'------------
i = 2
Do While Workbooks(fichier).Sheets("Commit").Cells(i, ColDebCommit) <> ""

' Recopie d'une ligne de l'onglet Commit
For J = ColDebCommit To ColFinCommit
Workbooks(Base).Sheets("Commit").Cells(Lig_Base, J).Value = Workbooks(fichier).Sheets("Commit").Cells(i, J).Value
Next J
' MàJ de 2 colonnes techniques en fin de ligne: fichier d'origine de l'information + date-heure de copie
Workbooks(Base).Sheets("Commit").Cells(Lig_Base, ColFinCommit + 1).Value = fichier
Workbooks(Base).Sheets("Commit").Cells(Lig_Base, ColFinCommit + 2).Value = DtH

i = i + 1
Lig_Base = Lig_Base + 1
Loop
'-------
'ATTENTION: une fois la copie terminée on supprimme les données de l'onglet Commit du fichier traité, on svg et ferme
'-------
With Workbooks(fichier).Sheets("Commit")
.Activate
.Range(Cells(2, 1), Cells(i, ColFinCommit)).Delete Shift:=xlUp
End With

Workbooks(fichier).Save 'sauve du fichier traité avec onglet Commit raz
Workbooks(fichier).Close 'on referme le fichier

End If
fichier = Dir() 'on passe au fichier suivant, c'est ce qui va faire avancer la boucle
Loop

LigBaseFin = Lig_Base - 1 'on conserve la dernière ligne copiée dans l'onglet Commit du fichier Base

Application.DisplayAlerts = True 'ne pas oublier de réactiver les alertes désactivées au début

'-----------
'Tri par Date de l'onglet Commit de la Base - Date de mise à jour
'-----------
Workbooks(Base).Sheets("Commit").Activate

Set Rg1 = Range(Workbooks(Base).Sheets("Commit").Cells(2, ColDebCommit), Workbooks(Base).Sheets("Commit").Cells(LigBaseFin, ColFinCommit + 2))
Set Rg2 = Range(Workbooks(Base).Sheets("Commit").Cells(2, ColTri), Workbooks(Base).Sheets("Commit").Cells(LigBaseFin, ColTri))

Workbooks(Base).Sheets("Commit").Sort.SortFields.Clear
With Workbooks(Base).Sheets("Commit").Sort
.SetRange Rg1
.SortFields.Add Key:=Rg2, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With

'----------
'Màj de l'onglet principal de la Base à partir de l'onglet Commit de la Base
'-----------
For i = 2 To LigBaseFin

'Recherche ligne de la base complète correspondante à celle de Commit (Ligne I)
VA1 = Workbooks(Base).Sheets("Commit").Cells(i, ColRech).Value 'Clef de recherche
J = 2
Do While Workbooks(Base).Sheets("Liste Complete").Cells(J, 1).Value <> VA1 And J < 100000
J = J + 1
Loop

'Si ligne trouvée dans Liste Complete (ligne J)
If Workbooks(Base).Sheets("Liste Complete").Cells(J, 1).Value = VA1 Then
' Recopie de la ligne entière de l'onglet Commit dans l'onglet principal
L = 1
For K = ColDebCopie To ColFinCommit + 2 'on recopie aussi les 2 colonnes techniques dans l'onglet principal pour traçabilité
Workbooks(Base).Sheets("Liste Complete").Cells(J, L).Value = Workbooks(Base).Sheets("Commit").Cells(i, K).Value
L = L + 1
Next K
Else 'sinon Erreur indiquée dans l'onglet Commit en fin de ligne après les 2 colonnes techniques
Workbooks(Base).Sheets("Commit").Cells(i, ColFinCommit + 3).Value = "NON TROUVE!"
End If

Next i

'------------
'ATTENTION: Remet à Zero l'onglet COMMIT de la Base
'------------
i = 2
Do While Workbooks(Base).Sheets("Commit").Cells(i, ColDebCommit) <> ""
i = i + 1
Loop
With Workbooks(Base).Sheets("Commit")
.Activate
.Range(Cells(2, 1), Cells(i, ColFinCommit + 2)).Delete Shift:=xlUp
End With

Workbooks(Base).Save 'On sauve le fichier principal traité

End Sub

Un fichier par personne, comme le fichier partagé.
Modification de l'onglet liste complete par double clic, ce qui déclenche un userform. Cet userform permet l'enregistrement des données dans l'onglet Liste complete mais aussi dans l'onglet Commit.
Les données de cet onglet sont collecté dans un fichier centralisateur (meme structure) et dans un onglet commit (meme structure). On effectue un tri par date et heure (on ne garde ainsi que les dernières données par magasin), puis on renvoie ces données sur l'onglet Liste Complete. Ensuite un nouveau fichier mis à jours en renvoyé à tous le monde.
On a réussi à faire un code qui fonctionne. Je suis preneur de modification eventuelle, d'améliorations, d'une autre approche...de conseils...etc...

Benoit
Messages postés
16519
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
25 septembre 2021
3 221
Bonjour,

difficile à comprendre pour savoir dans quel classeur (source ou base) se trouve ce code
puisque il est écrit
'ATTention : 1) cette macro ne fonctionne que si le fichier Base est actif (ouvert dans Excel)
si la macro est dans "base" ca veut dire que "base" est bien ouvert

que vient faire un userform si on est dans "base" puisqu'il permet de travailler sur les "commit" et la liste complète ---> on peut bricoler, ajouter, modifier la liste dans "base"
si le code est dans chaque fichier source; le code ne sert à rien...

il faut obligatoirement un code spécifique dans les fichiers sources et dans le fichier "base"

a part ca il y a beaucoup de boucles inutiles...
il serait bon d'avoir quelques données (bidon) dans un commit pour travailler efficacement

maintenant, si tu réponds tous les 3 jours à minuit, ne compte pas sur moi
Messages postés
15983
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
25 septembre 2021
1 536 >
Messages postés
16519
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
25 septembre 2021

Bonjour Michel_m

Je suis (verbe suivre) ce gars en msg prive; lie du fichier que je lui ai propose
https://mon-partage.fr/f/kzlY9kKJ/
Autre proposition possible, ne pas ouvrir les fichiers (ADO), mais il debute (!!!!!). Il a une autre demande en cours
https://forums.commentcamarche.net/forum/affich-34607201-userform#p34609423
Je lui ai donne des pistes a suivre

si tu réponds tous les 3 jours à minuit
Apparemment, il est fort occupe toute le journee......
Messages postés
16519
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
25 septembre 2021
3 221 >
Messages postés
15983
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
25 septembre 2021

Ce qui montre que Benoit_Lyon n' a pas de réponse tout de suite il n'hésite pas à passer en message personnel: triste mentalité
Messages postés
98
Date d'inscription
vendredi 20 janvier 2017
Statut
Membre
Dernière intervention
13 décembre 2017
1
Bonjour Messieurs,

Oui en journée c'est pas toujours facile, je suis enseignant donc pas toujours derrière mon ordi (meme si je prefererais), pour expliquer aussi mes "absences", je vais etre Papa très bientot (ce soir, cette nuit...) Donc la disponibilité est plus compliqué ces derniers temps, avec une petite maladie au passage, et une bonne blessure aux mains depuis mardi dernier (Brulures 2ème degrés sur six doigts).
Maintenant que j'ai fini de me justifier, on va pouvoir parler vba.

Pour reprendre :
Meme fichier pour le monde, une personne est en charge de la synchronisation ponctuelle. L'UF sert à changer les données dans l'onglet liste temporaire et à enregistrer ce changement dans Commit.
Lors de la synchro, on "collecte" les données des commit de tous les fichiers à synchroniser, on les intégre au commit du fichier en charge de la synchro.
A partir de là, on effectue un tri afin d'enregistrer que la dernière modif des différents éléments. Puis on les intègre à la liste complete de ce fichier.
On créée un fichier pour chaque utilisateur et on renvoit à chacun et ça recommence.

J'échange déjà avec f894009. Je demande d'autres éléments en plus de ce qu'il me donne afin d'essayer de comprendre les différentes approches possibles.


Donc pour ta demande d'exemple, ouvre le lien que j'ai mis, utilise l'userform. Normalement le Commit va se remplir.
Il faudrait duppliquer ce fichier pour pouvoir utiliser la synchronisation des fichiers.

Je suis à la recherche de conseils, de démarche de simplification pour le code déjà créée.

Me tenant à ta dispo
Merci par avance
Benoit
Messages postés
15983
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
25 septembre 2021
1 536
Bonjour,

Oui en journée c'est pas toujours facile, je suis enseignant
Vous auriez du le mentionner des le depart. Personnellement, vos horaures de reponses ne me derangent pas, mais pour d'autres c'est aussi "Oui en journée c'est pas toujours facile"
Donc ne soyez pas offusquer par des reponses quelque fois virulentes, suffit de mettre les choses au clair

A+

PS: Michel_m:
Sa demande par msg prive n'a rien a voir avec possibilite de reponse(s) plus rapide
Messages postés
16519
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
25 septembre 2021
3 221 >
Messages postés
15983
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
25 septembre 2021

oui, je suis bien con d'essayer d'aider;
alors comme c'est ta seule occupation de la journée comme le montre tout tes messages.......
Messages postés
98
Date d'inscription
vendredi 20 janvier 2017
Statut
Membre
Dernière intervention
13 décembre 2017
1
Bonjour Michel,

Pouvez vous nous faire part de vos connaissances ?
Je vais essayer de faire des efforts sur le temps de réponses.

Maintenant Messieurs, si en plus vous pouviez me donner une piste pour que je puisse apprendre à faire des boucles, je suis preneur.

Merci à vous deux
Messages postés
15983
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
25 septembre 2021
1 536
Re,

Dans les exemples de fichiers que je vous ai donnes, y a des boucles for next, vois pas ce que qu'il faut de plus
Y a aussi une boucle en Do While Loop
Messages postés
98
Date d'inscription
vendredi 20 janvier 2017
Statut
Membre
Dernière intervention
13 décembre 2017
1
Il faut que je les relise et je reviens vers vous pour des questions.
Merci.

Je vais m'occuper de ma nouvelle née qui a juste deux heures.

Bonne soirée
Messages postés
16519
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
25 septembre 2021
3 221
Longue et heureuse vie à elle :o)
Messages postés
98
Date d'inscription
vendredi 20 janvier 2017
Statut
Membre
Dernière intervention
13 décembre 2017
1 >
Messages postés
16519
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
25 septembre 2021

Merci à vous