Rechercher un mot contenu dans une cellules à partir d'une colonne

Bonjour,

Dans une colonne, j'ai des nom d'articles qui sont référencés. Dans une autre colonne, à côté de chaque client, j'ai du texte; A l'intérieur de ce texte, j'ai le nom de l'article qu'ils ont achetés. Je voudrais savoir s'il existe une méthodequi puissent me dire si l'article acheté par le client est référencé ?

Merci d'avance.

Bonjour,

il faut d'abord extraire la référence du texte et puis vérifier si la référence existe.

reste à voir s'il est possible d'extraire la référence du texte. cela va dépendre du texte et de sa structure s'il y en a une.

une autre manière de faire est de vérifier s'il existe une référence qui est présente dans le texte, mais si tu as beacoup de références et beaucoup de commandes cela risque d'être lourd.

un fichier exemple représentatif et une indication des volumes de données (nombre de références, nombre de commandes )?

Voci un exemple :

19expemple-forum.xlsx (10.17 Ko)

Sur le vrai fichier, il y a 677 commandes et 7444 articles. Je ne peux pas vous donner ce dernier car il contient des documents confidentiels.

Désolé...

Bonjour,

une solution (mais qui prendra du temps pour + de 6000 références ...)

lancer la macro aargh via alt-F8

Sub aargh()
    Set wsr = Sheets("articles référence")
    dlr = wsr.Cells(Rows.Count, 1).End(xlUp).Row
    With Sheets("base de donnée")
        dl = .Cells(Rows.Count, 1).End(xlUp).Row
        Set texte = .Cells(2, "B").Resize(dl - 1)
        .Cells(2, "C").Resize(dl - 1).Clear
    End With
    For i = 1 To dlr
        Set re = texte.Find(wsr.Cells(i, 1), lookat:=xlPart, LookIn:=xlValues)
        If Not re Is Nothing Then
            fa = re.Address
            Do
                re.Offset(, 1) = wsr.Cells(i, 1)
                Set re = texte.FindNext(re)
            Loop Until fa = re.Address
        End If
    Next i
End Sub
19expemple-forum.xlsm (17.19 Ko)

Je n'y connais rien sur les macro

Bonjour,

une autre solution via une fonction personnalisée.

voir exemple d'utilisation de la fonction personnalisée dans le classeur joint, feuille "base de donnée"

voici la fonction à mettre dans le classeur (déjà présente dans le classeur joint), mais à copier si tu veux l'utiliser dans un autre classeur.

Function RefExiste(t, ref)
    tabt = Split(t, " ")
    For i = 0 To UBound(tabt)
        Set re = ref.Find(tabt(i), lookat:=xlWhole, LookIn:=xlValues)
        If Not re Is Nothing Then RefExiste = re.Value: Exit Function
    Next i
    RefExiste = CVErr(xlErrNA)
End Function

pour mettre la fonction dans un classeur

1) sélectionner le code sur le forum

2) copier le code (ctrl-C)

3) aller dans excel, dans le classeur qui doit recevoir la fonction

4) ouvrir l'éditeur de macro (alt-F11)

5) insérer module via menu->insérer->module

6) coller le code (ctrl-V)

7) revenir dans excel (alt-F11)

8) sauver le classeur avec les macros (via sauver sous et choisir avec les macros)

9) la fonction est maintenant disponible et associée au classeur, elle peut être utilisée comme n'importe quelle autre fonction excel

11expemple-forum.xlsm (16.66 Ko)

Merci beaucoup, ça marche très bien.

Bonjour,

Une solution formule

=SIERREUR(INDEX(codes;EQUIV(1;EQUIV("*"&codes&"*";B2;0);0));"")

Vaider avec maj+ctrl+entrée

Boisgontier

Solution VBA très rapide avec fonction perso matricielle.

Pour une de BD 10.000 et 2.000 références, le temps de réponse est immédiat.

-Sélectionner c2:c7

=rechvm(B2:B7;codes;1;"")

-valider avec mj+ctrl+entrée

Boisgontier

Bonjour,

bonjour Jacques,

légère adaptation de ton code pour solution aussi rapide mais non matricielle

Function rechv(cle, champ, Optional reload = False)
    Static dict
    If Not IsObject(dict) Or reload Then
        Set dict = CreateObject("Scripting.Dictionary")
        dict.comparemode = vbTextCompare
        a = champ.Value
        For i = LBound(a) To UBound(a)
            dict(a(i, 1)) = a(i, 1)
        Next i
    End If
    Tbl = Split(cle, " ")
    trouvé = False
    For k = 0 To UBound(Tbl)
        If dict.exists(Tbl(k)) Then rechv = dict(Tbl(k)): trouvé = True
    Next k
    If Not trouvé Then rechv = CVErr(xlErrNA)
End Function

appel de la fonction

=rechv(texte,reference)

utiliser

=rechv(texte,reference,VRAI)

dans la première cellule le plus en haut à gauche où cette formule doit être utilisée.

>légère adaptation de ton code pour solution aussi rapide mais non matricielle

ok

http://boisgontierjacques.free.fr/fichiers/Cellules/RechvMMultiMots2.xlsm

Boisgontier

Bonjour,

dans l'exemple, la formule en C2 devrait être la suivante

=rechv(B2;codes;vrai)

ceci afin de provoquer le rechargement du dictionnaire si une modification est faite dans la plage codes.

en C3 et tant qu'il faut, la formule devrait être écrite ainsi

=rechv(B3;codes;faux)

ou

=rechv(B3;codes)

Il faut donc que j'utilise la fonction recherv (en créant un macro) ?

bonjour

une contribution sans vba (qui peux ramer)

10pjno63.xlsx (10.29 Ko)

cordialement

Il faut donc que j'utilise la fonction recherv (en créant un macro) ?

bonjour,

Jacques a proposé une solution turbo, que j'ai adaptée pour qu'elle ne soit pas matricielle

Function rechv(cle, champ, Optional reload = False)
    Static dict
    If Not IsObject(dict) Or reload Then
        Set dict = CreateObject("Scripting.Dictionary")
        dict.comparemode = vbTextCompare
        a = champ.Value
        For i = LBound(a) To UBound(a)
            dict(a(i, 1)) = a(i, 1)
        Next i
    End If
    Tbl = Split(cle, " ")
    trouvé = False
    For k = 0 To UBound(Tbl)
        If dict.exists(Tbl(k)) Then rechv = dict(Tbl(k)): trouvé = True
    Next k
    If Not trouvé Then rechv = CVErr(xlErrNA)
End Function

pour l'installer dans un classeur qui contient déjà une macro

1) copier le code sur ce forum (ctrl-C)

2) aller dans excel

3) faire alt-F11 -> editeur de macro

4) sélectionner module1

5) effacer le code présent dans module1(ctrl-A, puis supprimer)

6) coller le code du forum (CTRL-V)

7) faire alt-f11 -> retour dans excel

8) sauver le fichier

la fonction est disponible et peut-être utilisée comme ceci

appel de la fonction

=rechv(texte,reference)

utiliser

=rechv(texte,reference,VRAI)

dans la première cellule le plus en haut à gauche où cette formule doit être utilisée.

Essai avec BD 10.000 lignes et 2.000 recherches. Le temps de réponse est instantané:

Formule matricielle: http://boisgontierjacques.free.fr/fichiers/Cellules/RechvMMultiMots.xlsm

Formule non matricielle: http://boisgontierjacques.free.fr/fichiers/Cellules/RechvMMultiMots2.xlsm

(ne pas utiliser pour 2 BD différentes dans le même classeur -dictionnaire unique-)

Boisgontier

Quand j'utilise la formule, sur certaines lignes, ça m'affiche : 0

Est-ce que c'est normal ?

Bonsoir,

non cela ne me parait pas normal, quelle fonction utilises-tu ? peut-on voir ton fichier ?

J'utilise la fonction rechv. Je ne peux pas te montrer le fichier original car il contient des données confidentielles. Cependant, j'ai trouvé la raison : il y a un double espace dans le texte.

Merci à tous ceux qui m'ont apporté à leur aide !

Rechercher des sujets similaires à "rechercher mot contenu partir colonne"