Recherche une valeure "désordonnée" dans une cellule

Neptune

XLDnaute Junior
Bonjour,

Je développe actuellement un programme sous VBA qui doit rechercher une valeure dans une cellule sous condition.

Voici un exemple d'une recherche par comparaison entre deux cellules comportant le produit E4448A mais avec différentes options:

Cell C3 = E4448A-123-1DS-B7J-241
Cell A3 = E4448A-241-112-123-1DS-506-B7J-241

La Cellule C3 contient une référence de produit E4448A suivi par des tirets de ses différentes options 123-1DS....

La Cellule A3 est bien aussi E4448A mais a plus d'options. Dans ce cas-ci , la CellA3 comporte bien aussi toutes les options 123-1DS-B7J-241 mais dans un ordre différent.


Je souhaiterai donc que si la ref produit A3 est égale à C3 est comporte bien toutes les options alors B3=Ok sinon B3=x

Actuellement j'utlise .find avec LookIn:=xlValues, lookat:=xlPart mais vu que les options peuvent être rentrées dans un ordre différent et ben ça ne fonctionne plus.

Any idea?

Merci
 
G

Guest

Guest
Re : Recherche une valeure "désordonnée" dans une cellule

Bonjour Neptune, le forum,

Voici une petite fonction qui retourne Vrai quand tous les membres explosés par un séparateur d'une chaine de caractères sont contenus dans une aute.

Code:
Function EstComprisDans(str1 As String, str2 As String, Optional sep As String = "-")
 
    Dim t As Variant
    Dim mVar As Variant
    Dim cpt As Integer
 
    'Permutation éventuelle des chaines si Str2 plus courte que str1
    If Len(str2) < Len(str1) Then mVar = str1: str1 = str2: str2 = mVar
    t = Split(str1, sep)
    For mVar = 0 To UBound(t)
        If str2 Like "*" & t(mVar) & "*" Then cpt = cpt + 1
    Next
    EstComprisDans = cpt - 1 = UBound(Split(str1, sep))
 
End Function

Si tous les membres de
E4448A-123-1DS-B7J-241
sont compris dans
E4448A-241-112-123-1DS-506-B7J-241 (dans l'ordre ou le désordre)
retourne vrai sinon faux
Il n'y a pas de gestion d'erreurs....à faire.

A+
 
Dernière modification par un modérateur:

ngogoisidore

XLDnaute Occasionnel
Re : Recherche une valeure "désordonnée" dans une cellule

Bonjour Neptune,

Le plus simple, à mon sens, est d'écrire une fonction VBA : EstContenu(ch1, ch2), qui vérifiera que la chaîne ch1 est contenue dans la chaîne ch2 au sens de :

Toutes les sous parties de ch1 (les parties séparées par des "-") sont contenues dans ch2.

Voir ci-dessous pour un exemple d'un tel code :

Code:
Function EstContenu(sContenu As String, sContenant As String) As Boolean
    Const sSep As String = "-"

    Dim sPartie As String
    Dim iPartie As Integer
    Dim iPartie0 As Integer
  
    EstContenu = True
  
    If sContenu = "" Then Exit Function

    iPartie = 0

    While iPartie <= Len(sContenu)
        iPartie0 = iPartie + 1

        iPartie = InStr(iPartie0, sContenu, sSep)
        
        If iPartie = 0 Then iPartie = Len(sContenu) + 1

        sPartie = Mid(sContenu, iPartie0, iPartie - iPartie0)
        
        If InStr(sContenant, sPartie) = 0 Then
            iPartie = Len(sContenu) + 1
            EstContenu = False
        End If
    Wend
End Function '~EstContenu

Avec tes définitons des cellules C3 et A3, il faudrait entrer, par exemple dans la cellule B3, =EstContenu(C3,A3)

Remarque 1 : Tu écris que les "options" peuvent être dans le désordre, c'est donc ce que j'ai supposé dans mon code.
Cependant, dans ton exemple, ça n'est pas le cas : les options communes à A3 et C3 sont dans le même ordre, même s'il y a des options supplémentaires qui s'intercallent dans A3. Si cette propriété (conservation de l'ordre) est vérifiée dans tous les cas, elle pourrait (peut-être) être utilisée pour accélerer le code VBA.

Remarque 2 : Si tu connais un peu, il est aussi possible d'utiliser les "expressions régulières" qui "simplifient" (en général) la recherche dans les chaînes de caractères.
Mais si tu ne connais pas, il ne vaut mieux pas, car leur utilisation demande un peu de pratique.

Edit :

Bonjour et désolé Hasco, nos posts se sont croisés.
Je ne connaissais pas la fonction Split :).
 
Dernière édition:

Neptune

XLDnaute Junior
Re : Recherche une valeure "désordonnée" dans une cellule

Bonsoir,

Merci Hasco pour ta fonction mais comment puis-je faire pour l'insérer dans la boucle de mon programme?

Dois je faire un call EstCompris Dans?

PS:pourquoi ne peut-on pas faire de MP?

Merci d'avance,
 

Neptune

XLDnaute Junior
Re : Recherche une valeure "désordonnée" dans une cellule

Bonsoir,

En admettant que j'ai E4448A-123-1DS-B7J-241 dans CellA et E4448A-241-112-123-1DS-506-B7J-241 dans une des cellules de CellCRackUsed

Voici une amorçe...mais j'y arrive pas...

' Boucle sur chaque cellule dans la plage A
For Each CellA In PlageA

'Boucle dans toutes les cellules de la plageCRackUsed
For Each CellCRackused In PlageCRackUsed

'Si la cellA n'est pas vide alors je recherche si la CellA existe dans TOUTES les cellules de CRackUsed en y incluant les options séparé par "-"
If CellA.Value <> "" Then Set Trouve = EstComprisDans(CellA.Value, CellCRackused.Value, "-")

Next CellCRackused

'Si CellA n'est pas trouvée dans RackUsed alors
If Trouve Is Nothing Then

""SUITE DU PROG""

J'ai un message d'erreur "424": Objet requis

Merci de votre aide
 
G

Guest

Guest
Re : Recherche une valeure "désordonnée" dans une cellule

Bonjour Neptune, ngogoisidore, le forum,

Neptune, tout d'abord parlons des MP.
Nous sommes sur un forum de partage de connaissance, ta question peut interesser plusieurs personnes qui n'y auront pas accès si nous la traitons par MP. De plus, pour les pièces jointes, il est demandé de faire un effort pour faire des exemples qui puissent profiter à tous. De plus cela permet au demandeur de synthétiser sa demande et d'en extraire l'essentiel. Une manière d'apprendre tout àfait profitable.
Envoyer un gros fichier entier par mail, dépasse le cadre du forum.

En ce qui concerne ton problème:

La fonction 'EstComprisDans' renvoie Vrai si une sous chaine est comprise dans une autre et Faux dans le cas contraire. Aussi ta variable Trouve doit être une variable Booleenne (logique) et non Objet.
Seul les variables Objet sont valorisées par 'Set'.
donc
Code:
Dim Trouve as boolean
 
....
If CellA.Value <> "" [COLOR=red]Then [/COLOR][COLOR=red]Trouve =[/COLOR] EstComprisDans(CellA.Value, CellCRackused.Value, "-")
 
Next CellCRackused
 
'Si CellA n'est pas trouvée dans RackUsed alors
[COLOR=red]If Not Trouve Then[/COLOR]
 
""SUITE DU PROG""

Si tu as des problèmes, avec, fait nous un exemple, qui respectent la structure de ton fichier avec la macro et quelques données.

A bientôt
 

Neptune

XLDnaute Junior
Re : Recherche une valeure "désordonnée" dans une cellule

Bonjour à tous,

Je vous joins un exemple afin que vous puissiez insérer la fonction EStComprisDans.

J'espère que cela vous aidera...

Dans l'onglet Lf se trouve la liste des appareils que je dispose.Il s'agit de tous les équipements en colonneC.

Dans l'onglet "STE....", il s'agit des équipements nécessaire pour pouvoir vérifier l'appareil E44XXB.

Dans sheet 3 , en cliquant sur le bouton , je dois savoir ce qu'il manque. Or , si je dois avoir un appareil avec des options suivi de l'appareil par "-", cela ne fonctionne plus.

Le but serait d'insérer la fonction d'Hasco dedans mais là je bloque.

Merci
 

Pièces jointes

  • EstComprisDans1.xlsm
    25.1 KB · Affichages: 58
  • EstComprisDans1.xlsm
    25.1 KB · Affichages: 53
  • EstComprisDans1.xlsm
    25.1 KB · Affichages: 57

Neptune

XLDnaute Junior
Re : Recherche une valeure "désordonnée" dans une cellule

Bonjour à tous,

J'essaye d'intégrer la fonction mais en vain...j'ai toujours des messages d'erreurs.

Je vous joins une copie de mon problème pour lequel j'ai essayé d'intégrer la fonction EstComprisDans créée par d'Hasco.

Merci d'avance pour votre aide.
 

Pièces jointes

  • EstComprisDans1.xlsm
    25.7 KB · Affichages: 61
  • EstComprisDans1.xlsm
    25.7 KB · Affichages: 55
  • EstComprisDans1.xlsm
    25.7 KB · Affichages: 62
G

Guest

Guest
Re : Recherche une valeure "désordonnée" dans une cellule

Neptune,

Ce que tu as fait est tellement loin de ce que tu disais dans ton premier post, que je ne m'y retrouve plus.

De plus apparement tu n'as pas lu mon précédent message puisque tu n'as pas fait la correction à propos du Set Trouve =

La fonction que je t'ai fournie répond aux contraintes exprimées dans ton post #1 et dont j'ai fait mention dans la réponse mais apparement tu veux autre chose.

Alors essaye d'expliquer, en détails avec de multiples exemples de ce que tu cherche à comparer, avec quoi etc.. etc..

Et que les exemples correspondent aux critères exprimés.

A+
 

Neptune

XLDnaute Junior
Re : Recherche une valeure "désordonnée" dans une cellule

re-bonjour,

Le post #1 correspondait à une demande bien particulière à laquelle tu as su répondre.

Cette fonction a pour but de s'imbriquer dans une boucle de mon programme final.

Les exmples finaux que j'ai joint correspondent plus à une image de ma version finale (trop grosse pour joindre au forum).

Dans mon programme actuel, j'utlise la fonction .Find afin de comparer des valeurs de cellules contenues de différentes plages.
Dans mon exemple, il s'agit de voir si la cell (cellule de la plage A de STE...)existe dans les cellules dela plage3(Sheets LF.Column(3)).

Il s'avère que j'ai constaté que certaines cellules de cell pouvaient comporter des options (=> cellule de cell = ref produit ou cell=ref produit - option - option...)

E4448A étant ma ref
1DS et 123 des options propres à cette ref.

Dans mon cas, j'ai un moment dans ma boucle For cell, ou la valeur de cell sera = E4448A-1DS-123. (A16)
Le programme va donc comparer cette valeur avec toutes les valeures comprises dans le sheet LF.column(3)

Je sais que dans sheets LF, j'ai cette ref qui doit correspondre en C29 mais avec plusieurs options DONT celles que j'ai besoin en plus c-a-d 1DS et 123. Qui peut le plus peut le moins.

Avec ma fonction actuelle, .Find lookat:=XlPart , il ne trouvera pas la coincidence car il va comparer de gauche à doite je crois et va bloquer sur le 124 au lieu de 123..
Cependant , avec ta fonction, cela devrait fonctionner car elle gère tout le contenu de la cellule quelque soit l'odre dont se trouvent les options (toujours après la ref par contre).

En glissant ta fonction dans la boucle de For cell, il devrait donc me dire qu'il a bien trouvé E4448A-1DS-124-266-123 = E4448A-1DS-123.

J'espère que cela est plus clair....
 
G

Guest

Guest
Re : Recherche une valeure "désordonnée" dans une cellule

Re,

Voici un résultat dont je ne suis pas absolument certain mais vois si cela convient. Au cas ou cela n'irai pas donne le fichier avec les données qui devraient être trouvées.

A+
 
G

Guest

Guest
Re : Recherche une valeure "désordonnée" dans une cellule

Neptune,

Très bien, je me doutais qu'il y avait un petit malentendu sur le fonctionnement de la fonction. J'aurais du l'appeler OntPartieCommune(str1, str2) et pas EstComprisDans.

Parfois l'ambigüité des mots provoquent bien des soucis...;

A+
 

Statistiques des forums

Discussions
312 491
Messages
2 088 889
Membres
103 982
dernier inscrit
krakencolas