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 dernière ligne d'une feuille vers autre classeur fermer [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 241
    Points : 62
    Points
    62
    Par défaut Copier dernière ligne d'une feuille vers autre classeur fermer
    Bonjour au forum,

    Je souhaite copier la dernière ligne d'une feuille dans un autre classeur ayant la même mise en page, nom de feuille et dernière ligne. Ce fichier de destination est dans le même répertoire.

    Exemple :
    dans classeur source "Gestion", je souhaite copier la dernière ligne non vide de la feuille "Clients" vers autre classeur "Gest-Ent" dans feuillet appelé aussi "Clients" dernière ligne non vide.
    Le classeur de destination est fermé, est-ce possible ?

    Si oui comment,
    si non, solution avec le fichier ouvert

    Qui peux m'aider ?

    Merci

    Stephanie

  2. #2
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    Bonjour,
    Oui, c'est possible, surtout si le tableau du classeur fermé possède des entêtes. Mais pourquoi ne pas ouvrir le classeur ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 241
    Points : 62
    Points
    62
    Par défaut
    Bonjour Daniel C. et au forum

    Daniel C., vous dites :
    Oui, c'est possible, surtout si le tableau du classeur fermé possède des entêtes.
    Le fichier contient exactement les mêmes entêtes et ne sert que de temps en temps. C'est pour cela que je ne l'ouvre pas, cela évite de naviguer de l'un vers l'autre et de faire des erreurs de saisie.

    est-ce que vous pouvez me tuyauté sur la question ?

    Merci

    Stephanie

  4. #4
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    Voici le fichier exemple que tu peux trouver à l'adresse :

    http://silkyroad.developpez.com/VBA/...sFermes/#LIV-B

    Si tu as du mal à l'adapter, dis-le.

    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 ajoutEnregistrement()
        Dim Cn As ADODB.Connection
        Dim Fichier As String, Feuille As String, strSQL As String
        Dim LaDate As Date
        Dim PrixUnit As Integer
        Dim leNom As String, lePrenom As String
     
        Fichier = "C:\Base.xls"
        Feuille = "Feuil1"
     
        'Les données à insérer:
        LaDate = CDate("26/05/2006")
        leNom = "NomTest"
        lePrenom = "PrenomTest"
        PrixUnit = 40
     
        Set Cn = New ADODB.Connection
     
        With Cn
            .Provider = "MSDASQL"
            .ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};" & _
                "DBQ=" & Fichier & "; ReadOnly=False;"
            .Open
        End With
     
        'Les données doivent être indiquées dans le même ordre que les champs dans la base de données.
        strSQL = "INSERT INTO [" & Feuille & "$] " _
            & "VALUES (#" & LaDate & "#, " & _
            "'" & leNom & "', " & _
            "'" & lePrenom & "', " & _
            PrixUnit & ")"
     
        Cn.Execute strSQL
     
        Cn.Close
        Set Cn = Nothing
    End Sub

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 241
    Points : 62
    Points
    62
    Par défaut
    bonsoir Daniel.C et le forum

    Ca ne correspond pas trop a ce que je demande et vu mes faibles connaissances en vba, je ne suis pas arrivée au niveau de modification pointue. J'essaye de faire ce que je peux et j'avance de jour en jour.

    Daniel.C avez-vous une idée sur la modification du code que vous citez ci-dessus par rapport à ma demande initiale ?

    Merci pour le coup de main

    Stephanie

  6. #6
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Bonsoir,

    Une proposition à tester (j'ai codé à la volée sans tester)
    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
    Sub test()
    Dim WbkDest As Workbook, LigSource As Integer, LigDest As Integer
     
    Application.ScreenUpdating = False '<-- désactivation de la mise à jour l'écran
     
    'ouverture du classeur de destination, chemin complet et nom à adapter
    Set WbkDest = Workbooks.Open("C:\Chemin_complet\Gest-Ent.xls")
    'recherche de la dernière ligne à copier depuis ce classeur
    LigSource = ThisWorkbook.Sheets("Clients").Range("A" & Rows.Count).End(xlUp).Row
    'recherche de la première ligne vide dans le classeur de destination
    LigDest = WbkDest.Sheets("Clients").Range("A" & Rows.Count).End(xlUp).Row + 1
    'copie de la ligne depuis ce classeur vers le classeur de destination
    ThisWorkbook.Sheets("Clients").Rows(LigSource).Copy WbkDest.Sheets("Clients").Range("A" & LigDest)
    'fermeture et sauvegarde du classeur de destination
    WbkDest.Close True
    'libération de la mémoire (facultatif dans ce cas)
    Set WbkDest = Nothing
     
    Application.ScreenUpdating = True '<-- réactivation de la mise à jour l'écran
     
    End Sub

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 241
    Points : 62
    Points
    62
    Par défaut
    bonjour fring, Daniel.C et au forum

    Merci fring, votre solution fonctionne parfaitement à quelque chose prés. En faite la feuille "client" dans le fichier de destination "Gest-Ent" à une mise en forme de tableau (nom de tableau : Tableau1), le problème c'est que l'ajout ce passe bien mais n'est pas la mise en forme (pas pris en compte dans le tableau). Cela me sert pour la création de graphique avec une plage dynamique avec le nom de ce tableau "Tableau1"

    Dans la continuité de la copie, je souhaiterais aussi copier la dernière ligne mais cette fois ci avec la feuille "Ventes" en plus de ce que vous avez écrit au code précédent

    Merci

    Stephanie

  8. #8
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Citation Envoyé par stephadm Voir le message
    le problème c'est que l'ajout ce passe bien mais n'est pas la mise en forme
    Essaie comme ceci, en remplaçant la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ThisWorkbook.Sheets("Clients").Rows(LigSource).Copy WbkDest.Sheets("Clients").Range("A" & LigDest)
    par ces lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ThisWorkbook.Sheets("Clients").Rows(LigSource).Copy
    WbkDest.Sheets("Clients").Range("A" & LigDest).PasteSpecial Paste:=xlPasteValues
    Application.CutCopyMode = False
    Citation Envoyé par stephadm Voir le message
    Dans la continuité de la copie, je souhaiterais aussi copier la dernière ligne mais cette fois ci avec la feuille "Ventes" en plus de ce que vous avez écrit au code précédent
    Là je pense que, sur base du petit bout de code que tu as, avec un minimum de réflexion tu devrais y arriver

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 241
    Points : 62
    Points
    62
    Par défaut
    re bonjour fring et au forum

    La copie s'effectue bien mais hélas toujours pas pris en compte dans le tableau. J'ai une solution qui serait de creer un nom pour une plage dynamique et utiliser la mise en forme conditionnelle pour la coloration des lignes (1 sur 2) pour la lisibilité.

    J'ai fais une modification concernant la copie d'une autre feuille en plus de la première, j'espère que j'ai bien compris la logique
    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
    Sub test()
    Dim WbkDest As Workbook, LigSource As Integer, LigDest As Integer, LignSource As Integer, LignDest As Integer
     
    Application.ScreenUpdating = False '<-- désactivation de la mise à jour l'écran
     
    'ouverture du classeur de destination, chemin complet et nom à adapter
    Set WbkDest = Workbooks.Open("C:\Chemin_complet\Gest-Ent.xls")
    'recherche de la dernière ligne à copier depuis ce classeur
    LigSource = ThisWorkbook.Sheets("Clients").Range("A" & Rows.Count).End(xlUp).Row
    LignSource = ThisWorkbook.Sheets("Ventes").Range("A" & Rows.Count).End(xlUp).Row
    'recherche de la première ligne vide dans le classeur de destination
    LigDest = WbkDest.Sheets("Clients").Range("A" & Rows.Count).End(xlUp).Row + 1
    LignDest = WbkDest.Sheets("Ventes").Range("A" & Rows.Count).End(xlUp).Row + 1
    'copie de la ligne depuis ce classeur vers le classeur de destination
    ThisWorkbook.Sheets("Clients").Rows(LigSource).Copy
    WbkDest.Sheets("Clients").Range("A" & LigDest).PasteSpecial Paste:=xlPasteValues
    Application.CutCopyMode = False
    ThisWorkbook.Sheets("Ventes").Rows(LignSource).Copy
    WbkDest.Sheets("Ventes").Range("A" & LignDest).PasteSpecial Paste:=xlPasteValues
    Application.CutCopyMode = False
    'fermeture et sauvegarde du classeur de destination
    WbkDest.Close True
    'libération de la mémoire (facultatif dans ce cas)
    Set WbkDest = Nothing
     
    Application.ScreenUpdating = True '<-- réactivation de la mise à jour l'écran
     
    End Sub
    Merci fring de votre aide

    Stephanie

  10. #10
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Citation Envoyé par stephadm Voir le message
    J'ai fais une modification concernant la copie d'une autre feuille en plus de la première, j'espère que j'ai bien compris la logique


    Pour le tableau, je viens de comprendre de quel type de tableau il s'agit, on va lui ajouter 1 ligne avant d'effectuer la copie. Je suppose que dans la feuille "Ventes" du classeur de destination tu as aussi un tableau et que c'est le "Tableau2" ?
    Essaie ceci :
    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
    Sub test()
    Dim WbkDest As Workbook, LigSource As Integer, LigDest As Integer, LignSource As Integer, LignDest As Integer
     
    Application.ScreenUpdating = False '<-- désactivation de la mise à jour l'écran
     
    'ouverture du classeur de destination, chemin complet et nom à adapter
    Set WbkDest = Workbooks.Open("C:\Chemin_complet\Gest-Ent.xls")
    'recherche de la dernière ligne à copier de la feuille "Clients"
    LigSource = ThisWorkbook.Sheets("Clients").Range("A" & Rows.Count).End(xlUp).Row
    'recherche de la dernière ligne à copier de la feuille "Ventes"
    LignSource = ThisWorkbook.Sheets("Ventes").Range("A" & Rows.Count).End(xlUp).Row
    'recherche de la première ligne vide dans le classeur de destination feuille "Clients"
    LigDest = WbkDest.Sheets("Clients").Range("A" & Rows.Count).End(xlUp).Row + 1
    'recherche de la première ligne vide dans le classeur de destination feuille "Clients"
    LignDest = WbkDest.Sheets("Ventes").Range("A" & Rows.Count).End(xlUp).Row + 1
    'ajout de 1 ligne dans le tableau "Clients"
    WbkDest.Sheets("Clients").ListObjects("Tableau1").ListRows.Add
    'ajout de 1 ligne dans le tableau "Ventes"
    WbkDest.Sheets("Ventes").ListObjects("Tableau2").ListRows.Add
    'copie de la ligne depuis ce classeur vers le classeur de destination
    ThisWorkbook.Sheets("Clients").Rows(LigSource).Copy
    WbkDest.Sheets("Clients").Range("A" & LigDest).PasteSpecial Paste:=xlPasteValues
    Application.CutCopyMode = False
    ThisWorkbook.Sheets("Ventes").Rows(LignSource).Copy
    WbkDest.Sheets("Ventes").Range("A" & LignDest).PasteSpecial Paste:=xlPasteValues
    Application.CutCopyMode = False
    'fermeture et sauvegarde du classeur de destination
    WbkDest.Close True
    'libération de la mémoire (facultatif dans ce cas)
    Set WbkDest = Nothing
     
    Application.ScreenUpdating = True '<-- réactivation de la mise à jour l'écran
     
    End Sub
    Même code écrit légèrement autrement pour un peu plus de clarté
    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 test()
    Dim WbkDest As Workbook, LigSource As Integer, LigDest As Integer, LignSource As Integer, LignDest As Integer
     
    Application.ScreenUpdating = False
     
    Set WbkDest = Workbooks.Open("C:\Chemin_complet\Gest-Ent.xls")
     
    With WbkDest.Sheets("Clients")
        LigDest = .Range("A" & Rows.Count).End(xlUp).Row + 1
        .ListObjects("Tableau1").ListRows.Add
    End With
     
    With WbkDest.Sheets("Ventes")
        LignDest = .Range("A" & Rows.Count).End(xlUp).Row + 1
        .ListObjects("Tableau2").ListRows.Add
    End With
     
    With ThisWorkbook.Sheets("Clients")
        LigSource = .Range("A" & Rows.Count).End(xlUp).Row
        .Rows(LigSource).Copy
        WbkDest.Sheets("Clients").Range("A" & LigDest).PasteSpecial Paste:=xlPasteValues
        Application.CutCopyMode = False
    End With
     
    With ThisWorkbook.Sheets("Ventes")
        LignSource = .Range("A" & Rows.Count).End(xlUp).Row
        .Rows(LignSource).Copy
        WbkDest.Sheets("Ventes").Range("A" & LignDest).PasteSpecial Paste:=xlPasteValues
        Application.CutCopyMode = False
    End With
     
    WbkDest.Close True
    Set WbkDest = Nothing
     
    Application.ScreenUpdating = True
     
    End Sub

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 241
    Points : 62
    Points
    62
    Par défaut Résolu
    re bonjour,

    fring, bingo ça fonctionne à merveille. Désolé de ne pas avoir été claire dès le départ concernant la mise en forme en Tableau.

    Merci

    Stephanie

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 16/01/2015, 22h17
  2. Copier plage en ligne d'une feuille vers colonne d'une autre feuille
    Par PaulG dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 03/06/2013, 12h53
  3. [XL-2007] copier une ligne d'une feuille vers une autre feuille
    Par scarfunk dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 27/05/2010, 22h18
  4. Copier certaines lignes d'une table vers une autre
    Par TNorth dans le forum Requêtes
    Réponses: 8
    Dernier message: 25/07/2006, 14h31
  5. [VBA_E]:copier des lignes d'une feuille à une autre
    Par VBBBA dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 15/06/2006, 16h42

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