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 - Problème avec WorksheetFunction.Match [XL-2003]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 66
    Par défaut VBA - Problème avec WorksheetFunction.Match
    Bonsoir à tous,

    Voilà mon problème :

    1 - lorsque sous EXCEL dans une cellule je place la formule suivante :
    (sachant que CIPD_NoCAT et CIPD_RefFAB sont 2 plages nommées)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {=EQUIV(1; (CIPD_NoCAT = A4) * (CIPD_RefFAB = H4);0)}
    Tout se passe bien et j'obtiens bien le résultat escompté à savoir l'index de la ligne répondant aux 2 critères contenus dans les cellules A4 et H4.

    2 - Maintenant, je souhaite reproduire cette recherche d'index de ligne sur les mêmes critère mais cette fois en VBA.
    Dans une macro j'ai donc une ligne du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    On Error Resume Next
    dPos = WorksheetFunction.Match(1, ([CIPD_NoCAT] = vNoCAT) * ([CIPD_RefFAB] = vRefFAB), 0)
    If Err.Number = 1004 Then
        .... Si ligne non trouvée
    Sachant que mes 2 critères de recherche sont stockés dans respectivement les variables 'vNoCAT' et 'vRefFAB' et que l'on a toujours les 2 mêmes plages nommées qu'en version EXCEL ci-dessus.

    Dans ce cas la fonction 'WorksheetFunction.Match' me renvoie toujours une erreur (pas forcément N°1004) et donc je n'arrive pas à obtenir mon index de ligne. Je précise qu'il existe bien une ligne répondant aux 2 critères !

    Aussi j'en fais appel à vous pour m'aider à corriger ce qui ne va pas dans mon code VBA car je tourne en rond depuis quelques temps maintenant.

    Merci d'avance
    Cordialement
    oracle7556

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Par défaut
    Salut oracle7556 et le forum
    Je n'ai pas regardé, n'utilisant que rarement les fonctions de feuille de calcul en VBA (il y a d'autres méthodes), mais
    En feuille, Faux=0 et le reste = Vrai, alors que
    En VBA Vrai=-1 et le reste = FAUX
    Ton erreur vient peut-être de là. Une boucle avec un test et AND serait à mon sens plus profitable (ou un Find)
    A+

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    Utilise plutôt EVALUATE, car je pense que Worsheetfunction n'accepte pas la validation matricielle, alors que EVALUATE interprétera la chaine passée comme matricielle si tu lui passes les plages
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Evaluate("MATCH(1,(CIPD_NoCAT=""" & vNoCat & """)*(CIPD_RefFAB=""" & vRefFab & """),0)")
    Cela te permettra d'éviter les boucles qui sont toujours plus lourdes que les fonctions natives et d'avoir un code plus concis, et donc plus maintenable.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  4. #4
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 66
    Par défaut
    Bonjour à tous,

    @Gorfael
    Merci de ta réponse mais je retiendrais plutôt celle de Pierre Fauconnier qui est plus adaptée à mon problème.
    A+

    @Pierre Fauconnier
    Merci aussi pour ta réponse. en passant par 'evaluate' cela marche. j'avais bien essayé auparavant de poser ma question mais je n'écrivais pas correctement l'instruction du coup cela ne marchait pas.
    Maintenant avec la bonne syntaxe c'est nickel.

    Toutefois, il se pose un nouveau problème : comment gérer l'erreur si la fonction 'match' ne trouve pas la ligne voulue (voir mon exemple ci-dessus).
    Lorsque j'utilise une recherche avec un seul critère tel que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    On Error Resume Next
    dPos = WorksheetFunction.Match(vNoCAT, [CIPD_NoCAT], 0)
    If Err.Number = 1004 Then
        .... si ligne non trouvée
    pas de soucis l'erreur 1004 est bien levée et je peut traiter en conséquence.

    Mais maintenant avec l'emploi de la fonction 'evaluate' sur ce type de recherche à 2 critères, je récupère dans ce cas à priori une erreur n°13 (de type) alors que normalement la fonction 'match' renvoie '#NA' si elle n'a pu trouver de correspondance du critère dans la plage indiquée.
    Du coup je ne sais plus faire. Comment gérer alors ce cas de figure quand une ligne n'est pas trouvée ? As-tu une idée ?

    Merci de ta réponse éclairée.
    Cordialement
    oracle7556

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    En fait, EVALUATE permet d'évaluer une formule telle qu'elle serait passée en Excel version anglaise.

    Dès lors, tu peux la rédiger dans une feuille Excel
    =SI(ESTNA(EQUIV(1;(CIPD_NoCAT=A4)*(CIPD_RefFAB=H4);0));"";EQUIV(1;(CIPD_NoCAT=A4)*(CIPD_RefFAB=H4);0))
    dans une cellule, puis tu récupères la formule (à l'anglaise) en VBA dans la fenêtre d'exécution (Ctrl+G) via par exemple
    pour récupérer
    =IF(ISNA(MATCH(1,(CIPD_NoCAT=A4)*(CIPD_RefFAB=H4),0)),"",MATCH(1,(CIPD_NoCAT=A4)*(CIPD_RefFAB=H4),0))
    Tu recopies en paramètre de EVALUATE en modifiant ce qui doit l'être.

    Dans ton cas, la ligne Evaluate(...) devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Evaluate("IF(ISNA(MATCH(1,(CIPD_NoCAT=""" & vNoCat & """)*(CIPD_RefFAB=""" & vRefFab & """),0)),"""", Match(1, (CIPD_NoCAT = A4) * (CIPD_RefFAB = H4), 0))")
    Donc, dans ton cas et avec la formule que je propose, EVALUATE() renvoie soit une valeur, soit une chaine vide, et tu testes la réponse avec un bloc IF... End If
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  6. #6
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 66
    Par défaut
    Bonjour à tous,

    @Pierre Fauconnier

    MERCI, ta solution marche nickel.
    Le problème est donc résolu.

    MERCI encore de ton aide.
    Cordialement
    oracle7556

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

Discussions similaires

  1. problème avec l'apostrophe dans une requête
    Par mika0102 dans le forum VBA Access
    Réponses: 7
    Dernier message: 09/03/2019, 16h51
  2. [VBA]problème avec SaveAs
    Par porki dans le forum Access
    Réponses: 3
    Dernier message: 29/05/2006, 14h52
  3. [VBA]problème avec le debogage
    Par norkius dans le forum Access
    Réponses: 1
    Dernier message: 22/05/2006, 14h15
  4. [VBA] Problème avec composant VB6
    Par Diablo_22 dans le forum Général VBA
    Réponses: 8
    Dernier message: 16/03/2006, 20h41
  5. [Requete SQL en VBA] Problème avec la fonction FLOOR
    Par zubral dans le forum Langage SQL
    Réponses: 4
    Dernier message: 13/07/2004, 13h24

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