0

J'ai une table avec des parties comme suit;Retour des noms de colonne s'il y a correspondance dans la ligne, recherche de plusieurs correspondances

--------------- 
| Part number | 
--------------- 
| 123456  | 
| 16D345  | 
| 16E099  | 
| 490586  | 
| 970884  | 
--------------- 

Et un autre comme ça;

--------------------------------------------------- 
| Part number | 940822 | 940922 | 170345 | 940222 | 
--------------------------------------------------- 
| 123456  | X |  | X | X | 
| 16D345  | X |  | X |  | 
| 16E099  |  | X |  | X | 
| 490586  | X |  | X | X | 
| 970884  |  |  | X |  | 
--------------------------------------------------- 

Les chiffres dans les colonnes de la deuxième table sont des «unités».
J'essaie de trouver comment obtenir tous les numéros d'unités où une partie a X. Fondamentalement, je veux finir avec ce qui suit;

---------------------------------------- 
| Part number | Used in    | 
---------------------------------------- 
| 123456  | 940822, 170345, 940222 | 
| 16D345  | 940822, 170345   | 
| 16E099  | 940922, 940222   | 
| 490586  | 940822, 170345, 940222 | 
| 970884  | 170345     | 
---------------------------------------- 

Maintenant, je viens récemment appris comment utiliser INDEX et MATCH mais n'ont pas été en mesure d'obtenir le résultat que je veux. J'ai essayé d'utiliser des formules matricielles mais je ne les comprends pas encore.

Répondre

2

Si vous avez un abonnement à Office 365 Excel vous pouvez utiliser la formule de tableau suivant:

=TEXTJOIN(", ",TRUE,IF(($E$2:$H$6 = "X")*($D$2:$D$6=A2),$E$1:$H$1,"")) 

Être une formule de tableau, il doit être confirmé avec Ctrl-Maj-Entrée au lieu de Enter lors de la sortie modifier mode. Si c'est fait correctement, Excel mettra {} autour de la formule.

enter image description here


Si vous n'avez alors pas Office 365, vous pouvez mettre ce code dans un module attaché au classeur et utiliser la formule comme décrit ci-dessus:

Function TEXTJOIN(delim As String, skipblank As Boolean, arr) 
    Dim d As Long 
    Dim c As Long 
    Dim arr2() 
    Dim t As Long, y As Long 
    t = -1 
    y = -1 
    If TypeName(arr) = "Range" Then 
     arr2 = arr.Value 
    Else 
     arr2 = arr 
    End If 
    On Error Resume Next 
    t = UBound(arr2, 2) 
    y = UBound(arr2, 1) 
    On Error GoTo 0 

    If t >= 0 And y >= 0 Then 
     For c = LBound(arr2, 1) To UBound(arr2, 1) 
      For d = LBound(arr2, 1) To UBound(arr2, 2) 
       If arr2(c, d) <> "" Or Not skipblank Then 
        TEXTJOIN = TEXTJOIN & arr2(c, d) & delim 
       End If 
      Next d 
     Next c 
    Else 
     For c = LBound(arr2) To UBound(arr2) 
      If arr2(c) <> "" Or Not skipblank Then 
       TEXTJOIN = TEXTJOIN & arr2(c) & delim 
      End If 
     Next c 
    End If 
    TEXTJOIN = Left(TEXTJOIN, Len(TEXTJOIN) - Len(delim)) 
End Function 
+1

Désolé mais j'avais à Mjölnir celui-ci. – Jeeped

+0

@Jeeped NP, ne pouvait pas trouver celui qui correspond. Le tien est parfait. –

+0

btw, J'ai récemment créé une balise [textjoin] (http://stackoverflow.com/questions/tagged/textjoin) qui peut être utilisée pour trouver des Q & A sur la concaténation de chaînes. Il pourrait même être dû pour une mise à jour de ses informations. – Jeeped