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 :

Recherche verticale selon 2 critères dans 2 colonnes


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 85
    Par défaut Recherche verticale selon 2 critères dans 2 colonnes
    Bonjour,

    Je voudrais faire une recherche verticale selon 2 critères dans 2 colonnes en VBA.
    Les formules INDEX et EQUIV semblent être prometteuses, à l'image de ce qui est fait dans cette image (issue du cours https://silkyroad.developpez.com/excel/indexequiv/) :
    Nom : IndexEquiv.jpg
Affichages : 1092
Taille : 89,0 Ko
    Cela se complique quand j'essaie de passer au VBA, que ce soit :
    • avec les fonctions "Application.WorksheetFunction.Index" et "Application.WorksheetFunction.Match", car je ne vois pas comment faire les tests logiques dans l'exemple
    • avec la fonction Application.Evaluate (et les formules INDEX/EQUIV), car je pense que je dois passer à côté de quelque chose concernant le fait que ce soit une formule matricielle
    • avec les fonctions SumIfs ou ProductIfs, ça ne marche pas car mon résultat est du texte pas des chiffres comme dans l'exemple...

    Quoique je fasse, j'obtiens une erreur d'incompatibilité de type 13 (Erreur2015 dans l'espion)...
    Je voudrais éviter de faire des boucles et utiliser les fonctions existantes.
    J'ai parcouru de nombreux forums sans trouver mon bonheur.

    Est-ce que quelqu'un aurait une fonction déjà faite permettant de faire ce que je recherche?
    Grand merci.

  2. #2
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 241
    Par défaut
    Bonjour,

    Il suffit d'utiliser l'enregistreur de macro (faut-il encore que la formule soit juste, dans votre cas, INDEX doit couvrir les 3 colonnes du tableau et pas uniquement la colonne C) et glisser le résultat dans une macro.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Range("E10").FormulaArray = "=INDEX(R8C1:R20C3,MATCH(1,(R8C1:R20C1=R6C5)*(R8C2:R20C2=R7C5),0),3)"
    ou bien une fonction personnalisée:
    en E10: formule: =RecherchePrix(A9:A20;E6;E7)

    le code:
    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
    Function RecherchePrix(PlageRef As Range, Ref As String, Nb As Range) As Long
        Range("E10").ClearContents
        DerLig = Range("A" & Rows.Count).End(xlUp).Row
        r = Application.Match(Ref, PlageRef, 0) + 8
        If r <> 0 Then
            i = r - 1
            Do
                i = i + 1
                If Cells(i, "A") = Ref And Cells(i, "B") = Nb Then
                    RecherchePrix = Cells(i, "C")
                    Exit Function
                End If
            Loop While i <= DerLig And Cells(i, "B") <> Nb
        End If
    End Function
    Cdlt

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 85
    Par défaut
    Citation Envoyé par ARTURO83 Voir le message
    Bonjour,
    Il suffit d'utiliser l'enregistreur de macro (faut-il encore que la formule soit juste, dans votre cas, INDEX doit couvrir les 3 colonnes du tableau et pas uniquement la colonne C)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Range("E10").FormulaArray = "=INDEX(R8C1:R20C3,MATCH(1,(R8C1:R20C1=R6C5)*(R8C2:R20C2=R7C5),0),3)"
    Cdlt
    Bonjour,

    Merci pour votre réponse.

    La formule (issue du site) fonctionne parfaitement dans une feuille de calcul Excel, mais peut-être que vous voulez dire que ce n'est pas suffisant pour que cela marche via du code VBA?

    En tout cas, je me rend compte que je me suis mal exprimé, je ne cherche pas à mettre la formule dans une cellule, comme vous semblez le proposer, mais mettre le résultat de la formule dans une variable VBA.

    P.S. : L'enregisteur de macro a bien entendu été mon premier réflexe

    Encore merci.

  4. #4
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 241
    Par défaut
    Alors ceci:

    la variable PrixRetenu récupère la valeur
    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
    Sub V_RecherchePrix()
        Ref = Range("E6").Value
        Nb = Range("E7").Value
        Range("E10").ClearContents
        DerLig = Range("A" & Rows.Count).End(xlUp).Row
        r = Application.Match(Ref, Range("A9:A20"), 0) + 8
        If r <> 0 Then
            i = r - 1
            Do
                i = i + 1
                If Cells(i, "A") = Ref And Cells(i, "B") = Nb Then
                    PrixRetenu = Cells(i, "C")
                    Exit Sub
                End If
            Loop While i <= DerLig And Cells(i, "B") <> Nb
        End If
    End Sub

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 85
    Par défaut
    Intéressant, si je ne me trompe pas, cela permet d'aller à la première occurrence du 1er critère, et de parcourir les lignes suivantes pour vérifier le 2ème critère. Je voulais éviter les boucles, mais c'est déjà un compromis.
    Cela suppose aussi que les données de la première colonne soient correctement triées pour être adjacentes, ce qui est le cas dans l'exemple, mais qui ne sera pas forcément le cas pour mon cas pratique.

    Je mets de côté en attendant de voir si quelqu'un a mieux à proposer.
    Merci.

  6. #6
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 169
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Je ne connais pas la finalité de votre projet mais à votre place, je mettrais dans une cellule la formule qui me renvoie le résultat avec critères que je lirais ensuite par VBA. c'est une ligne de code et si les critères changent, il suffit par VBA de modifier ceux-ci
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

Discussions similaires

  1. [XL-2010] Supprimer lignes entieres selon critère dans une colonne
    Par Freudsw dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 28/09/2015, 17h27
  2. Réponses: 0
    Dernier message: 03/04/2014, 14h50
  3. Chercher une ligne selon deux critère dans un formulaire
    Par abdelkarim_1987 dans le forum Excel
    Réponses: 0
    Dernier message: 16/09/2013, 11h05
  4. Réponses: 1
    Dernier message: 21/01/2011, 10h17
  5. [XL-2003] Additionner sommes selon 2 critéres dans UserForm
    Par NEC14 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 27/01/2010, 08h41

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