Compilation de données

j_ose

XLDnaute Nouveau
Bonsoir à tous,

je suis désolé mais étant nouveau je ne savais pas comment renseigné le titre de mon post.

Je suis en train de travailler sur la mise en place d’un tableau sur les allergènes. Je travaille sur un tableau Excel, dans une feuille (Base) j’ai identifié toute les recettes ainsi que l’ingrédient qui la compose. A cela j’ai identifié par un « oui « les ingrédients contenant un allergène.
Je souhaiterai avoir dans une deuxième feuille juste le nom de la recette ainsi que les allergènes qu’elle contient.
J’ai essayé avec un TCD mais le résultat n’est pas celui souhaité. Je pensai à une formule mais je ne sais pas comment mis prendre.
Je joins à mon message un petit fichier d’exemple pour illustré ma demande.
Merci d’avance pour votre aide, J’espère également que ce tableau pourra aider d’autre personne dans mon cas.

Bonne soirée
 

Pièces jointes

  • Allergenes.xlsx
    21.9 KB · Affichages: 510

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Compilation de données

Bonsoir j_ose et bienvenue sur XLD :)

Un essai par macro. La mise à jour du tableau de la feuille Tab se produit à l’ouverture du fichier et à chaque fois qu'on active la feuille Tab.

Le code principal est dans module1. Il y a du code dans le module de la feuille Tab qui lance la compilation quand on active la feuille.

Code du module1:
VB:
Sub CompilAllergenes()
Dim derlig&, dercol&, tablo, i&, j&, nlig&

  Application.ScreenUpdating = False
  tablo = Sheets("Base").Range("d1").CurrentRegion.Value
  
  With Sheets("Tab")
    .Range("c1").CurrentRegion.Clear
    
    For i = 1 To 2
      For j = 1 To UBound(tablo, 2)
        .Cells(i, j) = tablo(i, j)
      Next j
    Next i
    
    nlig = 2
    For i = 3 To UBound(tablo)
      If tablo(i, 1) <> "" Then
        nlig = nlig + 1
        .Cells(nlig, 1) = tablo(i, 1)
      End If
      For j = 3 To UBound(tablo, 2)
        If Len(Trim(tablo(i, j))) > 0 Then .Cells(nlig, j) = tablo(i, j)
      Next j
    Next i
    .Columns(2).Delete
    .Range("c1").CurrentRegion.Borders.LineStyle = xlContinuous
    .Range("c1").CurrentRegion.VerticalAlignment = xlCenter
    .Range("c1").CurrentRegion.HorizontalAlignment = xlCenter
    .Range("c1").CurrentRegion.WrapText = True
    .Range("c1").CurrentRegion.EntireColumn.ColumnWidth = 12
  End With
  
End Sub
 

Pièces jointes

  • j_ose-Allergenes-v1.xlsm
    30.8 KB · Affichages: 141

FROLLINDE

XLDnaute Occasionnel
Re : Compilation de données

Bonsoir J_ose...

Joli problème,

Une solution avec des fonctions somme.si(), des Equiv() des Adresse() et des Indirect() et une conversion dans des colonnes à masquer des OUI en 1.

Je n'ai pas trouvé la fonctions faisplussimple() ;)

François,
 

Pièces jointes

  • Allergenes V2.xlsx
    26.7 KB · Affichages: 110

j_ose

XLDnaute Nouveau
Re : Compilation de données

Bonjour ma pomme, bonjour FROLLINDE , bonjour à tous,

Merci pour votre accueil merci également à vous deux pour vos réponses que je vais tester.
Deux approches différentes mais très intéressantes.
Je me permettrais de revenir vers vous, en plus des allergènes, je souhaiterais faire apparaître les traces d’allergènes. Je pense le faire sur une autre feuille.

Merci encore et bon week end.

Ps : si vous êtes comme moi allergique n’hésitez pas à utiliser ce tableau je serai heureux de le partager.
 

j_ose

XLDnaute Nouveau
Re : Compilation de données

Bonsoir mapomme,

Je reviens vers vous, j’ai adopté votre solution qui fonctionne très bien. Apres avoir saisie l’ensemble des données, ingrédients et leurs allergènes j'ai voulu ajouter une colonne famille, pour faire un filtrage par famille et cela a décalé le résultat . :( . N’étant pas très à l'aise avec le code, je peux vous demander de jeter un coup d'œil et éventuellement de m'expliquer les modifications afin de les comprendre.

Merci

Bonne soirée
 

Pièces jointes

  • j_ose-Allergenes-v2.xlsm
    32.7 KB · Affichages: 95

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Compilation de données

Bonsoir j_ose :)

(...) j'ai voulu ajouter une colonne famille, pour faire un filtrage par famille et cela a décalé le résultat (...) N’étant pas très à l'aise avec le code, je peux vous demander de jeter un coup d'œil et éventuellement de m'expliquer les modifications afin de les comprendre. (...)
.

  • changement de méthode. On passe par un tableau "res" intermédiaire en mémoire.
  • la notion de "trace" a été rajoutée
  • le tableau final comporte une mise en couleur (rouge -> "oui" ; orange -> "trace')
  • la colonne C rapporte le bilan de la ligne (au moins un oui -> oui ; ligne vide -> ok ; sinon trace)
  • un filtre automatique pour faire des recherches dans le tableau final
  • des commentaires pour agrémenter le code :D

Si vous désirez des explications supplémentaires, le demander :confused:

Avertissement ! les données du fichier joint ont été modifiées. Les indications sur les allergènes ne sont donc pas à prendre en considération.


Le code:
VB:
Sub CompilAllergenes()
Dim derlig&, dercol&, i&, j&, nlig&
Dim base, res(), Famille$, Coul$

  Application.ScreenUpdating = False
  'lecture du tableau base
  base = Sheets("Base").Range("d1").CurrentRegion.Value
  ' tableau résultat, même dimension que le tableau base
  ReDim res(1 To UBound(base, 1), 1 To UBound(base, 2))
  
  With Sheets("Tab")
    ' effacement du tableau de la feuille "Tab"
    .Range("d1").CurrentRegion.Clear
    
    ' écriture des deux lignes d'en-tête de base
    ' dans le tableau res
    For i = 1 To 2
      For j = 1 To UBound(base, 2)
        res(i, j) = base(i, j)
      Next j
    Next i
    
    'traitement des lignes d'ingrédients des recettes et familles
    nlig = 2
    For i = 3 To UBound(base)
      ' une nouvelle famille ->
      ' on la stocke dans la variable Famille
      If base(i, 1) <> "" Then Famille = base(i, 1)
      ' une nouvelle recette ->
      ' on incrémente la ligne du tableau res
      ' on inscrit dans la première colonne de res , la famille
      ' on inscrit dans la seconde colonne de res , la recette
      If base(i, 2) <> "" Then
        nlig = nlig + 1
        res(nlig, 1) = Famille
        res(nlig, 2) = base(i, 2)
      End If
      ' pour l'ingrédient de base en cours,
      ' on boucle sur les colonnes des allergènes
      For j = 4 To UBound(base, 2)
        ' si l'élément de base n'est pas vide
        If Len(Trim(base(i, j))) > 0 Then
          ' on regarde si le résultat est déjà égal à "oui"
          ' si vrai on ne fait rien car l'allergène de la colonne
          ' a déjà été indentifié comme étant présent pour un précédent ingrédient
          ' si faux, on écrase la valeur de res(i,j) par la valeur de base(i,j)
          ' autrement dit, si res(i,j) est vide ou égal à "trace" (<> "oui")
          ' on écrase cette valeur par la valeur de base(i,j) qui est soit "oui"
          ' soit "trace"
          ' ou encore, si res(i,j) est déjà égal à "oui", on conserve cette valeur
          If res(nlig, j) <> "oui" Then res(nlig, j) = base(i, j)
        End If
      Next j
    Next i
    
    ' écriture du tableau res sur la feuille "Tab"
    .Range("a1").Resize(UBound(res, 1), UBound(res, 2)) = res
    ' formatage du résultat
    .Range("c1").CurrentRegion.Borders.LineStyle = xlContinuous
    .Range("c1").CurrentRegion.VerticalAlignment = xlCenter
    .Range("c1").CurrentRegion.HorizontalAlignment = xlCenter
    .Range("c1").CurrentRegion.WrapText = True
    .Range("c1").CurrentRegion.EntireColumn.ColumnWidth = 12
    ' mise en couleur : "oui" = rouge, "trace" = orange
    For i = 3 To nlig
      ' coul va stocker le bilan de la ligne i
      Coul = ""
      ' boucle sur les allergènes de la ligne
      For j = 4 To UBound(res, 2)
        Select Case res(i, j)
          Case "oui"
            ' c'est un allergène, mise en couleur rouge de la cellule
            .Cells(i, j).Interior.Color = RGB(255, 64, 28)
            Coul = "oui"
            ' colonne C de la ligne, inscription de oui
            Cells(i, 3) = Coul
            ' mise en couleur de la colonne C de la ligne
            .Cells(i, 3).Interior.Color = RGB(255, 40, 20)
          Case "trace"
            ' seulement une trace, mise en couleur orange de la cellule
            .Cells(i, j).Interior.Color = RGB(255, 219, 0)
            ' sauf si le bilan de la ligne (coul) est déjà égal à oui
            If Coul <> "oui" Then
              Coul = "trace"
              ' colonne C de la ligne, inscription de trace
              Cells(i, 3) = Coul
              ' mise en couleur de la colonne C de la ligne
              .Cells(i, 3).Interior.Color = RGB(255, 167, 0)
            End If
        End Select
      Next j
      ' fin de parcours des colonnes pour la ligne i
      If Coul = "" Then
        ' coul est vide -> la recette nhje comporte ni oui ni trace
        ' mise en couleur de la colonne C de la ligne
        .Cells(i, 3).Interior.Color = RGB(0, 255, 160)
        ' colonne C de la ligne, inscription de ok
        .Cells(i, 3) = "ok"
      End If
    Next i
    .Cells(2, "c") = "BILAN"
    ' filtage automatique
    .Range(.Cells(2, "a"), .Cells(2, UBound(res, 2))).AutoFilter
  End With
End Sub
 

Pièces jointes

  • j_ose-Allergenes-v2a.xlsm
    37.6 KB · Affichages: 67
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : Compilation de données

Bonsoir à tous


j'ose introduire un peu d'endives dans la semoule euh pardon dans le code de mapomme ;)
(d’ailleurs la pomme et l’endive s'associe très bien dans un saladier avec une petite huile de noix ;) )
VB:
' formatage du résultat
With .Range("c1").CurrentRegion
.Borders.LineStyle = xlContinuous
.VerticalAlignment = xlCenter
.HorizontalAlignment = xlCenter
.WrapText = True
.EntireColumn.ColumnWidth = 12
End With
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Compilation de données

Bonsoir Staple1600 :)

(...) j'ose introduire un peu d'endives dans la semoule euh pardon dans le code de mapomme (...)
VB:
' formatage du résultat
With .Range("c1").CurrentRegion
.Borders.LineStyle = xlContinuous
.VerticalAlignment = xlCenter
.HorizontalAlignment = xlCenter
.WrapText = True
.EntireColumn.ColumnWidth = 12
End With

Effectivement, c'est plus élégant! Et l'élégance d'un code est souvent synonyme d'efficacité.

(...) (d’ailleurs la pomme et l’endive s'associe très bien dans un saladier avec une petite huile de noix (...)
Je plussois mais à une condition : la pomme doit être tranchée très très finement pour que sa saveur en bouche ne prédomine pas sur celle de l'endive (à mon goût bien sûr) :p
 

j_ose

XLDnaute Nouveau
Re : Compilation de données

Bonsoir mapomme, Bonsoir Staple1600,

Que puis-je écrire après cela…… Si des regrets de ne pas savoir écrire du VBA. :(
En bon amateur j’ai recopié le code, j’ai testé ça fonctionne, juste la couleur qui ne se met pas à jour et la colonne "bilan" qui est de couleur verte, J’ai dû me planter quelque part amis ou , je cherche je cherche :)

Si je peux me permettre d’un échange de bon procédé, je suis plus gastronomique qu’informatique. j’ai deux livres à vous proposer sur les endives.
L’endive Edition ouest France
Endives je vous aime Edition le sureau

A bientôt

Cordialement
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Compilation de données

Bonsoir j_ose, Staple1600,

(...) Si je peux me permettre d’un échange de bon procédé, je suis plus gastronomique qu’informatique. j’ai deux livres à vous proposer sur les endives. (...) L’endive Edition ouest France (...) Endives je vous aime Edition le sureau (...)

Merci pour cette bibliographie qui va m'ouvrir, c'est sûr, de nouvelles gourmandes perspectives.
 

j_ose

XLDnaute Nouveau
Re : Compilation de données

Bonsoir mapomme, Staple1600 , le forum,

Je reviens vers vous un peu honteux. J’ai créé toute les recettes dans le tableau « Bases » puis j’ai renseigné les allergènes par ingrédients. Cette double saisie a occasionné des erreurs dans le renseignement des allergènes. Je m’en suis aperçu un peu tard mais bon faire et défaire…….

Je suis reparti de zéro j’ai fait un nouveau fichier avec une feuille « ingrédients » avec tous les allergènes et les traces.

Une autre feuille « Base » avec les recettes, les ingrédients sont ajoutés par une liste déroulante, en choisissant l’ingrédient les allergènes s’affiche à l’aide d’une formule que j’ai trouvé sur le net. (un peu trop longue à mon avis)

Je souhaiterais retrouver dans la feuille « Tab » si c’est possible le même résultat que précédemment avec le code VBA. Je suis désolé de m’y prendre à plusieurs reprises, je comprendrais très bien votre agacement du a une mauvaise préparation de mes demandes.

Bonne soirée
 

Pièces jointes

  • j_ose-Allergenes-v3.xlsm
    18.1 KB · Affichages: 61

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Compilation de données

Bonsoir j_ose,

Le code du précédent fichier j_ose-Allergenes-v2a.xlsm fonctionne aussi pour votre fichier j_ose-Allergenes-v3.xlsm‎ à deux modifications près:

  • dans le fichier v3, vous avez remplacé "oui" par "Oui"
  • dans le fichier v3, vous avez remplacé "trace" par "Traces"

J'ai donc simplement remplacé dans la procédure CompilAllergenes() dans module1 tous les mots "oui" par "Oui" et tous les mots "trace" par Traces".
 

Pièces jointes

  • j_ose-Allergenes-v3a.xlsm
    31.2 KB · Affichages: 125

Discussions similaires

Réponses
9
Affichages
266

Statistiques des forums

Discussions
314 628
Messages
2 111 337
Membres
111 107
dernier inscrit
cdel