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 :

Copier ligne entiere en fonction valeur d'une cellule


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 15
    Points : 9
    Points
    9
    Par défaut Copier ligne entiere en fonction valeur d'une cellule
    Bonjour tout le monde

    Je viens chercher un peu d'aide apres avoir passe plusieurs a chercher en vain une solution...J'ai une liste de valeurs (codes names) dans une sheet C. Dans une sheet A, j ai en premiere colonne une liste de code names puis des donnees dans les autres colonnes. L'idee est de creer une macro qui va m'extraire toutes les lignes de la sheet A dans la sheet B, si l'on retrouve la valeur de la liste (presente dans la sheet C) dans la premiere colonne de la sheet A.
    Je voulais faire un vlookup au debut, mais je vais avoir besoin de repeter l'operation pour differents sets de donnees et je trouve cela plus simple de "copier si". Par ailleurs la suite de mon code est base sur ce format de fichier.

    J'ai trois feuilles excel :
    "Main": contient dans la colonne M une liste code names (la list de codes names pour lesquels je souhaite recuperer les donnes de l extract)
    "Extract" : contient toues les donnees relatives a chaque code source (plusieurs colonne de donnees). En colonne 2, les codes name.
    "Final" : Feuille finale ou je veux copier mes donnees.

    J'ai construit la macro ci dessous mais j 'ai deux problemes :
    1/ La macro ne lit que la premier code name, va bien chercher la ligne corresondante et la copie dans le fichier final mais elle ne lit pas tous les codes names de la colonne de reference. J ai besoin de creer une sorte de boucle qui lit les 223 codes names, puis va verifier si oui ou non on retrouve ce code name dans le fichier extract, puis colle la ligne entiere corresondante dans le fichier final. Pour l instant elle s arrete au premier de la liste..
    2/ Si le code name n'est pas trouve, la macro ajoute une ligne de 0 puis passe au code name suivant.

    Ici mon code...

    Si vous avez des idees n'hesitez pas ! Merci bcp.


    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
     
     
    Sub recherchV()
     
    Dim ws_check As Worksheet 
    Dim ws_extract As Worksheet 
    Dim ws_final As Worksheet 
     
    Dim cell_check As Range
    Dim cell_extract As Range
    Dim cell_final As Range
     
    Dim zone_check As Range
    Dim zone_extract As Range
    Dim zone_final As Range
     
    Set ws_check = Worksheets("MAIN")
    Set ws_extract = Worksheets("SPIExtract")
    Set ws_final = Worksheets("SPIExtractfinal")
     
     
    ' // Codes names are on every rows in the column M of "Check"
    Set zone_check = ws_check.Range(ws_check.Range("M2"), _
                                  ws_check.Range("M228"))
     
    ' // I want to compare the codes names of the list in the column M of "Main" to the ones contained in the column "b" of Extract"
    Set zone_extract = ws_extract.Range(ws_extract.Range("B7"), _
                                  ws_extract.Range("B228"))
     
    '// Here are the first cells of the rows where I want the entire row of "Extract" to be copied in the "final" sheet if the codes names match
     
    Set zone_final = ws_final.Range(ws_final.Range("B7"), _
                                  ws_final.Range("B228"))
     
    '// If codes names match then copy the entire rows..
    For Each cell_check In zone_check
        For Each cell_extract In zone_extract
        For Each cell_final In zone_final
            If cell_check.Value = cell_extract.Value Then
                  cell_extract.EntireRow.Copy zone_final.EntireRow
     
    ' if code names do not match then value =0 for the entire row
                 Else: zone_final.EntireRow.Value = 0
                  End If
        Next
    Next
    Next
     
    End Sub

  2. #2
    Expert éminent Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 754
    Points : 9 396
    Points
    9 396
    Par défaut
    Bonjour,

    Je pense que dans ton cas, l'instruction Find serait plus appropriée
    F1 pour de l'aide sur cette instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A:A").Find ("toto")
    Jérôme

  3. #3
    Futur Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    ok mais plutot que de devoir tout refaire et reecrire je prefererai avoir juste a rajouter dans le code que j ai deja fait la boucle qui va lire tous les codes names de la colonne.

    La fonction find doit certainement pouvoir marcher, mais je ne vois tjs pas commencer lui faire verifier la presence ligne par ligne du code name. Ca ne m aide pas trop en gros...

    en PJ mon fichier
    Fichiers attachés Fichiers attachés

  4. #4
    Expert éminent Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 754
    Points : 9 396
    Points
    9 396
    Par défaut
    Voici une solution qui fonctionne sur ton fichier exemple
    A mettre sur la feuille Main
    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
    Dim i As Long
    Dim idest As Long
    Dim rg As Range
    Dim FirstAddress As String
     
    idest = 1
    For i = 2 To Range("M:M").End(xlDown).Row
     
        'Recherche dans la feuil 1
        Set rg = Sheets("SPIExtract").Range("B:B").Find(Range("M" & i).Value, Sheets("SPIExtract").Range("B6"))
     
        If Not rg Is Nothing Then
            FirstAddress = rg.Address
     
            Do
                Sheets("SPIExtract").Range("B" & rg.Row & ":O" & rg.Row).Copy Sheets("SPIExtractfinal").Range("A" & idest)
                idest = idest + 1
                Set rg = Sheets("SPIExtract").Range("B:B").FindNext(rg)
             Loop While Not rg Is Nothing And rg.Address <> FirstAddress
     
     
        End If
     
     
    Next i
    A adapter si la destination ne convient pas
    Jérôme

Discussions similaires

  1. Copier/coller lignes tableau en fonction de la valeur d'une cellule
    Par pheonix00fr dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 04/12/2014, 11h59
  2. Copier coller des lignes en fonction de la valeurs d'une cellule
    Par Tyu38 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/09/2014, 09h38
  3. [XL-2010] Récupération d'élément d'une certaine ligne en fonction de la valeur d'une cellule
    Par florent.saunier dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 28/02/2014, 11h41
  4. Réponses: 4
    Dernier message: 29/05/2012, 14h37
  5. Réponses: 5
    Dernier message: 21/12/2011, 08h31

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