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 copier des lignes d'une feuille et ne coller dans une autre feuille que celles qui sont différentes [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Femme Profil pro
    Assistante de direction
    Inscrit en
    Février 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Assistante de direction
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2017
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Macro copier des lignes d'une feuille et ne coller dans une autre feuille que celles qui sont différentes
    Bonjour,

    Jusqu'à présent j'ai réussie à me débrouiller avec une petite formation en programmation et en surfant sur le net pour résoudre mes problèmes. Mais j'avoue qu'aujourd'hui je bloque sur une macro qui pourtant me paraît facile :

    j'ai 2 feuilles dans mon classeur :
    - "anciennes données"
    - "données mises à jour"

    je souhaite copier uniquement les nouvelles lignes qui auront été créées de la feuille "données mises à jour" et les coller à la suite dans la feuille "anciennes données".

    Ci-joint le fichier exemple.

    Merci de votre aide.

    Elwina
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Points : 7 149
    Points
    7 149
    Billets dans le blog
    7
    Par défaut
    Bonjour à toi, Bonjour au Forum,

    D'après ce que je vois, il n'existe qu'un - une seule ligne - couple adresse + locataire dans chaque onglet.
    En effet, une adresse peut se répéter, mais avec un locataire différent.

    Par couple, j'entends la concaténation adresse, locataire
    Si tel est le cas, alors j'entrevois une méthode possible :
    - Créer un dictionnaire de tous les couples de la 1ère feuille
    - Balayer chaque couple de la seconde. Si celui-ci n'existe pas dans le dictionnaire créé, alors ajouter les 3 données (adresse, locataire et date d'intervention) à la 1ère ligne libre de la 1ère feuille.

    OK sur la méthode?
    Le développement suivra.

  3. #3
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Je n'ai pas ouvert ta pièce jointe. Il y aura donc certainement des ajustements à faire dans le code que je te donne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("anciennes données").Rows("1:" & Worksheets("anciennes données").Cells(Rows.Count, 1).End(xlUp).Row).Copy Worksheets("données mises à jour").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)

  4. #4
    Expert éminent
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Points : 7 149
    Points
    7 149
    Billets dans le blog
    7
    Par défaut
    Voilà! Voilà!

    Par ce code, les lignes nouvelles peuvent être placées à n'importe quelle ligne de la feuille initiale

    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
    Option Explicit
     
    Public Sub maj_données()
     
    'Activer la référence Micosoft Scripting Runtime
    Dim ledico As New Scripting.Dictionary
     
    Dim derlign As Integer
    Dim c As Range
    Dim concat As String
     
    Set ledico = CreateObject("Scripting.Dictionary")
    With Worksheets("Anciennes données")
            derlign = .Cells(.Rows.Count, 1).End(xlUp).Row
            For Each c In .Range("A5:A" & derlign)
                    With c
                            concat = .Value & .Offset(0, 1).Value
                            'Pas de test d'existence
                            ledico.Add concat, concat
                    End With
            Next c
    End With
     
    Dim derlign2 As Integer
    Dim concat2 As String
     
    With Worksheets("Données mises à jour")
            derlign = .Cells(.Rows.Count, 2).End(xlUp).Row
            For Each c In .Range("B4:B" & derlign)
                    With c
                            concat2 = .Value & .Offset(0, 1).Value
                    End With
                    If Not ledico.Exists(concat2) Then
                            Debug.Print concat2
                            derlign = derlign + 1
                            With Worksheets("Anciennes données")
                                    .Cells(derlign, 1) = c.Value
                                    .Cells(derlign, 2) = c.Offset(0, 1).Value
                                    .Cells(derlign, 3) = c.Offset(0, 2).Value
                            End With
                    End If
            Next c
    End With
     
    'Vider le dctionnaire
    ledico.RemoveAll
    'Libérer la variable
    Set ledico = Nothing
     
    End Sub

  5. #5
    Candidat au Club
    Femme Profil pro
    Assistante de direction
    Inscrit en
    Février 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Assistante de direction
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2017
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par MarcelG Voir le message
    Bonjour à toi, Bonjour au Forum,

    D'après ce que je vois, il n'existe qu'un - une seule ligne - couple adresse + locataire dans chaque onglet.
    En effet, une adresse peut se répéter, mais avec un locataire différent.

    Par couple, j'entends la concaténation adresse, locataire
    Si tel est le cas, alors j'entrevois une méthode possible :
    - Créer un dictionnaire de tous les couples de la 1ère feuille
    - Balayer chaque couple de la seconde. Si celui-ci n'existe pas dans le dictionnaire créé, alors ajouter les 3 données (adresse, locataire et date d'intervention) à la 1ère ligne libre de la 1ère feuille.
    Nom : Capture.JPG
Affichages : 212
Taille : 69,2 Ko
    OK sur la méthode?
    Le développement suivra.
    Bonjour,

    C'est tout à fait ça !
    Par contre le code ne fonctionne pas. Cela affiche une erreur de compilation (cf. capture écran ci-jointe).
    Et j'avoue que j'aurai du mal à corriger l'erreur car je ne connaissais pas la notion de dictionnaire...

  6. #6
    Candidat au Club
    Femme Profil pro
    Assistante de direction
    Inscrit en
    Février 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Assistante de direction
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2017
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Menhir Voir le message
    Je n'ai pas ouvert ta pièce jointe. Il y aura donc certainement des ajustements à faire dans le code que je te donne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("anciennes données").Rows("1:" & Worksheets("anciennes données").Cells(Rows.Count, 1).End(xlUp).Row).Copy Worksheets("données mises à jour").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
    Bonjour,

    Merci pour ce code mais il ne correspond pas à mon besoin.
    Je souhaite copier et coller uniquement les nouvelles valeurs depuis la feuille "données mises à jour" dans la feuille "anciennes données" à la suite des lignes renseignées.
    Les lignes de "anciennes données" ne doivent pas être écrasées mais complétées avec les nouvelles lignes qui vont apparaître dans "données mises à jour".
    De plus l'ordre des lignes de "données mises à jour" est amené à changer.

    J'espère que mes explications sont assez claires.

    Merci en tout cas, c'est super sympa de répondre rapidement en plus !

  7. #7
    Expert éminent
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Points : 7 149
    Points
    7 149
    Billets dans le blog
    7
    Par défaut Références
    Bonjour Elwina,

    Comme stipulé dans le commentaire, il faut activer la Référence "Scripting.Runtime"
    Pour ce faire, dans ton éditeur de macros (VBE).
    Menu Outils\Références.
    Chercher (ordre alphabétique) puis Cocher la Référence
    "Microsoft Scripting.Runtime"

    En effet, un dictionnaire est un objet Scripting

    Reviens après ce processus, en ayant surtout décortiqué le code pour le comprendre.
    On est là!

  8. #8
    Expert éminent
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Points : 7 149
    Points
    7 149
    Billets dans le blog
    7
    Par défaut
    Salut,

    Je viens de m'apercevoir qu'il y avait une redondance dans mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim ledico As New Scripting.Dictionary
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set ledico = CreateObject("Scripting.Dictionary")
    2 lignes peuvent donc être supprimées.

    Cette dernière et


  9. #9
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Citation Envoyé par Elwina Voir le message
    Les lignes de "anciennes données" ne doivent pas être écrasées mais complétées avec les nouvelles lignes qui vont apparaître dans "données mises à jour".
    Analyse ma ligne de code et tu pourras constater qu'elle n'écrase rien dans la feuille de destination.
    Ce n'est pas pour rien que j'ai terminé la référence de destination par .Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).

  10. #10
    Candidat au Club
    Femme Profil pro
    Assistante de direction
    Inscrit en
    Février 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Assistante de direction
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2017
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par MarcelG Voir le message
    Voilà! Voilà!

    Par ce code, les lignes nouvelles peuvent être placées à n'importe quelle ligne de la feuille initiale

    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
    Option Explicit
     
    Public Sub maj_données()
     
    'Activer la référence Micosoft Scripting Runtime
    Dim ledico As New Scripting.Dictionary
     
    Dim derlign As Integer
    Dim c As Range
    Dim concat As String
     
    Set ledico = CreateObject("Scripting.Dictionary")
    With Worksheets("Anciennes données")
            derlign = .Cells(.Rows.Count, 1).End(xlUp).Row
            For Each c In .Range("A5:A" & derlign)
                    With c
                            concat = .Value & .Offset(0, 1).Value
                            'Pas de test d'existence
                            ledico.Add concat, concat
                    End With
            Next c
    End With
     
    Dim derlign2 As Integer
    Dim concat2 As String
     
    With Worksheets("Données mises à jour")
            derlign = .Cells(.Rows.Count, 2).End(xlUp).Row
            For Each c In .Range("B4:B" & derlign)
                    With c
                            concat2 = .Value & .Offset(0, 1).Value
                    End With
                    If Not ledico.Exists(concat2) Then
                            Debug.Print concat2
                            derlign = derlign + 1
                            With Worksheets("Anciennes données")
                                    .Cells(derlign, 1) = c.Value
                                    .Cells(derlign, 2) = c.Offset(0, 1).Value
                                    .Cells(derlign, 3) = c.Offset(0, 2).Value
                            End With
                    End If
            Next c
    End With
     
    'Vider le dctionnaire
    ledico.RemoveAll
    'Libérer la variable
    Set ledico = Nothing
     
    End Sub
    Super ! Merci beaucoup !!!
    Je n'avais pas assez décortiqué le code.
    Maintenant que c'est fait, j'ai mieux compris et l'ai adapté !!!

    Un grand merci pour votre aide et votre réactivité !!

  11. #11
    Candidat au Club
    Femme Profil pro
    Assistante de direction
    Inscrit en
    Février 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Assistante de direction
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2017
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Menhir Voir le message
    Analyse ma ligne de code et tu pourras constater qu'elle n'écrase rien dans la feuille de destination.
    Ce n'est pas pour rien que j'ai terminé la référence de destination par .Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).
    Merci pour votre aide, je me suis concentrée sur l'autre proposition de code et cela fonctionne parfaitement.

  12. #12
    Expert éminent
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Points : 7 149
    Points
    7 149
    Billets dans le blog
    7
    Par défaut
    Wilma,
    N'oublie pas mes remarques quant aux redondances.
    Regarde les autres méthodes et propriétés des dictionnaires, et reviens si nécessaire.

    Bonne suite.

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

Discussions similaires

  1. [XL-2016] Faire plusieurs selection dans une listbox (tableau) pour coller dans un autre classeur
    Par CEA FRANCE dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 15/04/2016, 11h46
  2. [XL-2007] Copier des données d'un classeur et les coller dans un autre
    Par Runsh63 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 12/06/2012, 06h18
  3. [XL-2007] Copier une plage dans une feuille et la coller dans une autre du même classeur.
    Par kedmard dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 23/04/2012, 14h55
  4. Réponses: 19
    Dernier message: 13/04/2012, 08h30
  5. Réponses: 3
    Dernier message: 01/09/2009, 23h48

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