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 :

WorksheetFunction.Match avec 2 critères [XL-365]


Sujet :

Macros et VBA Excel

  1. #1
    Membre émérite Avatar de curt
    Homme Profil pro
    Ingénieur Etudes
    Inscrit en
    Mars 2006
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Etudes
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 566
    Points : 2 525
    Points
    2 525
    Par défaut WorksheetFunction.Match avec 2 critères
    Bonjour à tous,

    sur une feuille, j'ai deux colonnes non-contigües (A et H) dans lesquelles j'ai des valeurs dont la concaténations est à chercher depuis la concaténation de deux valeurs (Entity.Handle & AcadApp.ActiveDocument.FullName)
    Je souhaite trouver le numéro de la ligne où on retrouve cette dernière valeur.

    J'en suis là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Ligne = WorksheetFunction.Match(Entity.Handle & AcadApp.ActiveDocument.FullName, Range("A4:A" & Split(Range("A4").CurrentRegion.Address, "$")(4)) & Range("H4:H" & Split(Range("H4").CurrentRegion.Address, "$")(4)), 0)
    Impossible de faire fonctionner cette ligne - Au moins, aucune erreur n'apparait à la compilation mais je n'ai pas le résultat attendu
    Pas de demande par MP, sinon j'correctionne plus, j'dynamite, j'disperse, j'ventile !!!
    ---------------------------------------------------------------------
    Vous avez un talent insoupçonné... Faites-en profitez les autres. Un p'tit CLIC pour une grande cause.
    Et si vous faisiez un bon geste en 2024 ? Soyez utile, ça vous changera ! Moi, ça m’a changé !

  2. #2
    Membre chevronné
    Inscrit en
    Septembre 2007
    Messages
    1 132
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 132
    Points : 1 803
    Points
    1 803
    Par défaut
    Bonsoir,

    Je conçois bien que faire la recherche avec une seule ligne doit pouvoir se faire
    mais concaténer deux colonnes dont la taille risque d'être différente me chiffonne un peu.
    Personnellement je commencerais par calculer la taille des colonnes,
    cela simplifierait et sécuriserait les paramètres de la ligne de recherche.

    C'est une idée à tester éventuellement.

  3. #3
    Membre émérite Avatar de curt
    Homme Profil pro
    Ingénieur Etudes
    Inscrit en
    Mars 2006
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Etudes
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 566
    Points : 2 525
    Points
    2 525
    Par défaut
    Bonjour, j'ai oublié de noter que les deux colonnes auront toujours le même nombre de lignes.
    Pas de demande par MP, sinon j'correctionne plus, j'dynamite, j'disperse, j'ventile !!!
    ---------------------------------------------------------------------
    Vous avez un talent insoupçonné... Faites-en profitez les autres. Un p'tit CLIC pour une grande cause.
    Et si vous faisiez un bon geste en 2024 ? Soyez utile, ça vous changera ! Moi, ça m’a changé !

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

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 240
    Points : 5 655
    Points
    5 655
    Par défaut
    Bonjour,

    Si on employait une formule excel, on écrirait quelque chose dans ce genre, du moins sous cette forme (en matriciel, à valider avec CTRL + SHIFT + ENTREE)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =EQUIV(1;($A$1:$A$100=$E$1)*($H$1:$H$100=$F$1);0)
    ramené à votre ligne de code, ça pourrait donner ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Ligne = WorksheetFunction.Match(1, (Range("A4:A" & Split(Range("A4").CurrentRegion.Address, "$")(4)) = Entity.Handle) * (Range("H4:H" & Split(Range("H4").CurrentRegion.Address, "$")(4)) = AcadApp.ActiveDocument.FullName), 0)
    Evidemment, je ne peux pas les tester.

    Cdlt

  5. #5
    Membre émérite Avatar de curt
    Homme Profil pro
    Ingénieur Etudes
    Inscrit en
    Mars 2006
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Etudes
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 566
    Points : 2 525
    Points
    2 525
    Par défaut
    Bonjour Arturo83,

    et merci pour cette réponse matinale.
    Pourtant autant la formule fonctionne parfaitement, autant le code me renvoi 0
    J'ai modifiée pour avoir une plage fixe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Ligne = WorksheetFunction.Match(1, (Range("A4:A100"  = Entity.Handle) * (Range("H4:H100"  = AcadApp.ActiveDocument.FullName), 0)
    mais sans succès..
    Pourtant en vérifiant le contenu des 2 variables (Entity.Handle et AcadApp.ActiveDocument.FullName) tout devrait fonctionner.
    Je continu à creuser - encore merci
    Pas de demande par MP, sinon j'correctionne plus, j'dynamite, j'disperse, j'ventile !!!
    ---------------------------------------------------------------------
    Vous avez un talent insoupçonné... Faites-en profitez les autres. Un p'tit CLIC pour une grande cause.
    Et si vous faisiez un bon geste en 2024 ? Soyez utile, ça vous changera ! Moi, ça m’a changé !

  6. #6
    Membre chevronné
    Inscrit en
    Septembre 2007
    Messages
    1 132
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 132
    Points : 1 803
    Points
    1 803
    Par défaut
    Bonjour curt,

    le code me renvoi 0
    Lorsque l'on veux utiliser ta fonction sur la feuille il faut la valider en matriciel.

    Je pense que c'est ce qui manque dans ta formule pour qu'elle puisse fonctionner.

    Si tu l'insères sur une feuille avec FormulaArray elle devrait fonctionner et tu peux récupérer le résultat.










    j

  7. #7
    Membre émérite Avatar de curt
    Homme Profil pro
    Ingénieur Etudes
    Inscrit en
    Mars 2006
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Etudes
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 566
    Points : 2 525
    Points
    2 525
    Par défaut
    Merci anasecu,

    j'en arrive au même constat.
    je vais voir à passer par un [formula.array], c'est à dire copier la formule dans la cellule qui affichera le résultat
    J'ai vu sur le site une discussion de P. TOULON sur le sujet
    Dommage tout de même de ne pas pouvoir faire passer une ligne vba en matriciel

    PS : Je laisse le fil ouvert au cas où quelqu'un aura une solution plus directe.
    Pas de demande par MP, sinon j'correctionne plus, j'dynamite, j'disperse, j'ventile !!!
    ---------------------------------------------------------------------
    Vous avez un talent insoupçonné... Faites-en profitez les autres. Un p'tit CLIC pour une grande cause.
    Et si vous faisiez un bon geste en 2024 ? Soyez utile, ça vous changera ! Moi, ça m’a changé !

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

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 240
    Points : 5 655
    Points
    5 655
    Par défaut
    Curt, dans votre formule, il me semble qu'il manque des parenthèses

    Ligne = WorksheetFunction.Match(1,((Range("A4:A100") = Entity.Handle) * ((Range("H4:H100") = AcadApp.ActiveDocument.FullName), 0)

    mais, il est fort possible qu'il faille penser autrement.

    je pense à quelque chose comme cela, mais pas encore bon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Ligne = Application.Evaluate("=application.worksheetfunction.match(1,(A4:A100= Entity.Handle)*(H4:H100=AcadApp.ActiveDocument.FullName),0)")

  9. #9
    Membre émérite Avatar de curt
    Homme Profil pro
    Ingénieur Etudes
    Inscrit en
    Mars 2006
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Etudes
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 566
    Points : 2 525
    Points
    2 525
    Par défaut
    Encore merci Arturo,

    j'ai un autre palliatif:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For Ligne = 4 To Range("A" & Rows.Count).End(xlUp).Row
       If Range("A" & Ligne).Value = Entity.Handle And Range("h" & Ligne).Value = AcadApp.ActiveDocument.FullName Then Exit For
    Next
    ça me permet de capter la valeur de la ligne où on a la correspondance recherchée.
    Ta deuxième solution fonctionne - Dommage tout de même de ne pas pouvoir accéder au calcul matriciel directement par VBA.
    Encore merci
    Pas de demande par MP, sinon j'correctionne plus, j'dynamite, j'disperse, j'ventile !!!
    ---------------------------------------------------------------------
    Vous avez un talent insoupçonné... Faites-en profitez les autres. Un p'tit CLIC pour une grande cause.
    Et si vous faisiez un bon geste en 2024 ? Soyez utile, ça vous changera ! Moi, ça m’a changé !

  10. #10
    Membre chevronné
    Inscrit en
    Septembre 2007
    Messages
    1 132
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 132
    Points : 1 803
    Points
    1 803
    Par défaut
    Bonsoir,

    Finalement ta solution basique résout parfaitement sa fonction même si je pense qu'il y en a un qui va réagir sur ta sortie.

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

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 240
    Points : 5 655
    Points
    5 655
    Par défaut
    Bonjour,

    Le but étant quand même de se passer d'une boucle, je suis arrivé à ceci, toujours avec "Evaluate":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Ligne = Evaluate("MAX(ROW(A4:H100)*(A4:A100=Entity.Handle)*(H4:H100=AcadApp.ActiveDocument.FullName))")
    j'ai fait le test sur un tableau où je devais chercher la valeur X dans la colonne A et la valeur Y dans la colonne H, et ça fonctionne bien; formule utilisée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Ligne = Evaluate("MAX(ROW(A4:H100)*(A4:A100=""X"")*(H4:H100=""Y""))")
    Cdlt

  12. #12
    Membre émérite Avatar de curt
    Homme Profil pro
    Ingénieur Etudes
    Inscrit en
    Mars 2006
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Etudes
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 566
    Points : 2 525
    Points
    2 525
    Par défaut
    Bonsoir à tous,

    il m'auras fallu du temps, mais je tiens la solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Ligne = Evaluate("MATCH(" & Chr(34) & Entity.Handle & AcadApp.ActiveDocument.FullName & Chr(34) & ",A2:A" & Range("A" & Rows.Count).End(xlUp).Row & "&H2:H" & Range("H" & Rows.Count).End(xlUp).Row & ",0)") + 1
    La vitesse d’exécution est d'ailleurs bien meilleures qu'avec ma solution "peu élégante" avec une boucle.
    Merci à tous ceux qui m'ont apporté leur précieuse lumière.
    Pas de demande par MP, sinon j'correctionne plus, j'dynamite, j'disperse, j'ventile !!!
    ---------------------------------------------------------------------
    Vous avez un talent insoupçonné... Faites-en profitez les autres. Un p'tit CLIC pour une grande cause.
    Et si vous faisiez un bon geste en 2024 ? Soyez utile, ça vous changera ! Moi, ça m’a changé !

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

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 240
    Points : 5 655
    Points
    5 655
    Par défaut
    Bonjour,

    Félicitations, pour ma part, j'avais abandonné l'utilisation avec "MATCH" car je n'y été pas arrivé (perdu au milieu de tous ces guillemets et parenthèses), et choisi une autre option avec "MAX".
    Encore bravo.

    Cdlt

  14. #14
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 947
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 947
    Points : 9 275
    Points
    9 275
    Par défaut
    Hello,
    Peut-être aussi en utilisant un filtre automatique ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    With ActiveSheet
    .Range("A1").AutoFilter field:=1, Criteria1:= Entity.Handle ' colonne A
    .Range("A1").AutoFilter field:=8, Criteria1:= AcadApp.ActiveDocument.FullName ' colonne H
    Debug.Print .Range("A2:A" & Rows.Count).SpecialCells(xlVisible)(1).Row ' 1ère ligne trouvée
    ' .AutoFilterMode = False ' Désactivation Filtre Auto
    If .AutoFilterMode Then .AutoFilter.ShowAllData ' Effacement Filtre Auto
    End With
    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  15. #15
    Membre émérite Avatar de curt
    Homme Profil pro
    Ingénieur Etudes
    Inscrit en
    Mars 2006
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Etudes
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 566
    Points : 2 525
    Points
    2 525
    Par défaut
    Merci pour cette option mais le but est d'identifier des lignes (je les passe en couleur rouge ou verte selon un choix) sans pour autant avoir à FILTRER / DÉFILTRER.
    Mais cette solution reste intéressante - merci
    Pas de demande par MP, sinon j'correctionne plus, j'dynamite, j'disperse, j'ventile !!!
    ---------------------------------------------------------------------
    Vous avez un talent insoupçonné... Faites-en profitez les autres. Un p'tit CLIC pour une grande cause.
    Et si vous faisiez un bon geste en 2024 ? Soyez utile, ça vous changera ! Moi, ça m’a changé !

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

Discussions similaires

  1. Fonction Match avec 2 critères sur 2 plages
    Par Marianne Hbt dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 11/07/2019, 08h25
  2. EXCEL : fonction SOMME.SI avec 2 critères
    Par repié dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 17/03/2016, 17h10
  3. [XL-2003] VBA - Problème avec WorksheetFunction.Match
    Par oracle7556 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 08/07/2010, 16h02
  4. requete avec le critére oui/non
    Par eldindon dans le forum Access
    Réponses: 4
    Dernier message: 02/03/2006, 16h57
  5. Dlookup avec 2 critères?
    Par hocine dans le forum Access
    Réponses: 2
    Dernier message: 05/01/2006, 11h13

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