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 VLOOKUP comparaison 2 bases de données [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 6
    Par défaut VBA VLOOKUP comparaison 2 bases de données
    Bonjour,

    Néophyte en VBA, je tente d'automatiser le contrôle de 2 bases de données via le VBA mais je sèche sur l'automatisation du recherchev, j'ai bien tenté des recherches sur internet et sur le forum, mais je n'ai rien trouvé qui réponde à mon besoin qui somme toute est assez simple.

    L'objectif est de rechercher la valeur présente en E2 sur la feuille 'XXXX dd-mm-YYYY' (pour simplifier, c'est le dernier onglet du classeur et par défaut la feuille active par rapport au déroulement précédent de la macro) dans la colonne A d'une feuille présente dans le même classeur appelée Base Y (il y a un espace dans le nom de l'onglet des fois que ceci ait une incidence). Cette valeur sera intégrée dans la case F2
    Tache qui sera répétée pour chacune des lignes suivantes. Pour le moment, cela va aux environs de 3k lignes

    En réalisant un enregistrement automatique cela donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub Macro5()
     
        Range("F2").Select
        ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-1],'Base Y'!C[-5],1,0)"
        Range("F2").Select
        Selection.FillDown
    End Sub
    En la relançant dans mon script, elle ne me permet même pas de récupérer les bonnes valeurs, je ne parle pas non plus de mon incapacité à la reproduire sur l'ensemble de mes cellules.

    J'ai bien tenté en plaçant des Application.WorksheetFunction.VLookup(Range("A2"), Sheets("Base Tracker!A:A"), 1, False) ou des Worksheets(Sheets.Count).Range("F2:F" & DerniereLigne).Formula = "=VLOOKUP(E2,'Base Tracker'!$A:$A,1,FALSE)" ou d'autres formules barbares trop complexes par rapport à mon besoin sans aucune résultat.

    Je me tourne vers vous pour obtenir une petite réponse clé en main sur ce problème qui me bloque depuis 4 heures
    Je tiens à rappeler comme dit plus haut que je suis néophyte, n'hésitez donc pas à me préciser les variables qu'il y a besoin de dimensionner ou initialiser dans le dit script.

    Merci par avance pour votre assistance.
    Tenak.

    PS: J'ai bien tenté une recherche sur le forum, mais les 6 premières pages de résultat sur le vlookup ne m'ont pas apporté de réponse compréhensible et applicable à mon cas.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Et avec Find ?
    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
     
    Sub Rechercher()
     
        Dim Plage As Range
        Dim Cel As Range
     
        With Worksheets("Base Y")
     
            Set Plage = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp))
     
        End With
     
        Set Cel = Plage.Find(ActiveSheet.Range("E2"), , xlValues, xlWhole)
     
        'retourne la première occurence (si il faut en trouver d'autres, il faut boucler)
        If Not Cel Is Nothing Then
     
            'ici, c'est l'adresse qui est indiquée
            ActiveSheet.Range("E2") = Cel.Address(0, 0)
     
        End If
     
    End Sub
    Hervé.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 6
    Par défaut
    Bonjour Theze,

    Merci pour ta réponse qui m'avance beaucoup, J'ai juste modifié le

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveSheet.Range("E2") = Cel.Address(0, 0)
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveSheet.Range("F2") = Cel.Address(0, 0)
    Puisque la macro écrivait la référence dans la même colonne.
    De même, le script reporte la cellule qui contient la valeur, ie A1407, et non la valeur présente dans la cellule.
    Donc en plus de ce point à creuser, me reste à boucler le script pour qu'il se reproduise en F3, F4,..., F1000.

    Ah c'est sûr, ça sécurise les process et fait gagner du temps le VBA, par contre, c'est galère à assimiler au début ^^

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Re,

    Ici, la recherche boucle sur les cellules de la colonne E de la feuille active et si trouvé, inscrit la valeur de la cellule de droite. C'est là, qu'il faut savoir ce que tu veux retourner ? :
    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
     
    Sub Rechercher()
     
        Dim PlageBase_Y As Range
        Dim PlageFeActive As Range
        Dim CelBase_Y As Range
        Dim CelFeActive As Range
     
        With Worksheets("Base Y")
     
            'en colonne A de la feuille "Base Y"
            Set PlageBase_Y = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp))
     
        End With
     
        With ActiveSheet '<-- à adapter
     
            'en colonne E de la feuille active
            Set PlageFeActive = .Range(.Cells(1, 5), .Cells(.Rows.Count, 5).End(xlUp))
     
        End With
     
        'parcour la plage en colonne E de la feuille active
        For Each CelFeActive In PlageFeActive
     
           'et recherche dans la plage de la feuille "Base Y"
           Set CelBase_Y = PlageBase_Y.Find(CelFeActive.Value, , xlValues, xlWhole)
     
           'si trouvé
           If Not CelBase_Y Is Nothing Then
     
               'inscrit dans la cellule à droite (colonne F)
               'CelFeActive.Offset(, 1) = CelBase_Y.Value 'pour la valeur mais c'est la même !!!
               CelFeActive.Offset(, 1) = CelBase_Y.Offset(, 1).Value 'la valeur de la cellule à droite
               'CelFeActive.Offset(, 1) = CelBase_Y.Address(0, 0) 'l'adresse de la cellule trouvée
     
           End If
     
        Next CelFeActive
     
    End Sub
    Hervé.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 6
    Par défaut
    Merci pour ton rapide retour,

    Pour répondre à ta question, l'option pour laquelle je vais opter est:
    CelFeActive.Offset(, 1) = CelBase_Y.Value 'pour la valeur mais c'est la même !!!

    Cela peut sembler illogique de prime abord mais justement, dans la suite du script, je filtre sur les résultats qui n'ont pas de correspondance pour enrichir manuellement la seconde base au besoin.

    Petite question technique maintenant, dans ton premier script tu n'avais dimensionné que 2 variables (Plage et Cel) dans le second, tu les dimensionnes pour chacune des 2 feuilles utilisées, pourquoi? (Après relecture, je suppose que c'est pour bien qu'il recopie la valeur de la feuille Base Y en feuille base active)

    Tu précises également
    With ActiveSheet '<-- à adapter
    Sachant que mon onglet sera à chaque lancement de macro différent (nom + date du jour), mais sera toujours le dernier onglet, je pense mettre le code ci-dessous, est il le mieux adapté?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    With ActiveSheet(Sheets.Count)
    Edit: ah bah non, ça ne fonctionne pas, erreur 438, Propriété ou méthode non gérée par cet objet, plus qu'à aller dans le menu aide ^^

    Edit 2: en fait, ne rien mettre permet de faire fonctionner la macro. N'y a-t-il donc aucun argument attendu?

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Re,

    With ActiveSheet(Sheets.Count)
    dans ce cas, il faut utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    With Worksheets(Worksheets.Count)
    car ActiveSheet n'attend aucun argument puisque c'est la feuille active !
    Petite question technique maintenant, dans ton premier script tu n'avais dimensionné que 2 variables (Plage et Cel) dans le second, tu les dimensionnes pour chacune des 2 feuilles utilisées, pourquoi? (Après relecture, je suppose que c'est pour bien qu'il recopie la valeur de la feuille Base Y en feuille base active)
    Tu dis vouloir boucler sur toute un plage donc, il est nécessaire d'avoir une seconde variable "Plage" pour boucler sur cette dernière ainsi qu'une seconde variable "Cel" pour représenter la cellule en cours dans la boucle.

    Hervé.

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

Discussions similaires

  1. [VBA-E] macro avec base de données externe
    Par Djohn dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/02/2007, 15h12
  2. [Conception] comparaison saisie/base de donnée
    Par arfelas dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 03/10/2006, 17h17
  3. comparaison de bases de données
    Par milielf dans le forum Access
    Réponses: 4
    Dernier message: 12/06/2006, 15h35
  4. Comparaison XML-base de donnée SQL
    Par mtaveau dans le forum XQUERY/SGBD
    Réponses: 11
    Dernier message: 02/05/2006, 04h45
  5. [VBA-E]COMBOBOX, et base de données
    Par legend dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 24/02/2006, 14h22

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