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 :

optimisation pour identifier lignes avec 2 critères + indexer pour récupérer valeurs 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
    Chargé d'affaire
    Inscrit en
    Octobre 2014
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Octobre 2014
    Messages : 163
    Par défaut optimisation pour identifier lignes avec 2 critères + indexer pour récupérer valeurs colonnes
    Bonjour à tous,

    je souhaite pouvoir récupérer les informations contenues sur une ligne à identifier
    je ne connais que deux critères pour identifier la ligne en question et ensuite récupérer en les informations.

    1) Id_Projet en colonne A
    2) WP_Id en colonne B


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Set WP_page = Worksheets("Work-Packages")
    Current_WP_Id = List_WorkPackages.Column(0)
     
    fin = Range("A" & Rows.Count).End(xlUp).Row
    For i = 2 To fin
     If WP_page.Cells(i, "A") = Id_Project And WP_page.Cells(i, "B") = Current_WP_Id Then
       Match_WP_Line = i
       End If
       Next
    cela me permets désormais d'obtenir la ligne concernée: Match_WP_Line
    je pense déjà que cette première partie peut s'écrire plus simplement via un match mais ne sait pas comment procéder avec plus d'1 critère.

    par ailleurs et en vue de pouvoir désormais récupérer les infos après je procède comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WP_Start_Date = WP_page.Cells(Match_WP_Line, 6)

    mon code ne me paraissant pas optimal je m'en remet à vos avis afin de pouvoir simplement récupérer les infos dans les colonnes de la ligne concernée
    si quelqu'un avait une idée.

    merci par avance

  2. #2
    Membre Expert
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 703
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 703
    Par défaut
    Bonjour,

    Plusieurs propositions selon tes données et ce que tu veux en faire (dans tous les cas, il faut que le couple ID+WP soit unique) :

    1. Créer une clef
    Tu ajoutes une colonne "Clef" dans ton tableau et tu fais la recherche sur cette clef. La clef = concaténation de ID et WP.
    Nom : Forum24.PNG
Affichages : 83
Taille : 11,4 Ko
    Ensuite tu fais une recherche du terme concaténé avec Match ou Find.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Set WP_page = Worksheets("Work-Packages")
    Current_WP_Id = List_WorkPackages.Column(0)
     
    fin = Range("A" & Rows.Count).End(xlUp).Row
     
    Match_WP_Line = Range("A2:A" & fin).Find(Id_Project & WP_page).Row
    2. Utiliser 2x Find
    Condition : les colonnes sont triées :
    Nom : Forum25.PNG
Affichages : 119
Taille : 6,5 Ko
    1. Tu fais une recherche avec Find sur ID => cela te permet de trouver le premier projet avec l'ID voulu
    2. Tu fais une recherche avec Find sur WP à partir de la ligne du 1er ID (trouvée ci-dessous).

    Nom : Forum26.PNG
Affichages : 86
Taille : 102,9 Ko

    3. Filtrer sur l'ID et le WP voulu et copier-coller
    Si le but derrière est de copier-coller les données de l'ID/WP voulu, tu peux aussi filtrer sur la liste et copier-coller le résultat.
    Pour savoir comment filtrer et copier-coller en VBA => enregistreur de macro.


    EDIT : dans mon exemple dans la proposition 2, je me suis trompée entre 2 et 3, mais ça se comprend hein

  3. #3
    Membre Expert Avatar de mfoxy
    Homme Profil pro
    Automation VBA
    Inscrit en
    Février 2018
    Messages
    752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Automation VBA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2018
    Messages : 752
    Par défaut
    Bonjour Darkangel2014,


    Sans une seul ligne de code vba, je vous conseille la lecture de ce billet
    Power query et disponible en add-in sur la version 2010 d'office et intégré depuis la v 2013 si je ne me trompe.

    https://www.developpez.net/forums/d2...uelques-clics/

    Bàv,

    MFoxy

  4. #4
    Membre confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2014
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Octobre 2014
    Messages : 163
    Par défaut
    Bonjour,

    Merci à Riaolle pour tous ces éléments de réponse et précisions.
    dans mon cas, le but est d’optimiser au mieux afin de ne pas alourdir ni mon doc ni mon userform.

    aussi quelle solutions serait la plus performante entre une clef concaténée et la méthode find en deux étapes?

    A tout hasard j'ai tenté le concat mais rencontre un soucis
    j'ai fais un concat different du fait qu'il s'agit pour les 2 id de chiffres
    j'ai fais =A1 &"-"&B1

    du coup j'ai mis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MatchLine = Range("A2:A" & fin).Find(Id_Project & "-" & WP_page).Row
    mais ca me donne une erreur propriété ou méthode non gérée par cet objet
    Où est mon érreur? merci

    @Mfoxy, merci pour ce partage je vais en prendre connaissance mais ne connaissant rien a powerquery est ce utilisable sous vba? je vais lire toutefois le document pour apprendre mais à première vue utilisable sous excel tableur.

    en tout cas merci à vous deux.
    bonne fin de weekend

  5. #5
    Membre Expert
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 703
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 703
    Par défaut
    Dans quelle colonne as-tu mis ta clef ?
    Dans le code que tu nous donnes, tu fais ta recherche sur Range("A2:A" & fin), donc sur la colonne A. Or, tu utilises ta colonne A pour définir ta clef, donc cela m'étonnerait que ta clef soit en colonne A. Il faut faire ta recherche sur la colonne où se situe ta clef.
    Donc mea culpa ! C'est moi qui ait fait l'erreur dans mon exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Match_WP_Line = Range("C2:C" & fin).Find(Id_Project & WP_page).Row
    quelle solutions serait la plus performante entre une clef concaténée et la méthode find en deux étapes?
    Pour moi le mieux c'est le Find avec une clef. Une seule étape => plus rapide. Pas de risque de confusion si les projets ne sont pas triés => plus sûr.

  6. #6
    Expert éminent

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 564
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 564
    Par défaut
    Bonjour à tous
    Citation Envoyé par Darkangel2014 Voir le message
    @Mfoxy, merci pour ce partage je vais en prendre connaissance mais ne connaissant rien a powerquery est ce utilisable sous vba? je vais lire toutefois le document pour apprendre mais à première vue utilisable sous excel tableur.
    PowerQuery remplace de façon bien plus efficace VBA dans nombre de cas...

    Comme VBA, il a son interface pour créer/paramétrer les requêtes qui utilisent les techniques de Base données bien plus efficaces pour traiter des tables de données que le tableur dont ce n'est pas vocation...

    A partir de 2016 PowerQuery peut aussi être piloté par VBA

  7. #7
    Membre confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2014
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Octobre 2014
    Messages : 163
    Par défaut
    Bonjour Riaolle,

    dans mon cas j'ai mis la clé dans la colonne C et j'avais bien mis dans mon code la bonne colonne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    'MatchLine = WP_page.Range("C2:C" & fin).Find(Id_Project & "-" & WP_page).Row
    'MsgBox ("MatchLine= " & MatchLine)
    En colonne C j'ai par exemple 1-1 car projet 1 et id WP 1
    mais ayant peur d'un potentiel doublon au lieu de faire 11 pour 1&1 j'ai décidé de manière aléatoire de mettre un - entre
    mais quand je teste cela donne l'erreur indiquée

    voici le début de la macro

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub List_WorkPackages_Click()
    Dim t As Single
    t = Timer
     
    Set WP_page = Worksheets("Work-Packages")
    Current_WP_Id = List_WorkPackages.Column(0)
     
     
    fin = WP_page.Range("A" & Rows.Count).End(xlUp).Row
     
     
    'cela donne une erreur mais a priori je dois faire erreur dans la formule...
    MatchLine = WP_page.Range("C2:C" & fin).Find(Id_Project & "-" & WP_page).Row
    MsgBox ("MatchLine= " & MatchLine)
    mais j'ai testé les deux find aussi qui eux fonctionne . peut on faire cela en une seule ligne par ailleurs?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    'donne le bon résultat en attente méthode plus performante
    Find_id = WP_page.Range("A2:A" & fin).Find(Id_Project).Row
    Match_WP_Line = WP_page.Range("B" & Find_id & ":B" & fin).Find(Current_WP_Id).Row
      MsgBox Timer - t

    @78chris une autre personne m'a également conseillé powerquery (ça doit donc être vrai )et opérant sous office 2016 je vais devoir me renseigner sur comment l'activer et l'utiliser

    merci à vous en tout cas

Discussions similaires

  1. [XL-2010] Probleme de repetition de ligne avec une fonction INDEX+EQUIV
    Par ZHNEE dans le forum Excel
    Réponses: 2
    Dernier message: 29/07/2014, 13h27
  2. [XL-2003] VBA comparaison de lignes avec plusieurs critères
    Par klissou69 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 05/07/2013, 10h49
  3. [XL-2003] Macro Supprimer ligne avec plusieurs critères
    Par lili189 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 21/08/2012, 15h45
  4. [XL-2007] Formule pour récupérer valeur selon ligne et colonne
    Par zycomatic dans le forum Excel
    Réponses: 3
    Dernier message: 22/06/2010, 12h12
  5. Réponses: 2
    Dernier message: 09/11/2006, 07h37

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