XL 2019 VBA - classeur maitre agrégateur de fichiers élèves

Lightanon

XLDnaute Nouveau
Bonjour à tous,

Je cherche à faire une macro sur un classeur maitre qui réunirait les quantités rentraient dans différents classeurs. Je mets en pièce jointe le fichier agrégateur et trois fichiers « élève » avec des quantités préremplies.

Je vais maintenant essayer d’être plus précis dans ma demande. J’ai déjà fait des macros mais j’avoue qu’ici je ne sais même pas par quoi commencer.

J’ai un dossier « fichiers_clients » contenant une dizaine de fichiers nommés « fichier_client – entreprise_1 » (fichier_client espace tiret espace nom de l’entreprise) ou des quantités sont rentrées dans des feuilles différentes « 01-série_a » (02, 03, etc.) (b, c, etc.) en face d’un modèle (« modèle_1a, 2a, 1b, etc.) dans trois colonnes différentes « vert », « bleu », « rouge ». Les noms que je donne sont des exemples pour simplifier et anonymiser, on ne peut supposer que « modèle_1b » vient après « modèle_1a » par exemple. Autre information, une seule feuille (censé être la première) diffère : « IMPORTANT », l’information me semble importante puisque la macro doit regarder toutes les feuilles sauf celle-ci.

J’ai ensuite un classeur agrégateur « fichier_agrégateur » contenant une colonne A avec toutes les entreprises, la ligne 1 avec les séries (nom de chaque feuilles sauf IMPORTANT), la ligne 2 avec les modèles, la ligne 3 avec les critères (vert, bleu, rouge,) et ensuite les quantités. Ce fichier contient plusieurs feuilles similaires à celles des fichiers élèves qui commencent toutes par un nombre : 01, 02, 03, etc. ainsi qu’une feuille « information » contenant un bouton « Importer ».

Le fichier agrégateur doit, lorsque l’on appuie sur le bouton « Importer », importer les quantités entrées dans les fichiers clients présents dans le dossier C:\Users\nom_utilisateur\projet_excel et faire une copie de sauvegarde du fichier maitre (avant l'importation) dans un dossier « sauvegarde » (C:\Users\nom_utilisateur\sauvegarde). La copie de sauvegarde permet d’éviter de perdre les données si jamais un classeur élève initialement rempli était remplacé par une nouvelle version vide.

Il y a des éléments de macro que je saurais créer mais ce qui me bloque clairement c’est le fait que les données du classeur élève soient rangées à la verticale alors qu’elles sont à la l'horizontale dans le classeur maitre.

Si quelqu’un était en mesure de m’aider j’en serai très reconnaissant.

Merci d’avance.
 

Pièces jointes

  • fichier_agrégateur.xlsm
    18.4 KB · Affichages: 6
  • fichier_client - entreprise_1.xlsx
    18.8 KB · Affichages: 4
  • fichier_client - entreprise_2.xlsx
    18.7 KB · Affichages: 1
  • fichier_client - entreprise_3.xlsx
    18.7 KB · Affichages: 1

yal

XLDnaute Occasionnel
Bonjour
J'ai repéré quelques erreurs dans les fichiers. Dans un des fichiers clients les feuilles étaient nommées 01_Série... et dans les autres fichier c'était juste Série… J'ai donc supprimé les chiffres en début de nom. J'ai remarqué aussi qu' il manque quelques colonne de modèles. Je n'ai rien changé. Mais peut être faudrait il ajouter un contrôle ou bien une construction automatique des feuilles récap.
En attendant voici une proposition
 

Pièces jointes

  • fichier_agrégateur v1.xlsm
    28.7 KB · Affichages: 0

yal

XLDnaute Occasionnel
J'ai ajouter une instruction d'enregistrement du fichier agrégateur et une feuille de la lite des colonne qui posent problème. Il semble que ce soit un problème de saisie dans les feuilles clients.
 

Pièces jointes

  • fichier_agrégateur v1.xlsm
    32.4 KB · Affichages: 4

Lightanon

XLDnaute Nouveau
J'ai ajouter une instruction d'enregistrement du fichier agrégateur et une feuille de la lite des colonne qui posent problème. Il semble que ce soit un problème de saisie dans les feuilles clients.

Bonjour yal,

Un grand merci pour cette proposition. Je suis débutant et j'aimerai essayer de comprendre ton code. Malheureusement le code ne fonctionne pas et je ne vois pas pourquoi. Le code plante à la ligne "For j = 0 To 2: .Cells(nl, nc + j) = tb(i, j + 2): Next". Je vais commenter en rouge pour que tu puisses me dire si j'ai bon et répondre à mes questions si tu le veux bien.

Effectivement il manquait des modèles dans la série d, je les ai rajoutés pour correspondre à ce qu'il y a sur les fichiers clients.
J'avais rajouté les numéros 01, 02, etc sur les noms de feuilles si jamais il y avait besoin d'avoir une distinction entre les feuilles de manière constante, mais je vois que pas besoin donc j'ai enlevé. J'avais effectivement oublié de l'appliquer à tous les classeurs.
Je ne vois pas du tout d'ou vienne les erreurs signalées.

Je souhaiterai que la sauvegarde du fichier agrégateur fasse appel à un module dédier, histoire d'avoir un bouton juste pour sauvegarder. La difficulté est qu'il faut enregistrer le backup sans rester dessus après, que l'on continue sur le fichier à son emplacement de base. Je veux continuer sur fichier_agrégateur v1 et non sur fichier_agrégateur v1 - 30-01-2022_233756 qui se trouve dans C:\Users\UserName\projet_excel\sauvegarde (voir commentaire dans code plus loin).

Je souhaiterai également si possible que les noms d'entreprises dans la colonne A se remplissent tout seul en fonction de la présence d'un fichier client. Sinon il faut rajouter manuellement le nom du client dans le fichier agrégateur après avoir ajouté un fichier client d'un nouveau client.

Pour information si jamais c'est utile :
  • les fichiers clients seront totalement verrouillés pour empêcher toute modification hors la saisie de quantité.
  • L'idée est éventuellement d'ajouter au fur et à mesure de nouvelles feuilles correspondant à de nouvelles séries. A voir, peut-être un nouveau fichier agrégateur par an serait préférable....
  • L'idée est également de faire un compte du total des modèles précommandés par tous dans le ficheir agrégateur afin de savoir le stock restant (en fonction d'une quantité de base : si 171 modèles ont étaient commandés et que 200 ont été produits il restera 29 modèles et 0 excédants. Cela se fait facilement mais il faut mettre cette ligne des totals plus bas que le nombre d'entreprises. A réfléchir après.

VB:
Option Explicit

Sub Import()
Application.ScreenUpdating = False 
[COLOR=rgb(184, 49, 47)]'cache l'action pour accélérer le code[/COLOR]
Application.DisplayAlerts = False ' Attention les anciennes sauvegarde seront remplacées
[COLOR=rgb(184, 49, 47)]'empêche l'apparition d'alertes, pourquoi cela supprimerait les anciennes sauvegardes ? Je souhaiterait qu'à chaque importation une nouvelle sauvegarde avec la date et l'heure exacte soit créée.[/COLOR]
  Dim wbSource As Workbook, wbCible As Workbook
[COLOR=rgb(184, 49, 47)]'définie wbSource et wbCible comme des classeurs excel[/COLOR]
  Dim shSource As Worksheet, shCible As Worksheet
[COLOR=rgb(184, 49, 47)]'définie shSource et shCible comme des feuilles[/COLOR]
  Dim chSource As String, chCible As String, Fichier As String, chMaitre As String, chBak As String
[COLOR=rgb(184, 49, 47)]'définie shSource, shCible, Fichier, chMaitre et chBak comme des chaines de caractères[/COLOR]
  Dim nomEntr As String, nomSerie As String
[COLOR=rgb(184, 49, 47)]'définie nomEntr et nomSerie comme des chaines de caractères[/COLOR]
  Dim dl As Integer, dc As Integer, nl As Integer, nc As Integer
[COLOR=rgb(184, 49, 47)]'définie dl, dc, nl et nc comme des entiers[/COLOR]
  Dim tb()
'je ne comprend pas ce qu'est tb()
  Dim rng As Range
[COLOR=rgb(184, 49, 47)]'définie rng comme une plage de cellules[/COLOR]
  Dim i As Integer, j As Integer
[COLOR=rgb(184, 49, 47)]'définie i et j comme des entiers[/COLOR]
 
  Dim msg ' Pour contrôle des colonnes
[COLOR=rgb(184, 49, 47)]'définie msg qui sera utilisé comme MsgBox[/COLOR]

  Set wbCible = ThisWorkbook
[COLOR=rgb(184, 49, 47)]'définie wbCible comme le classeur actuel, donc fichier_agrégateur v1[/COLOR]
  chMaitre = wbCible.Path & "\"
[COLOR=rgb(184, 49, 47)]'définie chMaitre come l'emplacement de wbSource en String, donc C:\Users\UserName\projet_excel[/COLOR]
  chSource = chMaitre & "fichiers_clients\"
[COLOR=rgb(184, 49, 47)]'définie chSource comme chMaitre + fichiers_clients\, donc C:\Users\UserName\projet_excel\fichiers_clients[/COLOR]
  chBak = chMaitre & "sauvegarde\"
[COLOR=rgb(184, 49, 47)]'définie chBak comme chMaitre + sauvegarde\, donc C:\Users\UserName\projet_excel\sauvegarde[/COLOR]

  Fichier = Dir(chSource)
[COLOR=rgb(184, 49, 47)]'la fonction Dir renvoie le nom de tous les fichiers présents dans C:\Users\UserName\projet_excel\fichiers_clients[/COLOR]
  Do While Fichier <> ""
[COLOR=rgb(184, 49, 47)]'demande de faire les instructions suivante tant que Fichier n'est pas vide (fait ces actions pour tous les fichiers présents)[/COLOR]
    Set wbSource = Workbooks.Open(chSource & Fichier)
[COLOR=rgb(184, 49, 47)]'fait s'ouvrir le fichier du nom présent dans Fichier à l'emplacement chSource, donc ouvre fichier_client - entreprise_1 par exemple[/COLOR]
    wbSource.SaveAs Filename:=chBak & Fichier
[COLOR=rgb(184, 49, 47)]'enregistre le fichier que l'on vient d'ouvrir dans C:\Users\UserName\projet_excel\sauvegarde, cependant la macro ne fonctionne pas si une sauvegarde est déjà présente... en fait je souhaiterai faire une sauvegarde de fichier_agrégateur v1 et non des fichiers clients. La sauvegarde devrait suivre le format suivant dd-mm-yyyy_hhmmss par exemple : fichier_agrégateur v1 - 30-01-2022_233756[/COLOR]
    nomEntr = Split(Split(Fichier, ".")(0), " - ")(1)
[COLOR=rgb(184, 49, 47)]'attribue à nomEntr le nom de l'entreprise[/COLOR]
    For Each shSource In wbSource.Worksheets
[COLOR=rgb(184, 49, 47)]'pour chaque feuille du fichier client actuellement ouvert[/COLOR]
      If shSource.Name <> "IMPORTANT" Then
[COLOR=rgb(184, 49, 47)]'si le nom de la feuille est différent de IMPORTANT alors[/COLOR]
        With shSource
[COLOR=rgb(184, 49, 47)]'avec la feuille actuelle, j'ai du mal à comprendre la différence d'utilisation du With vs For...Then ?[/COLOR]
          nomSerie = .Name
[COLOR=rgb(184, 49, 47)]'.Name enregistre le nom de la feuille actuelle pour le réutiliser dans le fichier wbSource, mais il enregistre une multitude de données qui sont réutilisé après ? Je ne comprend pas le fonctionnement vu que nomSerie n'est utilisé qu'après la fin de la boucle With ?[/COLOR]
          dl = .Cells(Rows.Count, 1).End(xlUp).Row
[COLOR=rgb(184, 49, 47)]'attribue à dl un chiffre correspondant à la dernière ligne contenant des données, par exemple 10 pour l'onglet Série_a, dl est l'abréviation de quoi ? [/COLOR]
          tb = .Range("C4:F" & dl).Value2
[COLOR=rgb(184, 49, 47)]'attribue à tb les valeurs contenue dans la plage de donnée C4:F + dernière ligne avec des données, par exemple C4:F10 dans la feuille Série_a[/COLOR]
        End With
[COLOR=rgb(184, 49, 47)]'fin de la boucle With[/COLOR]
        Set shCible = wbCible.Sheets(nomSerie)
[COLOR=rgb(184, 49, 47)]'attribue la référence du nom de la feuille du fichier wbSource pour travailler sur la même dans le fichier wbCible[/COLOR]
        With shCible
[COLOR=rgb(184, 49, 47)]'avec la feuille actuelle du fichier wbCible[/COLOR]
          dl = .Cells(Rows.Count, 1).End(xlUp).Row
[COLOR=rgb(184, 49, 47)]'même choqe que précédemment[/COLOR]
          dc = .Cells(2, Columns.Count).End(xlToLeft).Column
[COLOR=rgb(184, 49, 47)]'similaire à dl j'imagine mais pourquoi .Cells au lieu de .Range ?[/COLOR]
          Set rng = .Range("A4:A" & dl).Find(what:=nomEntr, LookAt:=xlWhole)
[COLOR=rgb(184, 49, 47)]'recherche la cellule ou se trouve l'entreprise recherchée et l'attribue à rng, j'aurai souhaité que la colonne A soit vide et qu'elle se remplisse du nom d'une entreprise si un fichier est présent dans le dossier fichier client. Sinon il faut rajouter le nom de l'entreprise manuellement à chaque fois que l'on rajoute un fichier client d'un nouveau client...[/COLOR]
          If Not rng Is Nothing Then nl = rng.Row
[COLOR=rgb(184, 49, 47)]'si rng n'est pas"rien" alors attribue à nl le numéro de la ligne ou se trouve l'entreprise[/COLOR]
          For i = 1 To UBound(tb)
[COLOR=rgb(184, 49, 47)]'boucle de i = 1 à UBound(tb) c'est à dire le nombre de ligne dans la plage de données de tb, mais ce nombre de ligne équivaut à dl non ?, je pensais que tb contenait les valeurs des cellules et non leur plage ? [/COLOR]
            Set rng = .Range(.Cells(2, 2), .Cells(2, dc)).Find(what:=tb(i, 1), LookAt:=xlWhole)
[COLOR=rgb(184, 49, 47)]'la j'avoue je comprend pas, .Cell(2, 2) cherche une valeur dans quoi ?[/COLOR]
            If Not rng Is Nothing Then
[COLOR=rgb(184, 49, 47)]'idem que précédent[/COLOR]
              nc = rng.Column
[COLOR=rgb(184, 49, 47)]'attribue à nc le numéro de colonne ou se trouve ???[/COLOR]
            Else
[COLOR=rgb(184, 49, 47)]'autrement[/COLOR]
              msg = msg & nomEntr & ", " & nomSerie & ", " & tb(i, 1) & "|"
[COLOR=rgb(184, 49, 47)]'msg = msg ??? msg à juste était défini, il n'a rien d'attribué, quel est l'intérêt de msg ?[/COLOR]
              MsgBox "Les colonnes """ & tb(i, 1) & _
                """ de la série """ & nomSerie & """ du client """ & nomEntr & """ n'existent pas"
[COLOR=rgb(184, 49, 47)]'pourquoi 3 " après colonnes ?[/COLOR]
            End If
[COLOR=rgb(184, 49, 47)]'fin de la boucle If[/COLOR]
            For j = 0 To 2: .Cells(nl, nc + j) = tb(i, j + 2): Next
[COLOR=rgb(184, 49, 47)]'c'est la que le code plante actuellement, je ne comprend d'ailleurs pas trop ce que cette ligne fait[/COLOR]
          Next i
[COLOR=rgb(184, 49, 47)]'on passe au i suivant[/COLOR]
        End With
[COLOR=rgb(184, 49, 47)]'fin de la boucle With[/COLOR]
      End If
[COLOR=rgb(184, 49, 47)]'fin de la boucle If[/COLOR]
    Next shSource
[COLOR=rgb(184, 49, 47)]'on passe à la feuille suivante[/COLOR]
    wbSource.Close
[COLOR=rgb(184, 49, 47)]'on referme le fichier client[/COLOR]
    Fichier = Dir
[COLOR=rgb(184, 49, 47)]'à quoi cela sert ?[/COLOR]
  Loop
[COLOR=rgb(184, 49, 47)]'boucle tant que Fichier n'est pas vide[/COLOR]
 
'******* Ajouté pour le contrôle des colonnes à supprimer pour la suite **********
  Sheets("tmp").Cells.Clear
  msg = Split(msg, "|")
  Sheets("tmp").Cells(1, 1).Resize(UBound(msg) + 1) = Application.Transpose(msg)
'**********************************************************************************
 
  wbCible.Save
[COLOR=rgb(184, 49, 47)]'sauvegarde le fichier wbCible[/COLOR]
 
Application.DisplayAlerts = True
[COLOR=rgb(184, 49, 47)]'ré autorise les alertes[/COLOR]
Application.ScreenUpdating = True
[COLOR=rgb(184, 49, 47)]'ré affiche l'action à l'écran[/COLOR]
End Sub
 

Pièces jointes

  • fichier_client - entreprise_3.xlsx
    18.6 KB · Affichages: 8
  • fichier_client - entreprise_2.xlsx
    18.6 KB · Affichages: 7
  • fichier_client - entreprise_1.xlsx
    18.7 KB · Affichages: 8
  • fichier_agrégateur v1.xlsm
    30.7 KB · Affichages: 4

yal

XLDnaute Occasionnel
Voici la nouvelle version
On part d'un classeur vide que l'on construit en fonction des fichiers clients
Les feuilles "série_x" s'ajoute au fur et à mesure qu'elles sont découvertes. Idem pour les modèles et pareils pour les entreprises.
On ne touche pas au fichier agrégateur de base
Jai laissé le module que tu avais commenté en y ajoutant mes précisions. Il ne sert à rien et peut être supprimé sans problème.
 

Pièces jointes

  • fichier_agrégateur v3.xlsm
    33.3 KB · Affichages: 6

Lightanon

XLDnaute Nouveau
Voici la nouvelle version
On part d'un classeur vide que l'on construit en fonction des fichiers clients
Les feuilles "série_x" s'ajoute au fur et à mesure qu'elles sont découvertes. Idem pour les modèles et pareils pour les entreprises.
On ne touche pas au fichier agrégateur de base
Jai laissé le module que tu avais commenté en y ajoutant mes précisions. Il ne sert à rien et peut être supprimé sans problème.
Génial ! Encore merci ! J'apprécie beaucoup les commentaires dans le code, j’apprends plus vite comme ça.

J'ai une petite erreur dans l’exécution du VBA, le dernier modèle de chaque série se répète deux fois. Pour l'entreprise 1 et 3 c'est le dernier qui est en trop, mais pour la 2 c'est l'avant dernier (en mettant des données sur les 3 derniers modèles dans chaque fichiers clients ont s'en rend compte. Bizarre...

Mis à part ça c'est nickel, j'ai juste remplacé Date par Now pour avoir la date ET l'heure (imaginons qu'un client envoi son fichier en début de journée et un autre en fin...) et j'ai rajouté un Replace pour le formatage.

VB:
dt = Replace(Replace(Now, "/", "-"), ":", "")

Cependant pour aller plus loin serait-il possible de :
  • Générer à la suite de la liste des entreprises et de leur précommandes 5 lignes (exemple dans le fichier joint dans la feuille "Série_a") ?
    • Total : calcul le total vert, puis bleu, puis rouge
    • Total références : calcul le total peut importe la couleur pour chaque modèles
    • Commande usine : c'est elle qui me parait la plus difficile. Il s'agit du stock que l'on à fabriqué pour vendre. Cependant c'est une donnée qui n'est pas dans le fichier client et qui ne peut y être. Serait-il possible d'avoir un onglet sur le fichier agrégateur original avec une liste d'entreprise et en face cette quantité rentrée manuellement, le VBA regarderait si l'entreprise est présente dans la liste et au quel cas ajouterait la quantité, sinon continuerait en laissant la case vide ?
    • Restes : commande usine - total références
    • Total rouge : calcul la quantité total de rouge sur l'ensemble de la série
  • Générer un graphique comme dans le fichier ci-joint (feuille "Série_a") ? Peut-être impossible avec toutes les manips que ça implique...
  • Générer un onglet avec la liste de toutes les entreprises et en face la date du fichier ? Ce qui m'embête c'est que j'imagine que la date des fichiers clients change à chaque fois que l'ont lance le VBA puisque celui-ci ouvre et ferme les fichiers clients... J'aimerai avoir un moyen de voir d'un coups d’œil de quand date la précommande du client, as-tu une idée ?
  • Éventuellement cacher ou supprimer la feuille information puisque le bouton devient inutile une fois le fichier agrégé...
Je ne veux pas abuser de ton temps, fais ce que tu peux.
 

Pièces jointes

  • fichier_agrégateur v3 - 31-01-2022.xlsm
    53.7 KB · Affichages: 5
  • fichier_agrégateur v3 modifiée.xlsm
    36.2 KB · Affichages: 2

yal

XLDnaute Occasionnel
La version corrigée et légèrement augmentée. Le problème de la double création des modèles est résolue.
Pour ce qui est des dates de fichier, Le programme se contentant d'ouvrir et fermer le classeur celui ci n'est pas modifié donc la date reste la même. Je l'ai placée sur la feuille information. Le bouton et le code associé est également supprimé. En attendant la suite…
PS
J'ai intégré quelques lignes pour générer des valeurs aléatoires des les tableaux pour les test. Il suffit de supprimer les quelques lignes encadrées
 

Pièces jointes

  • fichier_agrégateur v5.xlsm
    26 KB · Affichages: 1

Lightanon

XLDnaute Nouveau
La version corrigée et légèrement augmentée. Le problème de la double création des modèles est résolue.
Pour ce qui est des dates de fichier, Le programme se contentant d'ouvrir et fermer le classeur celui ci n'est pas modifié donc la date reste la même. Je l'ai placée sur la feuille information. Le bouton et le code associé est également supprimé. En attendant la suite…
PS
J'ai intégré quelques lignes pour générer des valeurs aléatoires des les tableaux pour les test. Il suffit de supprimer les quelques lignes encadrées
Super merci beaucoup.

Qu'est-ce qui causait le problème de double création ?

J'ai commenté le code ci dessous :

VB:
Option Explicit

Sub Complements()
  Dim wb As Workbook
  Dim sh As Worksheet
  Dim rng As Range
  Dim tb(), tb2()
  Dim dl%, dc%, i%, j%
  Dim lignesTitres()
  Dim modele$
 
  lignesTitres = Array("Total", "Total références", "Commande usine", "Restes", "Décodeurs")
 
  Set wb = ThisWorkbook
  For Each sh In wb.Worksheets
    If sh.Name <> "Information" And sh.Name <> "Quantités usine" Then
      With sh
        dl = .Cells(Rows.Count, 1).End(xlUp).Row
        'dl = dernière ligne
        dc = .Cells(3, .Columns.Count).End(xlToLeft).Column
        'dc = dernière colonne
        tb = .Range(.Cells(4, 2), .Cells(dl, dc)).Value2
        'tb = plage de données B4: (bord inférieur droit...)
        dl = dl + 2
        'tb+2 pour avoir une ligne séparatrice
        .Range(.Cells(dl, 1), .Cells(dl + 4, 1)) = Application.Transpose(lignesTitres)
        'renvoi l'array lignesTitres qui est horizontal en vertical dans le tableur
        For i = 1 To UBound(tb, 2)
        'j'essaye de comprendre les Array utilisé par UBound, donc tb en Array c'est Array(4 To dl,2 To dc)
        'donc i ira de 1 à dc si je comprend bien
          .Cells(dl, i + 1) = Application.Sum(Application.Index(tb, 0, i))
          'J'ai besoin d'explication ici. Je crois comprendre qu'ici se fait la somme vert, bleu, rouge (ligne "Total"), comment cela fonctionne ?
          'Index(tb, 0, i) j'ai du mal à comprendre à cause du 0, cela renvoi la ligne entière, mais laquelle ?!
          .Cells(dl, i + 1).BorderAround ColorIndex:=1, Weight:=2 ' Encadre la cellule
          
        Next i
        
        For i = 1 To UBound(tb, 2) Step 3
        'le Step 3 permet de sauter les colonnes qui seront fusionnaient je suppose
          tb2 = Application.Index(tb, Evaluate("Row(1" & ":" & UBound(tb) & ")"), Application.Transpose(Evaluate("Row(" & i & ":" & i + 2 & ")")))
          'je crois comprend très très grossièrement l'idée, j'ai compris le rôle de Evaluate mais j'aimerai bien une description de la ligne là
          .Cells(dl + 1, i + 1) = Application.Sum(tb2)
          'Pourquoi ici tb2 et pas Index(tb2, etc) ?
          modele = .Cells(2, i + 1)
          Set rng = Sheets("Quantités usine").Range("A:A").Find(what:=modele, LookAt:=xlWhole)
          If Not rng Is Nothing Then
            .Cells(dl + 2, i + 1) = rng.Offset(0, 1).Value
          Else
            .Cells(dl + 2, i + 1) = 0
          End If
          .Cells(dl + 3, i + 1) = .Cells(dl + 2, i + 1) - .Cells(dl + 1, i + 1)
          'calcul de "Restes"
          With .Range(.Cells(dl + 1, i + 1), .Cells(dl + 1, i + 3))
            .Merge ' Fusionne les cellules du nom modèle
            .BorderAround ColorIndex:=1, Weight:=2 ' Encadre la cellule
            .HorizontalAlignment = xlHAlignCenter ' Centre le texte
          End With
          
          With .Range(.Cells(dl + 2, i + 1), .Cells(dl + 2, i + 3))
            .Merge ' Fusionne les cellules du nom modèle
            .BorderAround ColorIndex:=1, Weight:=2 ' Encadre la cellule
            .HorizontalAlignment = xlHAlignCenter ' Centre le texte
          End With
            
          With .Range(.Cells(dl + 3, i + 1), .Cells(dl + 3, i + 3))
            .Merge ' Fusionne les cellules du nom modèle
            .BorderAround ColorIndex:=1, Weight:=2 ' Encadre la cellule
            .HorizontalAlignment = xlHAlignCenter ' Centre le texte
          End With
        Next i
        
        .Cells(dl + 4, 2) = Application.Sum(.Range(.Cells(dl + 1, 2), .Cells(dl + 1, dc)))
        'calcul "Décodeurs", cependant je ne voulais pas la somme totale vert+bleu+rouge mais la somme de tous les rouges. "rouge" est en fait "Décodeur", j'ai oublié de le changer.
        'du coups il faut faire une sommes avec un pas de 3
        With .Range(.Cells(dl + 4, 2), .Cells(dl + 4, dc))
          .Merge ' Fusionne les cellules du nom modèle
          .BorderAround ColorIndex:=1, Weight:=2 ' Encadre la cellule
          .HorizontalAlignment = xlHAlignCenter ' Centre le texte
        End With
        
      End With
    End If
    sh.Columns.AutoFit
  Next sh
 
  For Each sh In Worksheets
    sh.Activate
    ActiveWindow.DisplayGridlines = False
  Next sh
 
End Sub

On est extrêmement proche du fichier idéal que je souhaite !

Petite erreur qui est de ma faute : le calcul de la ligne "Décodeurs" ne doit pas calculer la somme de toutes les couleurs mais juste des rouges (j'ai oublié de changer "Décodeur" en "rouge"...).

J'ai une question : les fichiers clients seront envoyé à des clients... il leur sera bien indiqué de ne pas modifier le nom du fichier... mais bon le suivi des règles.... Le code VBA est-il obligé pour se repérer de se référer au nom de l'entreprise qui est dans le nom de chaque fichier ou peut-il le prendre en cellule B1 à l'intérieur des fichiers ? Tout le fichier sera bloqué à la modification, c'est impossible pour les noms de fichiers ... J'essaye d'anticiper au maximum les erreurs humaines qui mèneraient au dysfonctionnement du code... Si cela est impossible je serais juste plus vigilant !

Il ne manque plus que les graphiques.

Les graphiques c'est quelque chose qui peut-être généré en VBA ? Je chercherai de mon côté si c'est trop chronophage ne perds pas trop ton temps la dessus non plus...

Je vais faire un test "grandeur nature" avec des vrais données et essayer de créer des scénarios possible pour voir la robustesse du code, je te redis cela au plus vite.
 

yal

XLDnaute Occasionnel
Voilà je crois que cette fois tout y est.
Pour les graphiques je pense qu'avec l'enregistreur de macro tu pourra trouver les paramètre pour les personnaliser à ta sauce.
 

Pièces jointes

  • fichier_agrégateur v6.xlsm
    42.3 KB · Affichages: 17

Discussions similaires