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 :

Macro RechercheV entre 2 fichiers


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Chef de service Qualité
    Inscrit en
    Avril 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de service Qualité
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 8
    Par défaut Macro RechercheV entre 2 fichiers
    Bonjour,

    Je suis nouveau sur ce forum et je débute totalement en VBA;
    Je souhaiterais faire une macro RechercheV car pas possible en formule en raison du nombre de lignes de mon tableau source trop important (env 30000).

    J'ai 2 tableaux chacun situé dans 1 fichier différent , 1 premier qui est mon tableau de bord (Fichier "TdB", Feuille "GK1"), un second ma source de données actualisée régulièrement (Fichier "SOURCE", Feuille "Rapport1"). A noter que les 2 tableaux seront ouverts dans ma session lorsque je ferai tourner la macro.


    Je souhaite que la macro face les actions suivantes:

    1) Lire valeur dans la colonne D (à partir de la ligne 40) du tableau "GK1" et comparer avec valeur dans la colonne B (à partir de la ligne 5) du tableau "Rapport1"

    2) Si ça correspond, recopier valeur des colonnes U, X, Y, Z, AA du tableau "Rapport1" respectivement dans les colonnes G, H, J, K, M du tableau "GK1".


    Si quelqu'un sait me dire quel code VBA implementer pour réaliser cette macro, il me rendrait un ENORME service.


    Merci d'avance pour votre aide,

    Cordialement,

  2. #2
    Membre émérite Avatar de Nico Chg
    Homme Profil pro
    Apprenti ingénieur Business Development
    Inscrit en
    Juillet 2014
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Apprenti ingénieur Business Development
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2014
    Messages : 352
    Par défaut


    Bonjour !

    Si je comprend bien ta problématique :

    Pour chaque valeur de la colonne D de "GK1", tu recherche la valeur correspondante dans la colonne B de "Rapport1", ou tu regarde juste une seul ligne ?

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Chef de service Qualité
    Inscrit en
    Avril 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de service Qualité
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 8
    Par défaut
    Oui, absolument, j'ai omis de préciser, pour chaque valeur de la colonne D de "GK1", la macro devra parcourir la colonne B de "Rapport1".

    Merci de ton aide,

    Cordialement,

  4. #4
    Membre émérite Avatar de Nico Chg
    Homme Profil pro
    Apprenti ingénieur Business Development
    Inscrit en
    Juillet 2014
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Apprenti ingénieur Business Development
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2014
    Messages : 352
    Par défaut


    Tu as également beaucoup de données à parcourir ?

    On va directement partir sur des procédures un peu optimisées dans ce cas, sinon ça va prendre beaucoup de temps.

    As tu déjà écris des macro en VBA ? Sinon, on va commencer par créer notre macro :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sub maSuperbeMacro ()
     
    end sub
    Ce code est à placer dans un "module". Il faut ouvrir l'environnement de Développement (Alt + f11), clic droit sur l'explorateur à gauche, et insérer / module :
    Nom : Capture.PNG
Affichages : 1257
Taille : 72,9 Ko

    Tous le code que l'on va écrire ensemble va s'insérer entre ces deux lignes là. J'ai créer le module dans le classeur "TdB", c'est donc depuis ce classeur que la macro va s'éxecuter.

    Pour plus de clarté, nous allons nommer nos classeurs et les feuilles. La procédure est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dim Wbk_TdB As Workbook
    Dim Wbk_SOURCE As Workbook
    Dim Ws_GK1 As Worksheet
    Dim Ws_Rapport1 As Worksheet
     
    Set Wbk_TdB = ThisWorkbook
    Set Wbk_SOURCE = Workbooks("SOURCE.xlsm")
    Set Ws_GK1 = Wbk_TdB.Worksheets("GK1")
    Set Ws_Rapport1 = Wbk_SOURCE.Worksheets("Rapport1")
    Ensuite, nous allons définir la plage à parcourir. Nous pouvons aussi parcourir directement les cellules sans définir de plage dans le code, mais c'est beaucoup plus long. Nous passerons ici par des variables "tableaux", qui vont stocker les valeurs des cellules. Parcrourir des variables tableaux est 1000 fois plus rapide que de parcourir des cellules. Sur une centaine de cellule, ça n'a pas d'importance, mais sur 30 000, ça peut avoir un impact important !

    Afin de définir les plages, nous allons calculer la valeur de la dernière cellule remplie, puis nous allons leurs affecté un tableau

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dim derLig_GK1 As Single
    Dim derlig_Rapport1 As Single
    Dim plageTdB()
    Dim plageSOURCE()
     
    derLig_GK1 = Ws_GK1.Range("D" & Rows.Count).End(xlUp).Row
    derlig_Rapport1 = Ws_Rapport1.Range("B" & Rows.Count).End(xlUp).Row
    plageTdB = Ws_GK1.Range("D40:B" & derLig_GK1)
    plageSOURCE = Ws_Rapport1.Range("B5:B" & derlig_Rapport1)
    Maintenant que nous avons déclarer nos données, nous pouvons commencer à les parcourir ! Nous allons utiliser une boucle "For ... next". C'est à dire que nous allons effectuer une opération particulière un certain nombre de fois ! En français, ça donne "Pour chaque cellule de la colonne D, fais ..."

    Ces boucles fonctionnent avec des variables d'itération. Nous allons donc utiliser "I", une variable qui va servir à parcourir nos données. Nous allons également utiliser "Lbound" et "Ubound", qui symbolise les limites inférieur et supérieur de la plage de donnée. Ainsi, I va prendre toutes les valeurs entre Lbound et Ubound.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim I as single
    For I = LBound(plageTdB, 1) To UBound(plageTdB, 1)
     
    Next I
    Nous parcourerons la plage de TdB. Pour chacune des valeurs, nous voulons rechercher une correspondance dans le classeur Source ? [...]

    Je posterais la suite un peu plus tard, je cherche le meilleur moyen de parvenir à ce que tu veux faire sans que ça prenne 400ans ! (30 000 lignes c'est beaucoup, pourquoi ne pas être passé par un Access ?)


    Code complet :
    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
    Dim Ws_Rapport1 As Worksheet
     
    Dim plageTdB()
    Dim plageSOURCE()
    Dim derLig_GK1 As Single
    Dim derlig_Rapport1 As Single
     
    Dim myRow As Single
     
    Dim I As Single
     
    Set Wbk_TdB = ThisWorkbook
    Set Wbk_SOURCE = Workbooks("SOURCE.xlsm")
    Set Ws_GK1 = Wbk_TdB.Worksheets("GK1")
    Set Ws_Rapport1 = Wbk_SOURCE.Worksheets("Rapport1")
     
    derLig_GK1 = Ws_GK1.Range("D" & Rows.Count).End(xlUp).Row
    derlig_Rapport1 = Ws_Rapport1.Range("B" & Rows.Count).End(xlUp).Row
     
    plageTdB = Ws_GK1.Range("D40:D" & derLig_GK1)
    plageSOURCE = Ws_Rapport1.Range("B5:B" & derlig_Rapport1)
     
    For I = LBound(plageTdB, 1) To UBound(plageTdB, 1)
     
     
    Next I
    End Sub

  5. #5
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut




    Bonjour,

    parcourir avec une boucle est bien plus lent que d'utiliser les fonctionnalités d'Excel comme par exemple la méthode Find



    _____________________________________________________________________________________________________
    Je suis Charlie - Je suis Bardo

  6. #6
    Membre émérite Avatar de Nico Chg
    Homme Profil pro
    Apprenti ingénieur Business Development
    Inscrit en
    Juillet 2014
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Apprenti ingénieur Business Development
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2014
    Messages : 352
    Par défaut


    Bonjour Marc-L,

    J'y ai pensé aussi, mais il va bien falloir boucler sur quelque chose à un moment donné, puisqu'il faut refaire l'opération sur toutes les cellules de la colonne D. A moins que la taille de la colonne D de la feuille GK1 soit suffisante pour se passer de tableau ?

    Peut être que des filtres avancés font tout aussi bien le boulot ?

    @Waglid Combien de valeur contient la colonne D de la feuille "GK1" ? Je pense m'être lancer dans un bout de code un peu trop complexe pour tes besoins

Discussions similaires

  1. macro entre plusieurs fichiers XL
    Par micks dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 18/07/2011, 11h55
  2. Copier coller entre deux fichiers excel par macro
    Par miss-o-21 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 26/11/2009, 15h45
  3. liaison entre deux fichier excel (macro)
    Par tamildark dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 08/12/2008, 18h17
  4. Macro RECHERCHEV entre 2 fichiers excel distincts
    Par paflolo dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 15/11/2006, 04h46
  5. Réponses: 1
    Dernier message: 15/09/2006, 17h23

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