IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

VBA : Rechercher si le texte correspond à une des valeurs d'une liste puis retourner son equivalent [XL-2019]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Mars 2023
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Mars 2023
    Messages : 3
    Par défaut VBA : Rechercher si le texte correspond à une des valeurs d'une liste puis retourner son equivalent
    Bonjour,

    j'implore votre aide pour résoudre un problème qui me bloque depuis plusieurs jours.

    VBA Issues.xlsm

    Dans le fichier en piéce jointe, je souhaiterais adapter cette formule en VBA (=IFERROR(VLOOKUP(INDEX('Reference Table PCDO'!$G:$G,MIN(IF(COUNTIF(Z2,"*" &'Reference Table PCDO'!$G:$G& "*")>0,ROW('Reference Table PCDO'!$G:$G),""))),'Reference Table PCDO'!$G:$H,2,0),"OTHERS")) ou du moins trouver un programme VBA rendant le meme resultat.

    Mon fichier a 3 colonnes, la premiere (F) est la colonne dans lequel doit s'afficher le resultat de la macro, la seconde (G) contient le resultat de la formule que j'aimerais "traduire" en VBA et enfin la 3eme (Z) contient l'information qui doit me permettre de trouver le resultat (le nom du client ou de sa filliale).

    Le problème est que dans cette 3eme colonne, le nom des clients/filliales est écrit de manière anarchique, ce qui fait qu'un meme client peut avoir plusieurs noms différents. Par exemple en ligne 8, le client "Athlon" peut s'appeler en colonne Z, "ATHLON CAR LEASE NEDERLAND B.V. 1054", "ATHLON CAR LEASE", "ATHLON CAR LEASE NEDERLAND BV", etc ...

    Je dispose dans une feuille de calcul (Reference Table PCDO, colonne F a I) d'un tableau reprenant l'ensemble des noms des filliales ainsi que l'entreprise cliente a laquelle elles sont rattachés. (Par exemple ATHLON NL = ATHLON, JUSTLEASE = ATHLON, ATHLON = ATHLON)

    Je demande de l'aide ici pour créer un calcul VBA faisant comprendre a Excel que si en colonne Z, il trouve "ATHLON CAR LEASE", il comprenne qu'il doit aller chercher la premiere occurence ou il est ecrit ATHLON dans les filliales de mon tableau Reference Table PCDO et qu'il me retourne ensuite le nom du client finale, ATHLON egalement dans l'exemple.

    2eme exemple : Colonne Z = "JUSTLEASE NL NOORD" (ligne 64), Excel identifie "JUSTLEASE" dans "JUSTLEASE NL NOORD", Excel cherche le premier JUSTLEASE dans mon tableau Reference Table PCDO, le trouve en ligne 4, et me retourne ATHLON (nom du client final)

    Je suis parvenu a le faire un Formule Excel (Celle partagé a debut du texte) mais impossible de l'utiliser, mon fichier original a 100 000 lignes et Excel n'arrive pas a faire le calcul pour les 100 000 lignes. Je pense cependant qu'un petit programme VBA pourrait etre plus léger.

    Si quelqu'un sait comment faire je lui en serait infiniement reconnaissant.

    Bien a vous,

  2. #2
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 414
    Par défaut
    Bonjour,

    Une fonction personnalisée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Option Explicit
     
    Public Function TDC(rC As Range) As String      '--- Texte Dans Colonne
        Dim c As Range
        Set rRef = ThisWorkbook.Worksheets("Reference Table PCDO").Range("G:G")
        Set c = rRef.Find(What:=rC.Text, LookAt:=xlWhole)
        If c Is Nothing Then
            TDC = "?"
        Else
            TDC = c.Offset(0, 1)
        End If
    End Function
    Cordialement.
    Fichiers attachés Fichiers attachés

  3. #3
    Membre Expert
    Homme Profil pro
    ingénieur
    Inscrit en
    Mars 2015
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ingénieur
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2015
    Messages : 1 282
    Par défaut
    Bonjour

    vous pouvez déjà simplifier votre formule Excel sans passer par VBA.
    ne pas faire référence à la colonne G en entier, en n'utilisant pas NB.SI ni RECHERCHEV : TROUVE, INDEX EQUIV sont plus efficaces

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SIERREUR(INDEX('Reference Table PCDO'!$H$2:$H$73;EQUIV(VRAI;ESTNUM(TROUVE('Reference Table PCDO'!$G$2:$G$73;Z2));0));"OTHER")
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =IFERROR(INDEX('Reference Table PCDO'!$H$2:$H$73,MATCH(TRUE,ISNUMBER(FIND('Reference Table PCDO'!$G$2:$G$73,Z6)),0)),"OTHER")
    Ensuite en ligne 9, 10, 16, 18, 19, 20, il n'est pas nécessaire de chercher pour la Nième fois "ATHLON CAR LEASE NEDERLAND B.V. 1054", on l'a déjà trouvé en ligne 8
    Donc ajouter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EQUIV(Z2;$Z$2:$Z$100;0)=LIGNE()-1
    si VRAI alors c'est la première occurrence d'un élément, si FAUX on l'a déjà identifié donc un INDEX dans la colonne G suffit

    au final
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    =SI(EQUIV(Z2;$Z$2:$Z$100;0)=LIGNE()-1;
    SIERREUR(INDEX('Reference Table PCDO'!$H$2:$H$73;EQUIV(VRAI;ESTNUM(TROUVE('Reference Table PCDO'!$G$2:$G$73;Z2));0));"OTHER");
    INDEX($G$2:$G$100;EQUIV(Z2;$Z$2:$Z$100;0)))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    IF(MATCH(Z2,$Z$2:$Z$100,0)=ROW()-1,
    IFERROR(INDEX('Reference Table PCDO'!$H$2:$H$73,MATCH(TRUE,ISNUMBER(FIND('Reference Table PCDO'!$G$2:$G$73,Z2)),0)),"OTHER"),
    INDEX($G$2:$G$100,MATCH(Z2,$Z$2:$Z$100,0)))
    Enfin, l'utilisation des tableaux "structurés" est fortement conseillé (Insertion/Tableau)

    Stéphane

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Mars 2023
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Mars 2023
    Messages : 3
    Par défaut
    Bonjour @EricDgn, Merci pour la fonction personnalisée mais elle ne résoud qu'une partie de mon problème puisque lorsque que le nom de la de la filliale ou du client n'est pas seul dans sa case, ta fonction ne semble pas etre en mesure de le trouver. J'ai testé avec "ATHLON CAR LEASE" et puisque il y a "CAR LEASE" apres "ATHLON", ta fonction me retourne "?" alors que je souhaiterai que elle me retourne "ATHLON".

    Tu saurais comment faire ?

    Bien a toi,

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Mars 2023
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Mars 2023
    Messages : 3
    Par défaut
    Bonjour @Raccourcix,

    Merci pour ta proposition de Formule Excel, elle marche aussi bien que la mienne mais ... Elle a l'air beaucoup plus rapide ! Je vais l'essayer sur mes 100 000 données. Je te dirais si elle est vraiment efficace niveau temps.

    Bien a toi !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comparaison texte correspondant à une date
    Par sevlev59 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 30/04/2013, 17h33
  2. Recherche d'un texte dans une variable
    Par Cj_Dal dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 11/06/2010, 19h04
  3. Réponses: 1
    Dernier message: 23/12/2008, 14h43
  4. Recherche d'un texte dans une feuille et recuperation des coordonnees
    Par Youpititi dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 21/11/2008, 08h48
  5. [VBA-E]séparateur de texte dans une cellule
    Par desdenova dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 11/04/2006, 16h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo