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 :

Application.Match avec un Array et un spit [XL-2013]


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    Homme Profil pro
    Constructeur ossature bois
    Inscrit en
    Mars 2014
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Constructeur ossature bois
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mars 2014
    Messages : 897
    Points : 650
    Points
    650
    Par défaut Application.Match avec un Array et un spit
    Bonsoir à tous,

    Je viens vers vous car la je bugge.....

    J'ai un Array du type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tablo = Array("Mâles", "Hongres", "Femelles", "juments")
    et un split du type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    chaine = "Pour juments de 7, 8 et 9 ans (V, U et T), n'ayant pas gagné 263.000 €"
    splitchaine = Split(chaine, " ")
    Je souhaite en fonction de l'Array trouver dans le split, un des 4 arguments de l'Array, mais en vain, il me renvoit "Trouvé" à chaque fois....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Sub Essai()
    tablo = Array("Mâles", "Hongres", "Femelles", "juments")
    chaine = "Pour juments de 7, 8 et 9 ans (V, U et T), n'ayant pas gagné 263.000 €"
    splitchaine = Split(chaine, " ")
     
    For a = LBound(tablo) To UBound(tablo)
        For s = 0 To UBound(splitchaine)
            On Error Resume Next
            If IsError(Application.Match(splitchaine(s), tablo(a), 0)) Then
            'If IsError(Application.Match(tablo(a), splitchaine(s), 0)) Then
                MsgBox "trouvé"
            Else
                MsgBox "non trouvé"
            End If
            On Error GoTo 0
        Next
    Next
    End Sub
    J'ai également essayé de la façon "Scripting.dictionary" que est une manière élégante et relativement rapide...Il y a un truc que je n'ai pas du comprendre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    'On recherche dans chaine, la présence de mots dans tablo.
    Sub recherche()
    tablo = Array("Mâles", "Hongres", "Femelles", "juments")
    chaine = "Pour juments de 7, 8 et 9 ans (V, U et T), n'ayant pas gagné 263.000 €"
    splitchaine = Split(chaine, " ")
       Application.ScreenUpdating = False
       Set d = CreateObject("Scripting.Dictionary")
       For Each C In tablo
       d.Add C.Value, C.Value
     
       Next C
      For j = LBound(splitchaine) To UBound(splitchaine)
                If d.Exists(splitchaine(j)) Then MsgBox splitchaine(j)
            Next j
     End Sub
    je sollicite votre aide pour me dépatouiller avec ces 2 solutions afin que je comprenne mon erreur dans les 2 sub

    Merci d'avance
    seb

  2. #2
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    3 pour le prix de 2 qu'en dis-tu ?

    1) Match

    Ta fonction match doit comporter :

    - 1 string à rechercher : chaque valeur de tablo
    - 1 MATRICE de recherche : le split COMPLET de ta chaine
    - le type de recherche : 0 pour correspondance exacte

    en modifiant simplement les parties que j'ai mis en majuscule :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub EssaiMatch()
    tablo = Array("Mâles", "Hongres", "Femelles", "juments")
    chaine = "Pour juments de 7, 8 et 9 ans (V, U et T), n'ayant pas gagné 263.000 €"
    splitchaine = Split(chaine, " ")
        For a = LBound(tablo) To UBound(tablo)
            ' ON FAIT LA RECHERCHE DANS LE splitchaine COMPLET
            If Not IsError(Application.Match(tablo(a), splitchaine, 0)) Then
                MsgBox "trouvé " & tablo(a)
            Else
                MsgBox "non trouvé " & tablo(a)
            End If
        Next
    End Sub
    Tu pourras donc virer le cas "Else", j'ai inversé ton test avec le "Not"


    2) Dictionary

    Si tu veux vraiment pas déclarer tes variables, garde toujours en tête que VBA va typer à ta place.
    En l’occurrence, C est déjà un string, tu n'a donc pas de propriété "Value", fais directement référence à C quand tu l'ajoute au dictionnaire

    par ailleurs, tu ne prévois pas le cas où l'élément existe déjà, ce qui te jouera des tours tôt ou tard.
    Tu as deux solutions :

    - On error resume Next / faire l'ajout / on error goto 0
    - test avec un If : if d.Exists("élément) Then .... ajout

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Sub EssaiDictionary()
    tablo = Array("Mâles", "Hongres", "Femelles", "juments")
    chaine = "Pour juments de 7, 8 et 9 ans (V, U et T), n'ayant pas gagné 263.000 €"
    splitchaine = Split(chaine, " ")
     
        Set d = CreateObject("Scripting.Dictionary")
        For Each C In tablo
             ' TOUJOURS TESTER L'EXISTENCE DE LA CLE QU ON AJOUTE
             If Not d.exists(C) Then d.Add C, C
                                         ' ON FAIT REFERENCE A "C" QUI EST DEJA UN STRING
        Next C
     
        For j = LBound(splitchaine) To UBound(splitchaine)
            If d.exists(splitchaine(j)) Then MsgBox splitchaine(j)
        Next j
    End Sub

    3) Bonus : fonction Instr

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub EssaiInstr()
    tablo = Array("Mâles", "Hongres", "Femelles", "juments")
    chaine = "Pour juments de 7, 8 et 9 ans (V, U et T), n'ayant pas gagné 263.000 €"
        For a = LBound(tablo) To UBound(tablo)
            ' instr = 0 veut dire que la sous-chaine n'existe pas dans la chaine principale
            If InStr(1, chaine, tablo(a)) > 0 Then
                MsgBox "trouvé " & tablo(a)
                Exit For
            End If
        Next a
    End Sub

    Fait tes courses parmi les choix !

    Ps : si tu veux trouver la position de l'élément testé, t'as tous les outils dans ces exemples ... petit exercice pratique pour toi !
    Si tu coinces, reviens avec ton exemple qui fonctionne pas

  3. #3
    Membre éclairé
    Homme Profil pro
    Constructeur ossature bois
    Inscrit en
    Mars 2014
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Constructeur ossature bois
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mars 2014
    Messages : 897
    Points : 650
    Points
    650
    Par défaut
    Salut Joe,

    Alors là chapeau bas, c que du bonheur et je n'en demandai pas tant...

    En plus c très clair, en faite j'en étais pas si loin....

    Merci beaucoup
    Sébastien

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

Discussions similaires

  1. [XL-2007] Problème avec la fonction Application.match
    Par la_fouine1806 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/02/2013, 14h40
  2. probleme avec un array
    Par kaygee dans le forum ASP
    Réponses: 8
    Dernier message: 26/03/2007, 12h33
  3. Application multiplateforme avec interface graphique
    Par TNorth dans le forum Choisir un environnement de développement
    Réponses: 2
    Dernier message: 31/01/2004, 18h55
  4. Réponses: 2
    Dernier message: 26/05/2003, 19h42
  5. [Kylix] application console avec kylix 3 ?
    Par Hakim dans le forum EDI
    Réponses: 4
    Dernier message: 15/11/2002, 22h45

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