2 votes

Excel - renvoie plusieurs valeurs pour chacune d'une liste de valeurs

Cela fait maintenant quelques heures que j'essaie de résoudre ce problème, mais sans résultat...

Mon installation :

  • J'ai des feuilles excel de recettes de produits cosmétiques .

  • Chaque recette contient des dizaines d'ingrédients, chacun donné par son nom commercial .

  • J'ai une longue liste traduisant chaque nom commercial à son nom "scientifique .

Je dois traduire chaque nom commercial en son équivalent scientifique. Cette partie est très facile à réaliser avec un vlookup.

Mais certains les noms commerciaux son recettes en soi, contenant plusieurs ingrédients dans le tableau des noms scientifiques . Il ne s'agit donc pas d'une relation 1:1, mais parfois (pas toujours) d'une relation 1:plusieurs.

Par exemple :

Fiche cosmétique A

 IngredientA_trade_name

 IngredientB_trade_name

 IngredientC_trade_name

Commerce vers le fichier maître de la liste des noms scientifiques :

 IngredientA_trade_name     Science1
 IngredientB_trade_name     Science2
 IngredientB_trade_name     Science3
 IngredientB_trade_name     Science4    
 IngredientC_trade_name     Science5
 IngredientC_trade_name     Science6

 ....etc, for lots and lots of ingredients.

J'ai trouvé des moyens de renvoyer plusieurs valeurs, mais aucun d'entre eux ne fait le travail automatiquement :

Je dois mettre le Ingrédient dans une cellule, puis placez la formule dans la cellule voisine et faites-la glisser vers le bas à quelques endroits pour qu'elle se remplisse automatiquement de toutes les correspondances possibles. D'autres solutions placent les valeurs de retour dans une seule cellule (Science2,Science3,Science4), ce qui est un peu mieux, mais ne fonctionne pas pour le reste de mon flux de travail...

Existe-t-il un moyen de parcourir la liste des noms commerciaux et d'insérer, si nécessaire, des lignes contenant tous les noms scientifiques ?

1voto

jcbermu Points 16624

Cette macro utilisant VBA fera l'affaire :

Public Sub ingredients()
    Dim wkb As Workbook
    Dim wks, wks1 As Worksheet
    Set wkb = ThisWorkbook
    Set wks = ActiveSheet
    wks.Application.ScreenUpdating = False
    mastername = "Master"
    totalsheets = wkb.Worksheets.Count
    For i = 1 To totalsheets
        Set wks1 = wkb.Worksheets(i)
        wks1name = wks1.Name
        If wks1name = mastername Then
            i = totalsheets
        Else
            Set wks1 = Nothing
        End If
    Next i
    reviewing = True
    activerow = 1
    While reviewing
        tradename = wks.Cells(activerow, 1)
        If tradename = "" Then
            reviewing = False
        End If
        reviewingmaster = True
        activerowmaster = 1
        found = 0
        While reviewingmaster
            sciname = wks1.Cells(activerowmaster, 1)
            If sciname = "" Then
                reviewingmaster = False
            End If
            If sciname = tradename Then
                found = found + 1
                If found > 1 Then
                    activerow = activerow + 1
                    wks.Rows(activerow).Insert
                End If
                wks.Cells(activerow, 2) = wks1.Cells(activerowmaster, 2)
                wks.Cells(activerow, 3) = wks1.Cells(activerowmaster, 3)
            End If
            activerowmaster = activerowmaster + 1
        Wend
        activerow = activerow + 1
    Wend
    wks.Application.ScreenUpdating = True
    theend = MsgBox("Finished on " & wks.Name, vbInformation)
End Sub

Vous devez ouvrir Macros /VBA, insérer un module sous le nom de Ce manuel de travail et collez le code sur le côté droit.

Gardez à l'esprit ces éléments :

  • Le code s'exécute sur la feuille de calcul active.
  • Chaque nouveau nom scientifique, en plus du premier pour un nom commercial, est ajouté dans une nouvelle ligne.
  • Le code est prêt à fonctionner tant qu'il n'y a pas de cellules vides dans la colonne A des feuilles de calcul.
  • Comme cela suppose que le nom de la feuille de calcul de la liste principale est Maître vous devez modifier la ligne mastername="Master" au nom approprié.
  • La définition de 500 noms commerciaux et 5000 noms scientifiques lui a pris 23 secondes.

1voto

Mike Honey Points 2452

Pour Excel 2010 ou 2013, j'utiliserais le complément Power Query pour cela. A partir d'Excel 2016, Power Query est intégré dans le ruban Données sous la section "Obtenir et transformer".

Power Query peut démarrer à partir d'un tableau Excel. Il dispose d'une commande de fusion qui permet de réunir des requêtes, avec la possibilité de ne conserver que les correspondances. Le résultat d'une requête peut être écrit dans un tableau Excel.

La conception de vos besoins prendrait quelques minutes dans Power Query, sans qu'aucun code ne soit nécessaire.

...

J'ai été inspiré par certains commentaires utiles pour développer cette réponse. En fait, j'ai construit une solution fonctionnelle que vous pouvez télécharger depuis mon OneDrive et essayer :

http://1drv.ms/1AzPAZp

C'est le dossier : Démonstration de Power Query - renvoyer plusieurs valeurs pour chacune d'une liste de valeurs

Il m'a fallu moins de 2 minutes pour le construire (sans compter la copie des données d'entrée et l'écriture de la fiche Lisez-moi), et il n'a nécessité aucun code/fonction.

La technique clé est la fusion et l'expansion, comme décrit ici :

https://support.office.com/en-us/article/Merge-queries-Power-Query-fd157620-5470-4c0f-b132-7ca2616d17f9

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X