Aide pour formule (SI+INDEX?)

Bonjour à tous,

Malgré mes recherches sur Google, je ne trouve pas la réponse à mon problème (je dois mettre les mauvais mots clefs....) et sollicite donc votre aide.

Mon but est de reconnaître des séries de phrases dans une cellule en les comparant à un tableau et de les retranscrire ensuite sur une autre cellule. Je cherche donc une formule qui compare toutes les cellules de mon index avec une partie de ma cellule recherchée.

Au lieu de me perdre dans mes explications, le fichier joint est assez explicite. Je cherche donc la formule à mettre dans la colonne C pour avoir les résultats indiqués. Pour information, je peux faire des index différents pour chaque pays et ainsi n'avoir que les villes françaises pour l'index de la colonne C.

Merci d'avance pour votre aide!

Clément

19excel-pratique.xlsx (12.85 Ko)

Bonjour,

Une proposition avec une fonction personnelle.

A+

16excel-pratique.xlsm (19.77 Ko)

salut Frangy

a l'arrache ; ça boitille un peu mais leger

7sylisnoo.zip (10.72 Ko)

cordialement

Bonjour,

Merci pour vos réponses!

@Frangy: C'est exactement ca! Merci beaucoup. Maintenant il faut que je comprenne ce qu'il se passe car j'ai pris un exemple simplifié de mon problème + mes index (un par pays) seront sur une autre feuille + je ne comprends rien à VBA.

Voici ton code, est ce qu'on peut le prendre ligne par ligne?

Option Explicit

Function Renvoyer(Plage As Range) As String

--> Tu définis la macro comme renvoyer. Donc si je mets "Function France(Plage As Range) As String", elle s’appellera =France?

Dim Tablo

--> Tu définis le tableau des colonnes F et G, c'est ca?

Dim i As Integer

--> Tu définis i pour faire la loop.

Dim Valeur As String

Application.Volatile

--> Type de macro, donc je ne touche pas.

Tablo = Split(Plage, Chr(10))

For i = 0 To UBound(Tablo, 1)

If Split(Tablo(i), " ")(0) = "FRANCE" Then

Valeur = Application.VLookup(Tablo(i), Range("Renvoi"), 2, False)

Renvoyer = Renvoyer & Valeur & "; "

End If

Next i

If Renvoyer <> "" Then Renvoyer = Left(Renvoyer, Len(Renvoyer) - 2)

End Function

--> En fait tu fais une recherche des cellules de la colonnes F sur la colonne B, c'est ca?

Bon en fait, je ne comprends pas grand chose à ta loop:

  • Où dis tu à ta macro que l'index se trouve aux colonnes F et G? Si ce dernier est sur une autre feuille, ca se passe comment?
  • A quoi sert If Renvoyer <> "" Then Renvoyer = Left(Renvoyer, Len(Renvoyer) - 2)?
  • Tant que l'on y est, que veux dire : Tablo = Split(Plage, Chr(10)) et comment marche ton If?

@tulipe: Pas sûr que tu aies compris mon problème. Je cherche à remplir la colonne C et pas la colonne G. Sinon, je n'ai pas compris ce que tu as fait.

Clément

Option Explicit

Function Renvoyer(Plage As Range) As String

--> Tu définis la macro comme renvoyer. Donc si je mets "Function France(Plage As Range) As String", elle s’appellera =France ?

Oui

Dim Tablo

--> Tu définis le tableau des colonnes F et G, c'est ca?

Non. Il s’agit de la variable tableau qui va contenir tous les couples pays-ville d’une même cellule de la colonne B.

Voir l'exemple donné ci-après avec l'explication sur la fonction Split

Dim i As Integer

--> Tu définis i pour faire la loop.

Oui.

Application.Volatile

Avec la méthode ‘’Volatile’’ la fonction est recalculée chaque fois qu'un calcul est effectué dans une cellule quelconque de la feuille de calcul.

Tablo = Split(Plage, Chr(10))

La fonction Split renvoie un tableau de base zéro à une dimension contenant le nombre spécifié de sous-chaînes. Ces sous-chaines sont définies avec le séparateur Chr(10) qui est le retour à la ligne.

Exemple : avec B4, Split(Range(‘’B4’’), Chr(10)) renvoie un tableau qui contient 4 valeurs :

Tablo(0) =FRANCE Paris,

Tablo(1) =FRANCE Lyon,

Tablo(2) =ALLEMAGNE Berlin,

Tablo(3) =FRANCE Lille

For i = 0 To UBound(Tablo, 1) ‘On balaye toutes les valeurs de Tablo.

If Split(Tablo(i), " ")(0) = "FRANCE" Then ‘Si la première chaine de caractère de cette valeur est ‘’FRANCE’’

Valeur = Application.VLookup(Tablo(i), Range("Renvoi"), 2, False) ‘alors, on note le code correspondant à cette valeur dans la plage nommée "Renvoi".

Exemple : si i=0, Tablo(i)= "FRANCE Paris" et la recherche retourne Valeur ="Par"

Dans le gestionnaire de noms, tu noteras que ‘’Renvoi’’ fait référence à =Exemple!$F$4:$G$9

Renvoyer = Renvoyer & Valeur & "; " ‘ Cette instruction permet de concaténer les valeurs trouvées.

Pour reprendre l’exemple avec B4, la boucle aura 4 itérations :

i=0 ; Renvoyer = Par;

i=1 ; Renvoyer = Par; Ly ;

i=2 ; Renvoyer = Par; Ly ; rien ne change puisque la première chaine de caractère est "ALLEMAGNE"

i=3 ; Renvoyer = Par; Ly ; Li ;

If Renvoyer <> "" Then Renvoyer = Left(Renvoyer, Len(Renvoyer) - 2) ‘ Cette instruction permet de supprimer l’espace et le point virgule en fin de chaine.

Par; Ly ; Li ; => Par; Ly ; Li

Pour t'éviter les difficultés d'adaptation du code, il aurait été préférable que tu postes un fichier correspondant plus précisément à tes attentes.

A+

Cooool, j'ai compris J'ai appris plein de choses en te lisant, je ne connaissais même pas le gestionnaire de noms! Je devrais maintenant pouvoir changer la macro comme je le désire. Sauf que :

J'ai simplifié mon problème car en voulant tout expliquer sur un autre forum, les gens se sont un peu perdu. Voici donc, ci-joint, le "vrai" fichier où "Riemerella anatipestifer" correspond à "FRANCE" et "Sérotype 3" à "Paris". En voulant faire simple, j'ai oublié de parler de la fin de mes lignes avec une réf où X est soit une lettre, soit un chiffre (voir fichier joint). La longueur de la référence varie aléatoirement entre 4 et 15 caractères (si ce n'est plus...). Il faudrait donc, après le split, enlever toute la mention réf XXXxxxx.... Aurais tu la ligne magique à ajouter?

Merci encore,

Clément

re

ha pardon ;j'aicru que tu voulais extraire les "par ; ....ber ......mad ..... puis les accompagner de ". " ; je me suis arreter là car une fois cette extraction faite ;il y a toujours moyen de regrouper ou autre

mais je suppose que j'etais a coté de la plaque ( avec mon "split " a la mormoile

cordialement

Voila un début

A+

Quelle réactivité !

La macro a l'air bonne et semble marcher même quand je la bidouille

Je l'intègre de suite dans mon fichier et la multiplie pour répondre à tous les noms de bactéries. Je reviendrai pour mettre la conversation en "résolu" quand tout marchera.

Un grand merci,

Clément

Rechercher des sujets similaires à "aide formule index"