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 :

Copy / Paste des lignes de plusieurs classeurs ouverts


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Financier
    Inscrit en
    Juillet 2019
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Financier

    Informations forums :
    Inscription : Juillet 2019
    Messages : 41
    Points : 19
    Points
    19
    Par défaut Copy / Paste des lignes de plusieurs classeurs ouverts
    Hello tout le monde,

    Je me permets d'ouvrir un topic car je tente de réaliser une macro mais j'ai un petit problème .
    L'idée : ouvrir tous les classeurs de mon dossier (c'est ok), copy / paste les lignes 14 à 27 des classeurs que j'ai open , refermer tous les classeurs (c'est ok) .

    J'explique ce que je souhaite réaliser : copy / paste les lignes 14 à 27 de tous les classeurs ouverts dans un classeur vierge (celui contenant la macro) le problème est que je copy / paste les lignes du premier workbook puis du second mais le second écrase les données précédentes ! Je n'arrive pas à boucler de sorte que à chaque copy / past pour avoir l'intégralité des données de chaque classeur dans une feuille du new. Je pense qu'il faut utiliser un copy/paste au niveau de la destination qui stipulerait à partir de la derniere cellule vide mais j'ai un peu de mal .

    Si quelqu'un peut m'aider et surtout m'expliquer , par avance merci !!

    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
    Sub OpenFiles()
    Dim MyFolder As String
    Dim MyFile As String
    Dim lig As Integer
    Dim i As Integer
    Dim Wb As Workbook
     
    MyFolder = "C:\*****\Extract"
    MyFile = Dir(MyFolder & "\*.xls")
    Do While MyFile <> ""
    Workbooks.Open Filename:=MyFolder & "\" & MyFile
        For Each Wb In Application.Workbooks
         For lig = 14 To 27
            Wb.Sheets(1).Cells(lig, 1).EntireRow.Copy
            For i = 1 To (27 - 14) * 4
            ThisWorkbook.Sheets(1).Cells(i, 1).PasteSpecial Paste:=xlPasteValues
            Next i
         Next lig
        Next
     
    ActiveWorkbook.Close SaveChanges:=False
    MyFile = Dir
    Loop
    End Sub

  2. #2
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Points : 5 630
    Points
    5 630
    Par défaut
    Bonjour,

    Essaies comme ça :
    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
    Option Explicit
    Sub OpenFiles()
    Dim wbk As Workbook
    Dim rng As Range
    Dim cel As Range
    Dim MyFolder As String
    Dim MyFile As String
     
      MyFolder = "C:\*****\Extract"
      MyFile = Dir(MyFolder & "\*.xls")
      With ThisWorkbook.Worksheets(1)
        .Cells.Clear
        Set cel = .Range("A1")
      End With
      Do While MyFile <> ""
        Set wbk = Workbooks.Open(Filename:=MyFolder & "\" & MyFile)
        Set rng = wbk.Worksheets(1).Range("14:17")
        rng.Copy Destination:=cel    'copier tout (avec les formats)
        cel.Resize(rng.Rows.Count, rng.Columns.Count).Value = rng.Value    'copier les valeurs (sans les formats)
        Set cel = cel.Offset(rng.Rows.Count, 0)
        wbk.Close SaveChanges:=False
        MyFile = Dir
      Loop
    End Sub
    Cordialement,
    Patrice
    Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur

  3. #3
    Membre à l'essai
    Homme Profil pro
    Financier
    Inscrit en
    Juillet 2019
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Financier

    Informations forums :
    Inscription : Juillet 2019
    Messages : 41
    Points : 19
    Points
    19
    Par défaut
    Hello , merci beaucoup ça fonctionne très bien ! Je me permets de te poser deux questions afin de bien comprendre si tu es d'accord !

    1 ) le with était il nécessaire n'ayant qu'une instruction avec ?
    2 ) le set suivi du offset permet de réinitialiser la plage de destination à chaque tour de boucle ?

    Par avance merci et sorry si mes questions semblent évidentes !

    Thanks.

  4. #4
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Points : 5 630
    Points
    5 630
    Par défaut
    Citation Envoyé par VBANoJutsu Voir le message
    1 ) le with était il nécessaire n'ayant qu'une instruction avec ?
    Il y a deux instructions "avec", lignes 2 et 3 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      With ThisWorkbook.Worksheets(1)
        .Cells.Clear
        Set cel = .Range("A1")
      End With
    Le With n'est pas indispensable mais cette structure permet non seulement d’alléger l'écriture, mais surtout plus de clarté et une meilleure architecture du code en regroupant toutes les instruction concernant cet objet (cette feuille).
    A la place j'aurais pu écrire ces 2 lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      ThisWorkbook.Worksheets(1).Cells.Clear
      Set cel = ThisWorkbook.Worksheets(1).Range("A1")
    Citation Envoyé par VBANoJutsu Voir le message
    2 ) le set suivi du offset permet de réinitialiser la plage de destination à chaque tour de boucle ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set cel = cel.Offset(Rng.Rows.Count, 0)
    Cette ligne ne réinitialise pas (ne revient pas au point départ) la plage mais défini la prochaine cellule de destination à la fin de chaque boucle.
    Cordialement,
    Patrice
    Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur

  5. #5
    Membre à l'essai
    Homme Profil pro
    Financier
    Inscrit en
    Juillet 2019
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Financier

    Informations forums :
    Inscription : Juillet 2019
    Messages : 41
    Points : 19
    Points
    19
    Par défaut
    Merci beaucoup Patrice pour ton explication et le temps que tu m'as accordé !

    J'ai compris et ça fonctionne .

    Très cordialement.

Discussions similaires

  1. Réponses: 0
    Dernier message: 11/05/2018, 16h55
  2. Réponses: 2
    Dernier message: 18/02/2009, 23h44
  3. Réponses: 12
    Dernier message: 21/03/2008, 11h52
  4. [VBA-E] Extraire des lignes depuis plusieurs classeurs fermés
    Par stoof dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 07/05/2007, 12h26
  5. Réponses: 2
    Dernier message: 09/01/2006, 16h10

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