Rechercher la présence d'une valeur issue d'une liste, dans un champs
Bonjour,
Je galère depuis un bon moment sur la possibilité de résoudre un besoin via excel.
Je vais essayer de l'exprimer clairement :
J'ai dans une colonne A des milliers de lignes, qui sont une chaîne de caractère issus d'une concaténation d'autres valeurs.
Soit ma listeA
J'ai dans des colonnes B, C, D qui sont justement des valeurs qui on servi pour cette concaténation (entre 20 et 500 lignes pour chacune)
Soit mes ListeB, ListeC, ListeD
La liste A contient donc des milliers de lignes sur ce format:
xxx_ListeBValeur3_xxx_ListeCValeur1_ListeDValeur50_xxx
xxx_ListeBValeur7_ListeDValeur33_xxx
xxx_xxx_xxx
xxxxxxxxxxx
ListeCValeur30_ListeBValeur1
Cette liste n'a donc pas de convention claire, elle contient parfois des éléments des listes B,C,D parfois pas.
Je cherche une formule qui me permettrait de "trouver" si la liste A contient ou non les éléments des listes B,C,D
Et idéalement, un peu comme un recherchev, populer 3 nouvelles colonnes E,F,G qui affiche la valeur trouvé ou non issue des listes B,C,D.
L'objectif derrière est de reconstituer une base de donnée de-concaténée, et d'identifier les chaines de caractères mal concaténées pour correction.
Quelqu'un à une idée ?
Merci !
Bonjour,
une proposition (à adapter à ton fichier probablement)
Sub aargh()
'macro qui vérifie dans les cellules de la colonne A, la présence de mots séparés
'par le caractère _ dans des listes de mots en colonne B,C et D
Dim r, rg(1 To 3) As Range
With Sheets("sheet1") '<- à adapter
dl = .Cells(Rows.Count, 1).End(xlUp).Row
t = .Cells(1, 1).Resize(dl, 1)
For k = 1 To 3
dll = .Cells(Rows.Count, k + 1).End(xlUp).Row
Set rg(k) = .Cells(2, k + 1).Resize(dll - 1, 1)
Next k
ReDim r(1 To dl, 1 To 4)
For i = 2 To dl
s = Split(t(i, 1) & "_", "_")
For j = LBound(s) To UBound(s)
If s(j) <> "" Then
For k = 1 To 3
Set re = rg(k).Find(s(j), lookat:=xlPart, MatchCase:=False)
If re Is Nothing Then
nt = s(j)
Else
r(i, k) = r(i, k) & vbCrLf & s(j)
nt = ""
Exit For
End If
Next k
If nt <> "" Then r(i, 4) = r(i, 4) & vbCrLf & nt
End If
Next j
Next i
.Cells(1, 5).Resize(dl, 4) = r
End With
End Sub