Utiliser la Fonction Cherche de manière itérative

Bonjour à tous,

Je souhaites utiliser la Fonction CHERCHE, pour trouver, de manière itérative, plusieurs informations stockées sous un seul format dans une chaîne de caractères.

Exemple d'une chaîne de caractère contenu dans la cellule D2 :

"Référence : 46

Qté: 1

Référence : 47

Qté: 1"

J'arrive avec la fonction CHERCHE à extraire sous le format que je souhaite la première référence :

=STXT(D2;CHERCHE("Qté";D2)+NBCAR("Qté: ");CHERCHE(CAR(10);D2;CHERCHE("Qté";D2)))&" x "&STXT(D2;CHERCHE("Référence : ";D2)+NBCAR("Référence : ");CHERCHE(CAR(10);D2;CHERCHE("Référence : ";D2))-CHERCHE("Référence";D2)-NBCAR("Référence : "))

Cette formule me renvoie une chaine de caractère correspondant à la quantité " x " la référence. Ici : "1 x 46"

Ce que je cherche à faire, c'est à utiliser une formule dans une seule case pour afficher : "1 x 46 & 1 x 47"

1) Est-ce possible avec la formule CHERCHE ?

2) Est-ce possible avec une formule tenant dans une seule cellule ?

3) Comment procéder autrement pour que ça soit plus simple ?

Merci d'avance pour vos retours !

Gab

Bonjour et

Il existe aussi une méthode utilisant les expressions régulières https://fr.wikipedia.org/wiki/Expression_r%C3%A9guli%C3%A8re

Bonjour Steelson, et merci pour ton retour,

J'attache l'exemple en PJ

Pour plus de précision, je cherche à utiliser la fonction CHERCHE pour trouver l'ensemble des références et les quantités associé dans la chaîne de la commande (qui sera contenue dans une seule cellule).

Sachant que j'ai une commande par ligne (avec un nombre de ligne qui peut évoluer).

Je crois que je vais devoir utiliser le VBA du coup, non ?

Merci encore pour ton aide.

2qte-x-ref.xlsx (10.29 Ko)
Function QteRef(cel As Range)

    With CreateObject("vbscript.regexp")
        .pattern = "Référence : ([0-9])+"
        .Global = True
        Set r = .Execute(cel.Value)
    End With
    With CreateObject("vbscript.regexp")
        .pattern = "Qté: ([0-9])+"
        .Global = True
        Set q = .Execute(cel.Value)
    End With
    If q.Count <> r.Count Then
        QteRef = "Quantité et Références ne sont pas en phase !"
    Else
        QteRef = ""
        For i = 0 To q.Count - 1
            QteRef = QteRef & Replace(q(i), "Qté: ", "") & " x " & Replace(r(i), "Référence : ", "") & " & "
        Next
        QteRef = Mid(QteRef, 1, Len(QteRef) - 3)
    End If

End Function
4qte-x-ref.xlsm (15.62 Ko)

Fiou !

Quelle rapidité ! Merci beaucoup pour la réponse.

Par contre, j'y connais rien du tout en VBA, et si j'arrive a peu près à voir ce que le code fait, Quelques explications ne me feraient pas de mal !

Function QteRef(cel As Range)

    With CreateObject("vbscript.regexp")
        .pattern = "Référence : ([0-9])+" // On défini la forme du pattern avec une référence numérique
        .Global = True
        Set r = .Execute(cel.Value) // On stock dans une variable r la valeur numérique de la référence
    End With
    With CreateObject("vbscript.regexp")
        .pattern = "Qté: ([0-9])+" // Pareil pour la quantité
        .Global = True
        Set q = .Execute(cel.Value) // on stock dans une variable q la valeur numérique de la quantité
    End With
    If q.Count <> r.Count Then // On vérifie que la quantité soit présente pour chaque référence j'imagine ?

        QteRef = "Quantité et Références ne sont pas en phase !"
    Else
        QteRef = ""
        For i = 0 To q.Count - 1 // On crée une boucle avec le nombre de référence
            QteRef = QteRef & Replace(q(i), "Qté: ", "") & " x " & Replace(r(i), "Référence : ", "") & " & " // Dans laquelle on met notre mise en forme "Qté x Référence"
        Next
        QteRef = Mid(QteRef, 1, Len(QteRef) - 3) // Je ne comprends pas ce passage ? on affiche la chaine du premier caractère au 3e caractère avant le dernier ? est-ce lié a la prise en compte de "Qté:" ?
    End If

End Function

En tout cas merci pour le retour rapide ! C'est super sympa et ça me permet de toucher à un nouveau sujet, et d'apprendre des nouvelles manières de faire, c'est super cool !

On aurait pu faire de façon plus "conventionnelle" en VBA avec des décorticage de texte ... je laisse le soin à quelqu'un d'autre de le faire. Pour ma part, je prends souvent le parti d'utiliser les expressions régulières. C'est un outil puissant.

vbscript.regexp est intégré à excel. Une fois l'objet défini par

With CreateObject("vbscript.regexp")

on lui colle un modèle (pattern) ... exemple ici

.pattern = "Référence : ([0-9])+"

ce qui signifie que l'on va rechercher Référence : suivi de chiffres de 0 à 9 en indiquant la possibilité d'en trouver plusieurs. On indique aussi

.Global = True

pour ne pas s'arrêter au premier cas trouvé.

Set r = .Execute(cel.Value)

va engranger dans un tableau r tous les cas trouvés, de l'indice 0 à l'indice r.count - 1

La suite est plus classique ... on extrait un à un les valeurs trouvées en supprimant Référence : pour ne conserver que la quantité ou la référence.

D'accord,

J'ai compris du coup nickel, merci beaucoup !

Je cherche maintenant à complexifier mon exemple. En effet, mes références ne sont pas forcements composées uniquement de nombres.

Dans mon exemples, ces références étaient 46, 47 et 11112. J'ai également types de produits qui à l'inverse des premiers, ont une référence complexe en trois parties Alphanumériques (avec les lettre en majuscules) séparées par des tirets ("-"). Exemple : HO-Q4FK-1B1M.

Je souhaiterais utiliser la méthode pour identifier les deux types de références.

Est-ce que je peux utiliser la méthode .Pattern de la sorte :

.Pattern = "Référence : ([0-9][A-Z][-])+

Si non => Quel doit être l'argument ?

Si oui => Comment définir les séparateurs entre les différentes plages de caractères ?

Merci encore !

Gab

Edit : En cherchant un peu, j'ai utilisé .Pattern = "Référence : (\S)+" et ça semble marcher parfaitement !

essaie

([0-9A-Za-z\-])+

avec antislash devant le tiret

là cela justifie l'emploi des expressions régulières !

Ah oui, sous cette forme si jamais j'ai d'autres choses que la vraie référence sur la même ligne.

Pour le moment, étant donné que j'ai forcément un retour chariot (CAR(10)) derrière la référence, l'utilisation de (\S)+ est beaucoup plus simple et fonctionnelle.

En tout cas merci pour ton aide, j'ai beaucoup appris aujourd'hui, et en me documentant, je découvres un nouvel univers qui va me simplifier la tache pour d'autres fonctions à développer sur mon petit tableur

Bonne soirée !

Gab

Autre Question sur le VBA pour améliorer mon fichier précédent. Je vais ajouter une cellule sur chaque ligne contenant une adresse de livraison associée aux références et quantités.

Je cherche à utiliser le .Pattern pour trouver automatiquement l'adresse. Je donne un exemple :

Adresse de livraison

NOM Prenom
ADRESSE 
ADRESSE
ADRESSE 
99999 Code postal, 
France

Mon but est d'isoler les différents composants de l'adresse. pour pouvoir générer dans un tableau l'ensemble des informations dans un schéma donné comme tel :

NOM PRENOM

Adresse-1 (35 caractères max)

Adresse-2 (35 caractères max)

Adresse-3 (35 caractères max)

CP

VIlle

Pays

Qte x Ref

Pour isoler NOM PRENOM, je sais faire.

Pour isoler CP, VILLE et Pays, je me débrouille aussi,

En revanche, je galère pour extraire l'adresse. En effet, j'ai une formule qui marche si il y a une seule ligne, mais dés qu'il y en a plusieurs, je ne sais plus comment faire....

J'ai pensé pouvoir la récupérer en la définissant comme tel :

L'ensemble du texte présent dans la cellule, moins les 3 premieres lignes, moins les 2 dernières lignes

Je cherche le 3e retour chariot et supprime tout ce qui vient avant

J'identifie l'avant dernier retour chariot et je supprime tout ce qui vient après.

Il me reste donc à la fin la (ou les) ligne(s) ADRESSE.

Mes questions :

1) Comment rechercher un retour chariot dans une chaine de texte dans VBA et identifier sa position dans la chaine ? J'ai trouvé chr(13) & chr(10) mais je ne parvient pas à l'utiliser dans mon algo...

2) Comment supprimer tout ce qu'il y a avant / après une position donnée dans une chaîne de texte (l'équivalent de la formule STXT).

Merci d'avance pour les lumières que vous pourrez m'apporter !

Gab

1) Comment rechercher un retour chariot dans une chaine de texte dans VBA et identifier sa position dans la chaine ? J'ai trouvé chr(13) & chr(10) mais je ne parvient pas à l'utiliser dans mon algo...

je ferais un split pour récupérer un tableau avec chaque ligne, indice 0 = 1ère ligne, indice n-1 pour dernière ligne si il y a n lignes dans la cellules

2) Comment supprimer tout ce qu'il y a avant / après une position donnée dans une chaîne de texte (l'équivalent de la formule STXT).

en VBA c'est
mid
, mais la solution ci-dessus évite de faire cela

Je te fais un exemple rapide ...

capture d ecran 550
2gabtho.xlsm (13.08 Ko)

Bonjour et Merci pour ton retour

C'est parfait, j'ai retouché un peu ton exemple à ma sauce comme suit :

Function ExtAdresse(cel As Range)
    tablo = Split(cel.Value, Chr(10)) // Ici, j'ai un peu galéré à trouver comment on reprenais l'adresse passée en argument, mais au moins ça m'aide à mieux comprendre comment marche le VBA  :mrgreen: 
    Debug.Print UBound(tablo) & " Lignes"
    ExtAdresse = ""
    Debug.Print ExtAdresse
    For i = 1 To UBound(tablo) - 3
    ExtAdresse = ExtAdresse & tablo(i) & " "
    Debug.Print ExtAdresse // Je m'embête a bien vérifier a chaque fois pour les tests avec de vrais données
    Next
   Debug.Print ExtAdresse & Chr(10) & " FINI" // Pareil, inutile mais pour mon propre plaisir visuel ça m'a bien aidé

End Function

J'ai également utilisé la même base pour retaper ma formule qui trouvait le code postal par la même occasion !

Maintenant, ne me reste plus qu'à m'amuser à coder un système qui utilisera QteRef et une base de donnée d'un autre feuillet pour déterminer le poids total.

En tout cas merci pour le coup de pouce !

Bonne journée à toi

Gab

Rechercher des sujets similaires à "utiliser fonction cherche maniere iterative"