Recherche sous chaîne à partir d'une plage

guil182

XLDnaute Nouveau
Bonjour,

Alors pas mal de recherche, je bloque, je me permets donc de vous demander votre aide :

J'ai une feuille "feuil1" ainsi :

Wine | Producer | Wine | Appellation
Château d'Esclans Côtes de Provence Rosé Les Clans | | |


Et sur une autre feuille, "feuil2" , j'ai la liste des appellations :


Pays | Appellations
France | Tavel
France | Coteaux du Languedoc
France | Côtes de Provence
France | Vouvray

Voici l'algo :

Pour chaque ligne de feuil1
Recherche de la sous-chaine "appellation" dans ColA(i) en
fonction de la colonne B de feuil2
Si trouvé
Si "Rosé" après l'appellation, je supprime "Rosé"
Sous chaine à gauche de l'appellation feuil1.colA(i) -> dans
feuil1.colB(i)
Sous chaine à droite de l'appellation feuil1.colA(i) -> dans
feuil1.colC(i)
Sous feuil2.colB (appellation trouvée=) -> dans feuil1.colD(i)

boucle

En clair, le résultat serait :
Wine | Producer | Wine | Appellation
Château d'Esclans Côtes de Provence Rosé Les Clans |Château d'Esclans | Les Clans | Côtes de Provence

Mais je n'arrive même pas afaire la recherche de la sous chaine appellation en fonction des appellations.....:(

Merci d'avance de votre aide
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Recherche sous chaîne à partir d'une plage

Bonjour Guil et bienvenu dans le forum, bonjour le forum

Ton problème est clairement exposé mais pourtant je n'y comprends que tchi... Et avec ces grosses chaleurs j'ai carrément la flemme de créer un fichier avec tes données. Je te propose donc de nous envoyer une petit bout d'exemple sur un fichier simplifié afin que nous puissions mieux te venir en aide.
 

guil182

XLDnaute Nouveau
Re : Recherche sous chaîne à partir d'une plage

Le fichier exemple2 montre les 2 premières lignes de résultats après avoir trouvé l'appellation sur Feuil2 dans la colonne A de feuil1 (en sous chaîne)

Merci encore
 

Pièces jointes

  • Exemple2.xls
    42 KB · Affichages: 68
  • Exemple2.xls
    42 KB · Affichages: 65
  • Exemple2.xls
    42 KB · Affichages: 62

Robert

XLDnaute Barbatruc
Repose en paix
Re : Recherche sous chaîne à partir d'une plage

Bonjour Guil, bonjour le forum,

La macro ci-dessous ne résout pas complétement le problème mais peut-être elle te fera avancer :
Code:
Sub Macro1()
Dim celb As Range 'déclare la variable celb (CELlule de la Base)
Dim cela As Range 'déclare la variable cela (CELlule des Appelations)
Dim a As Worksheet 'déclare la variable a (onglet des Appellations)
Dim b As Worksheet 'déclare la variable b (onglet de la Base de données)
Dim lg As Byte 'déclare la variable lg (LonGueur)
 
Set a = Sheets("Feuil2") 'définit l'onglet a
Set b = Sheets("Feuil1") 'définit l'onglet b
 
'boucle 1 : sur toutes les cellules de la base (onglet "Feuil1"), colonne A)
For Each celb In b.Range("A2:A" & b.Range("A65536").End(xlUp).Row)
    
    'boucle 2 : sur toutes les cellules des apellations (onglet "Feuil2"), colonne B)
    For Each cela In a.Range("B2:B" & a.Range("B65536").End(xlUp).Row)
        'définit la variable lg (position, en nombre de caractères, du texte de cela dans celb)
        lg = InStr(1, celb.Value, cela.Value, vbTextCompare)
        
        If lg > 0 Then ' condition 1 : si lg est positif (donc si le texte de cela existe dans celb)
            celb.Offset(0, 1).Value = Mid(celb.Value, 2, lg - 3) 'place en colonne B le producteur
            
            'condition 2 : si le nom du vin est précédé de "Rosé"
            If Left(Mid(celb.Value, lg + Len(cela.Value)), 4) = "Rosé" Then
                'place le nom du vin en supprimant "Rosé" en colonne C
                celb.Offset(0, 2).Value = Mid(celb.Value, lg + Len(cela.Value) + 5)
            Else ' sinon (condition 2)
                'place le nom du vin en colonne C
                celb.Offset(0, 2).Value = Mid(celb.Value, lg + Len(cela.Value))
            End If ' fin de la condition 2
            
            celb.Offset(0, 3).Value = cela.Value 'place l'appelation en colonne C
            Exit For ' sort de la boucle 2
        End If ' fin de la condition 1
    Next cela 'prochaine cellule cela de la boucle 2
 
Next celb 'prochaine cellule celb de la boucle 1
End Sub
 

guil182

XLDnaute Nouveau
Re : Recherche sous chaîne à partir d'une plage

Pourquoi pas parfaitement ?...vraiment un grand merci, c'est exactement le besoin.
Par contre, si je peux "abuser" de ton temps, il reste une petite exception..

Sur la ligne :
*Les Vignerons de Tavel Tavel Cuvée Royale

on obtient :
Les Vignerons de | Tavel Cuvée Royale | Tavel

au lieu de :

Les Vignerons de Tavel | Cuvée Royale | Tavel

En gros, il prend le premier "Tavel" pour l'appellation au lieu du second...

Merci encore
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Recherche sous chaîne à partir d'une plage

Bonjour Guil, bonjour le forum,

Oui j'avais vu ce cas de figure et c'est pour cela que je te disais que la macro n'était pas idéale. Malheureusement je n'ai pas de solution car la fonction InStr revoie la position d'une sous-chaîne dans une chaîne mais s'il y a plusieurs occurrence elle ne s'occupe que de la première.
 

guil182

XLDnaute Nouveau
Re : Recherche sous chaîne à partir d'une plage

J'ai trouvé ;)

Il faut remplacer :

Code:
InStr(1, celb.Value, cela.Value, vbTextCompare)

par :

Code:
InStrRev(celb.Value, cela.Value, -1, vbTextCompare)

Et la recherche s'effectue de la droite vers la gauche...

J'ai pas mal de soucis avec ces fichiers, je pourrais encore avoir besoin de tes "lumières" et si veux bien et si tu peux...

Merci encore.
 

guil182

XLDnaute Nouveau
Re : Recherche sous chaîne à partir d'une plage

Excuse moi, mais il y a un petit soucis que je n'arrive pas à résoudre :

Dans le fichier exemple , entre la ligne 3 et 4.
La macro sélectionne l'appéllation hermitage ou lieu de crozes-hermitage, cette dernière étant après dans la liste des appellations....comment dire que "-" n'est pas un caractère d'espacement ?

Merci d'avance

Guillaume
 

Pièces jointes

  • Exemple.zip
    16.9 KB · Affichages: 34
  • Exemple.zip
    16.9 KB · Affichages: 37
  • Exemple.zip
    16.9 KB · Affichages: 26

Statistiques des forums

Discussions
312 102
Messages
2 085 303
Membres
102 857
dernier inscrit
Nony1931