Une rechercheV améliorée en quelque sorte....

Résolu
Niconz Messages postés 313 Date d'inscription lundi 16 juin 2014 Statut Membre Dernière intervention 13 août 2024 - 9 août 2024 à 12:24
Niconz Messages postés 313 Date d'inscription lundi 16 juin 2014 Statut Membre Dernière intervention 13 août 2024 - 13 août 2024 à 13:53

Bonjour à tous, 

Voici ma problématique : 

Je souhaite attribuer la nomenclature la plus poche possible (parmi une centaine) à chaque commande passée (plusieurs milliers), via le texte de commande qui lui est associé.

Mon 1er onglet comporte la liste des commandes, avec en colonne C le texte de la commande. Chaque texte de commande est donc différent, et ce sur plusieurs milliers de lignes.

Mon 2ène onglet comporte la feuille de nomenclature avec plein de colonnes et de texte différents qui permet d'affiner le choix des nomenclatures. Dans l'idéal, je souhaite qu'Excel me rapporte la nomenclature présente en colonne D de cet onglet.

Mon besoin est donc le suivant : comment faire pour qu'en fonction du texte de chaque commande (1er onglet), Excel me suggère une nomenclature (même  approximative), en fonction des mots qui peuvent correspondre entre le texte de la commande et les détails d'informations provenant de l'onglet Nomenclature.

Voici le lien du fichier : 

https://www.transfernow.net/dl/20240809pMXjJlLf

Si quelqu'un a une solution a mon petit problème, avec grand plaisir pour en apprendre davantage, 

Merci beaucoup par avance, 

Très bonne journée, 

Nicolas, 
Windows / Chrome 127.0.0.0

4 réponses

yg_be Messages postés 23316 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 8 novembre 2024 Ambassadeur 1 552
9 août 2024 à 12:49

bonjour,

Je ferais cela en deux étapes:

  1. ajouter, en colonne E de Nomenclature, pour chaque ligne, une liste des mots "utiles" à rechercher dans le texte des commandes.  Les noms en colonnes A à C ne me semblent pas adéquats.  Cela peut s'automatiser, si souhaité, à partir des colonnes A à C.
  2. pour chaque commande, chercher quelle ligne de Nomenclature contient, en colonne E, le maximum de mots communs avec le texte de la commande, et adapter la famille de la commande.
0
Niconz Messages postés 313 Date d'inscription lundi 16 juin 2014 Statut Membre Dernière intervention 13 août 2024
9 août 2024 à 13:46

Bonjour yg_be, 

Merci pour ton retour.

Sur le principe, ce serait pertinent, mais vu le nombre de lignes totales à gérer, et de texte de commande différents, je ne vois pas comment définir une liste de mots utiles. Il y en aurait beaucoup trop au final. > Raison pour laquelle je préfererai qu'Excel me renvoie une nomenclature (même approximative) en fonction des mots qui correspondent entre les 2 onglets.

Cela me permettra ensuite d'affiner par famille, et de trouver la nomenclature précise.

Merci, 

0
yg_be Messages postés 23316 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 8 novembre 2024 1 552
Modifié le 9 août 2024 à 16:48

Voilà déjà le code qui va mettre les mots pertinents en colonne E.

Option Explicit

Sub motsutiles()
Const spec As String = "(:)/&- "
Dim fl As Worksheet, cl As Range, i As Integer, src As String, pos As Integer, mot As String
Set fl = ThisWorkbook.Sheets("Nomenclature")
Set cl = fl.[a2]
Do While cl <> ""
    cl.Offset(, 4) = ""
    For i = 0 To 2
        src = Trim(cl.Offset(, i))
        Do While src <> ""
            pos = 1
            Do While pos <= Len(src) And InStr(spec, Mid(src, pos, 1)) = 0
                Debug.Print pos, Mid(src, pos, 1), InStr(spec, Mid(src, pos, 1))
                pos = pos + 1
            Loop
            mot = Left(src, pos - 1)
            If mot <> "" Then
                cl.Offset(, 4) = cl.Offset(, 4) + "|" + mot
            End If
            If pos < Len(src) Then
                src = Trim(Right(src, Len(src) - pos))
            Else
                src = ""
            End If
        Loop
    Next i
    Set cl = cl.Offset(1)
Loop
End Sub
0
yg_be Messages postés 23316 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 8 novembre 2024 Ambassadeur 1 552
Modifié le 12 août 2024 à 11:12

suggestion:

Option Explicit
Sub categorie()
Dim flnom As Worksheet, flcomm As Worksheet, clcomm As Range, clnom As Range, cnt As Integer
Dim lnom() As String, lcomm() As String, maxc As Integer, maxlig As Long, comm, nom
Call motsutiles
Set flnom = ThisWorkbook.Sheets("Nomenclature")
Set flcomm = ThisWorkbook.Sheets("Liste commande")
Set clcomm = flcomm.[c2]
Do While clcomm <> ""
    lcomm = Split(clcomm, " ")
    Set clnom = flnom.[e2]
    maxc = 0
    maxlig = -1
    Do While clnom <> ""
        lnom = Split(clnom, "|")
        cnt = 0
        For Each comm In lcomm
            For Each nom In lnom
                If LCase(comm) = nom Then
                    cnt = cnt + 1
                End If
            Next nom
        Next comm
        If cnt > maxc Then
            maxc = cnt
            maxlig = clnom.Row
        End If
        Set clnom = clnom.Offset(1)
    Loop
    If maxlig > 0 Then
        clcomm.Offset(, -1) = flnom.Cells(maxlig, "d")
    End If
    Set clcomm = clcomm.Offset(1)
Loop
End Sub
Private Sub motsutiles()
Const spec As String = "(:)/&- "
Dim fl As Worksheet, cl As Range, i As Integer, src As String, pos As Integer, mot As String
Set fl = ThisWorkbook.Sheets("Nomenclature")
Set cl = fl.[a2]
Do While cl <> ""
    cl.Offset(, 4) = ""
    For i = 0 To 2
        src = Trim(cl.Offset(, i))
        Do While src <> ""
            pos = 1
            Do While pos <= Len(src) And InStr(spec, Mid(src, pos, 1)) = 0
                pos = pos + 1
            Loop
            mot = LCase(Left(src, pos - 1))
            If mot <> "" Then
                If cl.Offset(, 4) = "" Then
                    cl.Offset(, 4) = mot
                Else
                    cl.Offset(, 4) = cl.Offset(, 4) + "|" + mot
                End If
            End If
            If pos < Len(src) Then
                src = Trim(Right(src, Len(src) - pos))
            Else
                src = ""
            End If
        Loop
    Next i
    Set cl = cl.Offset(1)
Loop
End Sub
0
Niconz Messages postés 313 Date d'inscription lundi 16 juin 2014 Statut Membre Dernière intervention 13 août 2024
13 août 2024 à 13:53

Bonjour yg_be, 

Merci beaucoup pour ta suggestion, ca marche assez bien.

Cela devrait faire l'affaire, il ne me reste plus qu'à dupliquer sur toutes mes lignes et affiner en fonction.

Encore merci, très bonne journée.

0