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 VBA multi-colonnes [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 206
    Par défaut recherche VBA multi-colonnes
    Bonjour,

    J'ai une feuille excel qui comporte 7 colonnes (COL_A à COL_G)

    Les 2 premières colonnes me servent à identifier un enregistrement (= clef composée).

    Je cherche à faire une recherche à l'aide de cette clef composée, donc sur mes 2 colonnes d'identification, c'est à dire à rechercher le ou les enregistrements qui remplissent les conditions COL_A = "xxx" et COL_B="yyy".

    Je ne sais pas trop comment m'y prendre.

    Quelqu'un a t il une idée ?

    Merci

  2. #2
    Membre Expert Avatar de wilfried_42
    Homme Profil pro
    Auto-entrepreneur
    Inscrit en
    Novembre 2006
    Messages
    1 427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Auto-entrepreneur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 427
    Par défaut
    bonjour

    une formule peut t'interreser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =Index(C1:C20;Equiv(1;Sommeprod((A1:A20="1ercode")*(B1:B20="2emeCode"));faux))

  3. #3
    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 171
    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 171
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Si XXX se trouve en colonne A et YYY en colonne B, ce code te donnera le n° de la ligne où ils se trouvent.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SOMMEPROD((A2:A50="XXX")*(B2:B50="YYY")*(LIGNE(A2:A20)-1))
    Donc pour obtenir une information contenue dans la colonne G (6ème colonne) d'un tableau référencé en A2:G50
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =INDEX($A$2:$G$50;SOMMEPROD((A2:A50="XXX")*(B2:B50="YYY")*(LIGNE(A2:A50)-1));6)
    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

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 206
    Par défaut
    Merci beaucoup, mais à priori je ne peut pas utiliser ces fonctions en VBA (ou alors il y a quelque chose qui m'échappe ?)

  5. #5
    Expert confirmé

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Par défaut
    Salut !

    Tu veux en faire quoi ensuite ?
    Récupérer le n° de la ligne ?
    Récupérer toute la ligne ?
    La mettre en surbrillance ?
    ...
    Tu veux en faire quoi de ton truc ?
    Parce que créer un algo pour trouver une ligne, c'est faisable, mais la finalité est utile aussi :s

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 206
    Par défaut
    Je vais essayer d'être complet sur mon problème.

    Un fichier excel avec 2 feuilles.

    Sur chaque feuille j'ai un tableau qui contient un certain nombre de lignes d'informations identifié chacune par une clef composée prénom-nom (colonnes B et C de ma feuille 1, et colonnes A et H de ma feuille 2).

    Toutes les informations dont j'ai besoin se trouvent dans le tableau de ma feuille 1, sauf une (qui contient une adresse) se trouvant dans la colonne K de ma feuille 2.

    Je cherche donc à mettre à jour le tableau de ma feuille 1 en y ajoutant dans la colonne H l'adresse récupérée sur la feuille 2.

    Pour récupérer cette adresse et la copier dans la feuille 1, je souhaitais donc parcourir chaque ligne de ma feuille 1 pour récupérer le prénom et le nom, puis pour l'enregistrement correspondant à ce prénom-nom dans la feuille 2, récupérer l'adresse afin de la recopier dans la feuille1.

    Est ce clair ?

  7. #7
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    et je préfère :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      nbRec = sht1.Range("B" & sh1.rows.count).End(xlup).Row
    a ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      nbRec = sht1.Range("B1").End(xlDown).Row
    au cas où une cellule n'aurait pas de données
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  8. #8
    Expert confirmé

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Par défaut
    éhé !
    Moi, je préfère éviter les boucles

    Donc, je te propose quelque chose de ce genre
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    Option Explicit
    Enum myCols
        myColNom1 = 2       'N° de la colonne pour le Nom dans la feuille 1                         (B=2)
        myColPrenom1 = 3    'N° de la colonne pour le Prénom dans la feuille 1                      (C=3)
        mycolrf1 = 52       'N° de la colonne pour le Prénom dans la feuille 1                      (AZ=52)
        mycolrr1 = 6        'N° de la colonne pour la récupération de l'adresse dans la feuille 1   (F=6)
        myStartRow1 = 2     'N° de la ligne de départ pour les calculs                              (2)
        myColNom2 = 1       'N° de la colonne pour le Nom dans la feuille 2                         (A=1)
        myColPrenom2 = 8    'N° de la colonne pour le Prénom dans la feuille 2                      (H=8)
        mycolrf2 = 52       'N° de la colonne pour le Prénom dans la feuille 2                      (AZ=52)
        mycolrr2 = 11       'N° de la colonne contenant les adresses sur la feuille 2               (k=11)
        myStartRow2 = 2     'N° de la ligne de départ pour les calculs                              (2)
    End Enum
     
    Sub FindAdresses()
        Dim oRF1                  As Range      'Plage pour la formule de clé
        Dim oRR1                  As Range      'Plage pour la formule de récupération des adresses
        Dim oRF2                  As Range      'Plage pour la formule de clé
        Dim oRR2                  As Range      'Plage pour les adresses d'origine
        Dim lRows                 As Long
        '## 1 ## Création de l'ID dans la feuille Feuil1
        '-- Définition du nombre de lignes
        lRows = Feuil1.UsedRange.Rows.Count
        '-- Définition de la plage pour la réception de la clé sur la feuille Feuil1
        With Feuil1
            Set oRF1 = .Range(.Cells(myStartRow1, mycolrf1), .Cells(lRows, mycolrf1))
        End With
        'Ecriture de la formule pour la clé
        oRF1.FormulaR1C1 = "=RC" & myColNom1 & "&""-""&RC" & myColPrenom1
        'et définition de la plage pour les adresses
        Set oRR1 = oRF1.Offset(0, mycolrr1 - mycolrf1)
        '## 2 ## Création de l'ID dans la feuille Feuil1
        '-- Définition du nombre de lignes
        lRows = Feuil2.UsedRange.Rows.Count
        '-- Définition de la plage pour la réception de la clé sur la feuille Feuil2
        With Feuil2
            Set oRF2 = .Range(.Cells(myStartRow2, mycolrf2), .Cells(lRows, mycolrf2))
        End With
        'Ecriture de la formule pour la clé
        oRF2.FormulaR1C1 = "=RC" & myColNom2 & "&""-""&RC" & myColPrenom2
        'et définition de la plage pour les adresses
        Set oRR2 = oRF2.Offset(0, mycolrr2 - mycolrf2)
     
        '## 3 ## Création de la formule pour la récupération de l'adresse, dans la feuille 1
        oRR1.FormulaR1C1 = "=INDEX(" & _
                            oRR2.Address(True, True, xlR1C1, True) & _
                            ",MATCH(RC[" & mycolrf1 - mycolrr1 & "]," & _
                            oRF2.Address(True, True, xlR1C1, True) & _
                            ",0))"
     
        '## 4 ## Suppression de la formule au profit de la valeur
        oRR1.Copy
        oRR1.PasteSpecial xlPasteValues
        Application.CutCopyMode = False
     
        '## 5 ## Suppression des formule de clé
        oRF1.ClearContents
        oRF2.ClearContents
    End Sub
    Je trouve que selon mes tests, c'est plutôt rapide...

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 02/09/2010, 16h05
  2. Recherche VBA dans plusieurs colonnes.
    Par madchemiker dans le forum VBA Access
    Réponses: 3
    Dernier message: 12/07/2007, 13h09
  3. [VBA/Excel]recherche sur 2 colonnes
    Par rodrigue62 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 27/03/2007, 17h35
  4. [VBA-E] Recherche sur plusieurs colonnes ?
    Par Kokito dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 14/11/2006, 13h27
  5. [VBA-E] Recherche dans une colonne
    Par snowkhan dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 03/03/2006, 14h21

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