1. #1
    Futur Membre du Club
    Femme Profil pro
    Régie
    Inscrit en
    mai 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Régie
    Secteur : Arts - Culture

    Informations forums :
    Inscription : mai 2017
    Messages : 10
    Points : 8
    Points
    8

    Par défaut Boucle (Copier/Coller) entre deux classeurs

    Bonjour,

    J'ai deux classeurs: un classeur "source" et classeur "destination".
    Je veux récupérer des données de "Source" pour les intégrer à "Destination".
    Les adresse de cellules que je veux traiter ne sont pas identiques d'un classeur à l'autre, mais les données sont organisées de manière cyclique. J'ai donc utiliser une boucle FOR.
    Le code ne bug pas, mais dans mon classeur "destination" je me retrouve avec la dernière valeur de ma source copié dans les emplacement indiqués au lieu d'avoir une valeur différente à chaque fois.
    Pouvez-vous me dire ce qui ne va pas dans mon code?

    (Je n'ai eu que 3 jours de formation VBA, veuillez accepter mes excuses pour mes défauts de codage et d'explication!)

    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
    Sub IntegrationDonnees()
     
    Dim WbDestination As Workbook
    Dim WbSource As Workbook
    Dim WsDestination As Worksheet
    Dim WsSource As Worksheet
    Dim LigneSource As Integer
    Dim LigneDestination As Integer
     
     
    Set WbDestination = Application.Workbooks("DestinationTEST.xlsm")
    Set WbSource = Application.Workbooks("SourceTEST.xlsm")
    Set WsDestination = WbDestination.Worksheets("Destination")
    Set WsSource = WbSource.Worksheets("Source")
     
     
    WsSource.Activate
    For LigneSource = 2 To 9 Step 2
        For LigneDestination = 2 To 21 Step 5
        WsSource.Cells(LigneSource, 3).Select
        Selection.Copy
        WsDestination.Cells(LigneDestination, 3).PasteSpecial
        Next LigneDestination
    Next LigneSource
     
     
     
    Set WbDestination = Nothing
    Set WbSource = Nothing
    Set WsDestination = Nothing
    Set WsSource = Nothing
     
     
    MsgBox ("Intégration de données réussies")
     
     
    End Sub
    Merci à vous,

    Salomé

  2. #2
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    avril 2013
    Messages
    8 534
    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 : 8 534
    Points : 16 943
    Points
    16 943

    Par défaut


    Bonjour,

    pour le codage on s'en doute mais on ne peut se passer d'une bonne présentation de la problématique !
    Expliquer au moins la structure de la feuille source, ce qui doit être copié et vers où (structure de la destination) …

    ___________________________________________________________________________________________________________
    Je suis Paris, Egypte, Stockholm, London, Istanbul, Berlin, Nice, Bruxelles, Charlie, …
    . . . . . Comme la vitesse de la lumière est supérieure à celle du son, certains ont l'air brillant avant d'avoir l'air con !

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Régie
    Inscrit en
    mai 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Régie
    Secteur : Arts - Culture

    Informations forums :
    Inscription : mai 2017
    Messages : 10
    Points : 8
    Points
    8

    Par défaut Explication en image!

    Bonjour,

    Comme mon explication avec des mots est vraiment nulle, voici une explication en image!
    Les cellules en jaune indiquent à titre informatif les correspondances cellules par cellules.
    Est-ce plus clair pour vous?


    Nom : Visuel_VBASourceDestination.JPG
Affichages : 23
Taille : 105,8 Ko


  4. #4
    Futur Membre du Club
    Femme Profil pro
    Régie
    Inscrit en
    mai 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Régie
    Secteur : Arts - Culture

    Informations forums :
    Inscription : mai 2017
    Messages : 10
    Points : 8
    Points
    8

    Par défaut Pffffffffffff

    J'avais oublié:

    LigneSource = LigneSource + 2
    LigneDestination = LigneDestination + 1

    avant le NEXT

    Désolée pour le temps perdu et le post inutile


  5. #5
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    avril 2013
    Messages
    8 534
    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 : 8 534
    Points : 16 943
    Points
    16 943

    Par défaut

    Et le code initial n'a aucun rapport avec cette explication imagée !
    Heureusement que je n'ai pas perdu mon temps en répondant en me basant sur ce "code" …

    Ne voyant pas bien car c'est trop petit,
    peux-tu au moins déduire l'algorithme - arithmétique niveau fin de primaire ~ 10 ans - permettant de passer
    de la ligne 2 de la source à la ligne 3 de la destination ?
    Et de même entre la ligne 4 source et la ligne 8 destination ?

    Sinon décrire pour chacune des cellules de ces deux lignes sources leurs cellules de destination …

    ___________________________________________________________________________________________________________
    L'effort fait les forts …
    . . . . . Comme la vitesse de la lumière est supérieure à celle du son, certains ont l'air brillant avant d'avoir l'air con !

  6. #6
    Membre émérite
    Femme Profil pro
    Étudiant
    Inscrit en
    octobre 2016
    Messages
    1 478
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 22
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : octobre 2016
    Messages : 1 478
    Points : 2 426
    Points
    2 426

    Par défaut

    Bonjour,
    Il y a une erreur de logique.
    Voici ce que tu dis dans ton code :

    Pour LigneSource allant de 2 à 9 (step 2):
    Pour ligneDestination allant de 2 à 21(step 5)
    Copier la ligne source vers la ligne de destination

    Donc pour 1 ligne source, tu copies cette ligne sur TOUTES les lignes destination à cause de ta deuxième boucle. Comprends-tu?
    Ce que tu veux c'est : pour une ligne source donnée, je copie vers une ligne destination donnée. On fait la boucle SEULEMENT sur les lignes source.
    Pour chaque ligne source donnée, il faut trouver la logique de la ligne destination associée ou à chaque fois, trouver la première ligne vide où coller ou tenir un compteur de la ligne où coller. On va utiliser la 3ème proposition :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    LigneDestination = 2
    For LigneSource = 2 To 9 Step 2
        WsSource.Cells(LigneSource, 3).Copy destination:=WsDestination.Cells(LigneDestination, 3)
        LigneDestination = LigneDestination + 5
    Next LigneSource
    Es-tu sûre de tes bornes dans les boucles For? En effet, en partant de 2 avec un pas de 2, tu n'iras jamais jusqu'à 9. Idem, en partant de 2 avec un pas de 5, tu n'iras jamais jusqu'à 21.

    Je vois que tu as rajouté + 1 dans tes boucles : NOOOOOOON ! Le principe même d'une boucle est que l'indice s'incrémente grâce à la boucle. Ici, c'est d'autant plus faux que tu as des pas différents de 1. A lire : http://silkyroad.developpez.com/vba/boucles/

  7. #7
    Futur Membre du Club
    Femme Profil pro
    Régie
    Inscrit en
    mai 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Régie
    Secteur : Arts - Culture

    Informations forums :
    Inscription : mai 2017
    Messages : 10
    Points : 8
    Points
    8

    Par défaut Mon code sui marche!

    Merci pour votre aide.

    Voici le code complet qui fonctionne:
    Je suis obligée d'utiliser du collage spécial mais sans précision car sinon ça ne fonctionne pas (peut être à cause du passage d'une cellule simple vers une cellule fusionnée)


    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    Sub IntegrationDonnees()
     
    Dim WbDestination As Workbook
    Dim WbSource As Workbook
    Dim WsDestination As Worksheet
    Dim WsSource As Worksheet
    Dim LigneSource As Integer
    Dim LigneDestination As Integer
     
     
     
    Set WbDestination = Application.Workbooks("DestinationTEST.xlsm")
    Set WbSource = Application.Workbooks("SourceTEST.xlsm")
    Set WsDestination = WbDestination.Worksheets("Destination")
    Set WsSource = WbSource.Worksheets("Source")
     
     
    'Date
    WsSource.Activate
    LigneDestination = 3
    For LigneSource = 2 To 8 Step 2
        WsSource.Cells(LigneSource, 1).Select
        Selection.Copy
        WsDestination.Cells(LigneDestination, 2).PasteSpecial
        LigneDestination = LigneDestination + 5
    Next LigneSource
     
    'Heure
    WsSource.Activate
    LigneDestination = 3
    For LigneSource = 2 To 9 Step 2
        WsSource.Cells(LigneSource, 2).Select
        Selection.Copy
        WsDestination.Cells(LigneDestination, 3).PasteSpecial
        LigneDestination = LigneDestination + 5
    Next LigneSource
     
    'Lieu
    WsSource.Activate
    LigneDestination = 3
    For LigneSource = 2 To 9 Step 2
        WsSource.Cells(LigneSource, 3).Select
        Selection.Copy
        WsDestination.Cells(LigneDestination, 4).PasteSpecial
        LigneDestination = LigneDestination + 5
    Next LigneSource
     
    'Distribution
    WsSource.Activate
    LigneDestination = 5
    For LigneSource = 2 To 9 Step 2
        WsSource.Cells(LigneSource, 4).Select
        Selection.Copy
        WsDestination.Cells(LigneDestination, 5).PasteSpecial
        LigneDestination = LigneDestination + 5
    Next LigneSource
     
    'Programme
    WsSource.Activate
    LigneDestination = 3
    For LigneSource = 2 To 9 Step 2
        WsSource.Cells(LigneSource, 5).Select
        Selection.Copy
        WsDestination.Cells(LigneDestination, 5).PasteSpecial
        LigneDestination = LigneDestination + 5
    Next LigneSource
     
    'Chef
    WsSource.Activate
    LigneDestination = 7
    For LigneSource = 2 To 9 Step 2
        WsSource.Cells(LigneSource, 6).Select
        Selection.Copy
        WsDestination.Cells(LigneDestination, 7).PasteSpecial Paste:=xlPasteValues
        LigneDestination = LigneDestination + 5
    Next LigneSource
     
     
    'LF
    WsSource.Activate
    LigneDestination = 6
    For LigneSource = 2 To 9 Step 2
        WsSource.Cells(LigneSource, 7).Select
        Selection.Copy
        WsDestination.Cells(LigneDestination, 7).PasteSpecial Paste:=xlPasteValues
        LigneDestination = LigneDestination + 5
    Next LigneSource
     
    'AART
    WsSource.Activate
    LigneDestination = 5
    For LigneSource = 2 To 9 Step 2
        WsSource.Cells(LigneSource, 8).Select
        Selection.Copy
        WsDestination.Cells(LigneDestination, 7).PasteSpecial Paste:=xlPasteValues
        LigneDestination = LigneDestination + 5
    Next LigneSource
     
    'ODG
    WsSource.Activate
    LigneDestination = 4
    For LigneSource = 2 To 9 Step 2
        WsSource.Cells(LigneSource, 9).Select
        Selection.Copy
        WsDestination.Cells(LigneDestination, 7).PasteSpecial Paste:=xlPasteValues
        LigneDestination = LigneDestination + 5
    Next LigneSource
     
    'SUPP
    WsSource.Activate
    LigneDestination = 3
    For LigneSource = 2 To 9 Step 2
        WsSource.Cells(LigneSource, 10).Select
        Selection.Copy
        WsDestination.Cells(LigneDestination, 7).PasteSpecial
        LigneDestination = LigneDestination + 5
    Next LigneSource
     
    'NbMa
    WsSource.Activate
    LigneDestination = 7
    For LigneSource = 3 To 9 Step 2
        WsSource.Cells(LigneSource, 6).Select
        Selection.Copy
        WsDestination.Cells(LigneDestination, 8).PasteSpecial Paste:=xlPasteValues
        LigneDestination = LigneDestination + 5
    Next LigneSource
     
    'NbLF
    WsSource.Activate
    LigneDestination = 6
    For LigneSource = 3 To 9 Step 2
        WsSource.Cells(LigneSource, 7).Select
        Selection.Copy
        WsDestination.Cells(LigneDestination, 8).PasteSpecial Paste:=xlPasteValues
        LigneDestination = LigneDestination + 5
    Next LigneSource
     
    'NbAART
    WsSource.Activate
    LigneDestination = 5
    For LigneSource = 3 To 9 Step 2
        WsSource.Cells(LigneSource, 8).Select
        Selection.Copy
        WsDestination.Cells(LigneDestination, 8).PasteSpecial Paste:=xlPasteValues
        LigneDestination = LigneDestination + 5
    Next LigneSource
     
    'ODG
    WsSource.Activate
    LigneDestination = 4
    For LigneSource = 3 To 9 Step 2
        WsSource.Cells(LigneSource, 9).Select
        Selection.Copy
        WsDestination.Cells(LigneDestination, 8).PasteSpecial Paste:=xlPasteValues
        LigneDestination = LigneDestination + 5
    Next LigneSource
     
    'Pour vider le prasse-papier
    WsSource.Activate
    Cells(1000, 1000).Copy Destination:=Cells(1000, 1000)
     
     
    Set WbDestination = Nothing
    Set WbSource = Nothing
    Set WsDestination = Nothing
    Set WsSource = Nothing
     
     
     
     
    MsgBox ("Intégration de données réussies")
     
     
    End Sub
    Merci beaucoup!!!!

  8. #8
    Membre émérite
    Femme Profil pro
    Étudiant
    Inscrit en
    octobre 2016
    Messages
    1 478
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 22
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : octobre 2016
    Messages : 1 478
    Points : 2 426
    Points
    2 426

    Par défaut

    Tu n'as pas besoin de faire x boucles, mais une seule suffit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    LigneDestination = 3
    For LigneSource = 2 To 8 Step 2
    'Date
        WsSource.Cells(LigneSource, 1).Copy
        WsDestination.Cells(LigneDestination, 2).PasteSpecial
    'Heure
        WsSource.Cells(LigneSource, 2).Copy
        WsDestination.Cells(LigneDestination, 3).PasteSpecial
        LigneDestination = LigneDestination + 5
    Next LigneSource
    Es-tu sûre que ça marche? Car tu colles 2 choses différentes au même endroit (colonne 7, par exemple --> AART et ODG)

  9. #9
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    avril 2013
    Messages
    8 534
    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 : 8 534
    Points : 16 943
    Points
    16 943

    Par défaut

    Citation Envoyé par SalomeRegie Voir le message
    Voici le code complet qui fonctionne
    Félicitations !

    Je n'ai pas encore pu détailler ton code mais il me semble un peu long pour de la simple copie
    car en dehors des boucles multiples tu utilises deux instructions pour copier au lieu d'une directement …

    Comme il me semble aussi la feuille de destination a des cellules fusionnées (Vade Retro Satanas ! )
    si tu as le temps de joindre les classeurs enregistrés en .xlsx - donc sans code sinon je ne pourrai en ouvrir - avec
    la feuille destination originale avant la procédure et une feuille destination du résultat escompté …
    . . . . . Comme la vitesse de la lumière est supérieure à celle du son, certains ont l'air brillant avant d'avoir l'air con !

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

Discussions similaires

  1. [XL-2010] Boucle d'identification + copier-coller entre deux feuilles
    Par scratos dans le forum Excel
    Réponses: 4
    Dernier message: 25/02/2015, 11h29
  2. [XL-2010] Copier/coller Entre deux classeurs excel VBA
    Par Benjen dans le forum Excel
    Réponses: 11
    Dernier message: 19/09/2014, 15h58
  3. [XL-2000] Copier coller entre deux classeurs
    Par Juan Jacko dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 15/03/2011, 11h35
  4. [VBA-E]Problème Copier-Coller entre 2 classeurs
    Par Corlo dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 23/05/2007, 14h31
  5. Réponses: 5
    Dernier message: 16/08/2006, 20h09

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