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 :

Copie des valeurs d'une colonne dans un autre fichier sous condition [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2015
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Février 2015
    Messages : 108
    Points : 78
    Points
    78
    Par défaut Copie des valeurs d'une colonne dans un autre fichier sous condition
    Nouveaux_elements.xlsmBonjour à tous,

    Pour commencer, désolé, j'ai déjà posté ça dans une discussion terminée. Il semble que je m'y sois mal pris, donc je recommence.
    Ce coup ci je souhaite, copier les valeurs d'une colonne (U) vers un autre fichier en copiant à partir de la première cellule vide vers le bas.

    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
    Sub To_personnels()
    Dim plage As Range, cel As Range
    Dim oRng As Range
    Dim result As Range
     
    Application.ScreenUpdating = False
    valcherch = Sheets("Stage_terminé").Range("U45")
    With Workbooks("Nouveaux_elements.xlsm").Worksheets("Stage_terminé")
        Derlig = .Range("U" & Rows.Count).End(xlUp).Row
        Set plage = .Range("U2:U" & Derlig)
    End With
     
    Derlig = 0
    With Workbooks("personnel.xlsx").Worksheets("Salaires")
        For Each cel In plage
            If cel = valcherch Then
                Derlig = .Range("U" & Rows.Count).End(xlUp).Row + 1
                If Derlig = 1 Then
                    Derlig = 2
                End If
                Cells(cel.Row, 1).Resize(22, 22).Copy .Range("A" & Derlig)
            End If
        Next cel
    End With
     
     
    End Sub
    Quand je l'exécute, je n'ai pas d'erreur mais la copie n'est pas bonne. Si je fais ça c'est pour pouvoir ensuite faire un vlookup pour récupérer certaines infos et les copier dans le fichier cible, comme la date de naissance, le nombre d'enfant.
    Voilà, j'ai essayé différente chose mais sans résultat. Je joints les 2 fichiers.
    Vous l'aurez tous compris, je débute dans le VBA. Nouveaux_elements.xlsm[ATTACH]171990
    Merci d'avance.

    Cordialement,

    Fred
    Fichiers attachés Fichiers attachés

  2. #2
    Membre éclairé 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
    Points : 758
    Points
    758
    Par défaut
    Bonjour,

    pour un poil plus de lisibilité, met ton code entre balise # ([code] [ /code])

    Sinon, il me semble que le For each C in range ... parcours les cellules dans l'ordre croissant de ta range. Pour parcourir tes cellules de haut en bas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim lastLine as single, I as single
     
    'Cherche la dernière cellule remplie dans la colonne A
    lastLine = Worksheets("TaFeuille").Columns(2).Find("*", , , , xlByColumns, xlPrevious).Row
     
    For I = lastLine to 1 step -1
        'do some stuff
    Next I
    avec ça, ton I va varier de la fin au début.

  3. #3
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2015
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Février 2015
    Messages : 108
    Points : 78
    Points
    78
    Par défaut Copie des valeurs d'une colonne dans un autre fichier sous condition
    Salut,

    Bon décidément, j'ai encore du chemin à faire...
    J'ai une erreur 1004 dans la boucle For I sur la copie (ligne en gras). Voici comment j'ai implémenté ta suggestion:

    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
    Sub To_personnels()
    Dim plage As Range, cel As Range
    Dim oRng As Range
    Dim result As Range
    Dim DL As Long
    Dim lastLine As Single, I As Single
    
        
        Application.ScreenUpdating = False
        valcherch = Workbooks("Nouveaux_elements.xlsm").Sheets("Stage_terminé").Range("U45")
        With Workbooks("Nouveaux_elements.xlsm").Worksheets("Stage_terminé")
            Derlig = .Range("U" & Rows.Count).End(xlUp).Row
            Set plage = .Range("U2:U" & Derlig)
        End With
        
        Derlig = 0
        With Workbooks("personnel.xlsx").Worksheets("Salaires")
        lastLine = Workbooks("personnel.xlsx").Worksheets("Salaires").Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row
                For Each cel In plage
                If cel = valcherch Then
                    Derlig = .Range("U" & Rows.Count).End(xlUp).Row + 1
                    If Derlig = 1 Then
                        Derlig = 2
                    End If
                For I = lastLine To 1 Step -1
                    Cells(cel.Row, 1).Resize(22, 22).Copy .Range("A1" & Derlig)
                    Next I
                End If
            Next cel
        End With
        
    End Sub
    C'est le resize qui ne convient pas ?

    Cordialement,

    Fred

  4. #4
    Membre éclairé 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
    Points : 758
    Points
    758
    Par défaut
    Bonjour !

    Si tu n'utilise pas le I de la boucle, ça ne sert presque à rien d'en faire une !

    Ensuite, bel effort d'adaptation, mais la valeur lastLine récupère déjà la dernière ligne, pourquoi chercher Derlig dans ce cas ? Il faut uniquement garder une des deux fonctions. J'ai une préférence pour le find, mais les deux marche très bien.

    Et pour finir, si tu veux copier les valeurs en partant du bas, ne parcours pas ta plage avec For Each C in Range, mais parcours la avec la boucle que j'ai écris ! Le code va boucler deux fois sur tes colonnes, c'est contre-productif.

    Et question optimisation, tu as déjà un With MaFeuille, pas la peine d'y refaire référence plus tard dans le code, tu peux avoir accès aux méthode/propriété de maFeuille directement en mettant un "." (D'ailleurs tu l'a très bien fait pour Derlig).

    ça devrait plus ressembler à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    With Workbooks("personnel.xlsx").Worksheets("Salaires")
        lastLine = .Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row
        For I = lastLine To 1 Step -1
            If .cells(I, 21)= valcherch Then
                .Cells(I, 1).Resize(22, 22).Copy .Range("A1" & lastLine)
            End If
        Next I
    End With
    Je te laisse compléter / modifier le code suivant tes besoins !

    PS : N'oublie pas de remettre Application.screenupdating à true après l'execution de ton prog !

    EDIT : Je suis complètement d'accord avec Marc-L, quand on peut utiliser Excel sans VBA, il vaut mieux le faire ! A trop avoir la tête dans le guidon, on finis par l'oublier

  5. #5
    Expert éminent sénior
    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
    Points : 18 674
    Points
    18 674
    Par défaut




    Bonjour, bonjour !

    Soit dit en passant, même pas besoin de boucle (lent et compliqué !) en utilisant un filtre ou mieux un filtre avancé



    __________________________________________________________________________________________________
    Tous unis, tous Charlie

  6. #6
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2015
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Février 2015
    Messages : 108
    Points : 78
    Points
    78
    Par défaut Copie des valeurs d'une colonne dans un autre fichier sous condition
    Merci les gars de ces remarques, me voilà habillé pour l'hiver

    Je reconnais que ça n'est pas du tout mon domaine, mais bon j'apprends.

    Quoiqu'il en soit merci pour votre réactivité.

    J'essaie, mais ne soyez surpris de me revoir sur le forum.

    Très cordialement,

    Fred

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

Discussions similaires

  1. Macro pour prendre valeur d'une cellule dans un autre fichier.
    Par Zill1975 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 18/02/2013, 17h08
  2. [XL-2003] Extraction de ligne selon la valeur d'une colonne dans un autre fichier
    Par vikvalesteam dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 01/07/2011, 10h52
  3. Réponses: 1
    Dernier message: 25/01/2010, 09h07
  4. Réponses: 9
    Dernier message: 10/10/2008, 16h39
  5. quote dans des valeurs d'une colonne SET
    Par Jean Fi dans le forum Requêtes
    Réponses: 6
    Dernier message: 30/03/2006, 20h16

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