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

Excel Discussion :

Deux classeurs ouverts - copie de données de l'un à l'autre


Sujet :

Excel

  1. #1
    Membre régulier
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Avril 2013
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2013
    Messages : 220
    Points : 98
    Points
    98
    Par défaut Deux classeurs ouverts - copie de données de l'un à l'autre
    Bonjour à tous,

    Je reçois régulièrement par courriel un tableau Excel contenant des données dont certaines doivent être copiées dans un tableau "fixe", c-à-d. enregistré en bonne et due forme.

    J'ai fait "Enregistrer Macro" (alors que je me trouvais dans mon fichier "variable" c'est pourquoi la macro commence avec la sélection de cellule D20) pour voir à peu près comment se présentait la chose et pour mettre la macro dans mes macros personnelles, dans un module spécifique. Je compte exécuter la macro lorsque mes deux fichiers seront ouverts simultanément : mon fichier "variable" (reçu par courriel et qui ne s'appellera jamais pareil) et mon fichier "fixe".

    J'ai maintenant besoin de votre aide pour m'aider à remplacer le nom du fichier qui m'est envoyé par courriel, si ma méthode est la bonne bien entendu. Voici ci-dessous un exemple de ce que VBA a enregistré :

    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 Incident()
    '
    ' Incident Macro
     
    '
        Range("D20:F20").Select
        Selection.Copy
        Windows("Fichier fixe.XLS").Activate
        Range("D156").Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
        Windows( _
            "Fichier reçu par courriel.xls" _
            ).Activate
        Range("D6:E6").Select
        Application.CutCopyMode = False
        Selection.Copy
        Windows("Fichier fixe.XLS").Activate
        Range("B156").Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
        Range("E156").Select
        Application.CutCopyMode = False
        ActiveCell.FormulaR1C1 = "C"
        Range("F156").Select
        Windows( _
            "Fichier reçu par courriel.xls" _
            ).Activate
    Pouvez-vous m'aider ? Merci beaucoup à l'avance.

  2. #2
    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
    Un premier détail à corriger typique du débutant en VBA Excel : l'usage inutile de Select/Selection.
    Ta macro pourrait se réduire ainsi, avec une meilleure visibilité et une meilleure vitesse d'exécution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub Incident()
    '
        Workbooks("Fichier reçu par courriel.xls").Range("D20:F20").Copy
        Workbooks("Fichier fixe.XLS").Range("D156").Selection.PasteSpecial Paste:=xlPasteValues
     
        Workbooks("Fichier reçu par courriel.xls").Range("D6:E6").Copy
        Workbooks("Fichier fixe.XLS").Range("B156").Selection.PasteSpecial Paste:=xlPasteValues
     
        Workbooks("Fichier fixe.XLS").Range("E156").FormulaR1C1 = "C"
        Application.CutCopyMode = False
    End Sub
    Avoue que c'est quand même plus clair.

    Citation Envoyé par Accessifiante Voir le message
    J'ai maintenant besoin de votre aide pour m'aider à remplacer le nom du fichier qui m'est envoyé par courriel, si ma méthode est la bonne bien entendu.
    Il y a plusieurs méthodes, chacune avec ses avantages.

    La plus simple est de sélectionner ton fichier variable avant de lancer la macro et de supprimer tous les Workbooks("Fichier reçu par courriel.xls"). (sans oublier le "." final) dans le code qui précède.
    Etant donné que l'autre fichier est identifié par son nom dans le code, il suffit que l'autre soit le fichier par défaut (donc celui qui est sélectionné).
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  3. #3
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Proposition utilisant des variables objets. Le fichier variable est choisi par l'utilisateur et la macro est à mettre dans le fichier fixe.

    A adapter

    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
    Option Explicit
     
    Sub Incident()
    Dim Wbk As Workbook
    Dim Ws As Worksheet
    Dim Fichier
     
    Application.ScreenUpdating = False
    Fichier = Application.GetOpenFilename("Excel Files (*.xls*), *.xls")
    If Fichier <> False Then
        Set Ws = ThisWorkbook.Worksheets("NomDeLaFeuilleDuFichierFixe")    'A adapter
        Set Wbk = Workbooks.Open(Fichier)
        With Wbk
            With .Worksheets(1)                           'On transfert les données à partir de la 1ère feuille du classeur variable
                Ws.Range("B156:C156").Value = .Range("D6:E6").Value
                Ws.Range("D156:F156").Value = .Range("D20:F20").Value
                Ws.Range("E156") = "C"
            End With
            .Close False
        End With
        Set Wbk = Nothing
        Set Ws = Nothing
        MsgBox "Copie terminée"
    Else
        MsgBox "Opération annulée"
    End If
    End Sub
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  4. #4
    Membre régulier
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Avril 2013
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2013
    Messages : 220
    Points : 98
    Points
    98
    Par défaut
    Merci beaucoup Menhir et Mercatog ! Je me sens choyée d'avoir deux solutions différentes. yé ! (Mercatog, voir mon commentaire après ma question).

    J'ai cependant oublié un point très important : il faudrait ajouter quelque part de trouver la dernière ligne vide dans mon fichier fixe... Quand j'ai enregistré la macro à l'orgine, c'était la ligne 156 qui était vide. Maintenant, il faudrait passer à la 157 et ainsi de suite.

    Je crois que c'est End.(XlUp), avec une déclaration de Range (?), mais je ne sais pas tricotter cette laine là

    J'ai ce vieux truc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim LastRow As Long
     With ThisWorkbook.Worksheets("NomdelaFeuilledufichierfixe")
      Debug.Print .Rows.Count
      LastRow = .Range("A" & .Rows.Count).End(xlUp).Row
     End With
    Mais comment l'adapter à vos codes ?

    Mercatog : pour information la solution proposée fonctionne avec un environnement Windows standard. Malheureusement, là où je travaille, nous avons une application de gestion des fichiers qui prime sur l'explorateur et elle "pollue" l'ouverture du fichier. Si je fais Annuler, votre code affiche "Opération annulée" (comme le prévoit votre code).

  5. #5
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Je ne saurai répondre à la question de votre application de gestion des fichiers.

    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 Incident()
    Dim Wbk As Workbook
    Dim Ws As Worksheet
    Dim NewRow As Long
    Dim Fichier
     
    Application.ScreenUpdating = False
    Fichier = Application.GetOpenFilename("Excel Files (*.xls*), *.xls")
    If Fichier <> False Then
        Set Ws = ThisWorkbook.Worksheets("NomDeLaFeuilleDuFichierFixe")    'A adapter
        NewRow = Ws.Cells(.Rows.Count, "B").End(xlUp).Row + 1
        Set Wbk = Workbooks.Open(Fichier)
        With Wbk
            With .Worksheets(1)                           'On transfert les données à partir de la 1ère feuille du classeur variable
                Ws.Range("B" & NewRow).Resize(, 2).Value = .Range("D6:E6").Value
                Ws.Range("D" & NewRow).Resize(, 3).Value = .Range("D20:F20").Value
                Ws.Range("E" & NewRow) = "C"
            End With
            .Close False
        End With
        Set Wbk = Nothing
        Set Ws = Nothing
        MsgBox "Copie terminée"
    Else
        MsgBox "Opération annulée"
    End If
    End Sub
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  6. #6
    Membre régulier
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Avril 2013
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2013
    Messages : 220
    Points : 98
    Points
    98
    Par défaut
    Bonjour Messieurs (et Mesdames s'il y en a),

    Je reprends donc mon problème de copie de données d'une feuille à l'autre. J'ai fait des tests avec vos codes et je me heurte à des bugs à cause de l'application que nous utilisons ici (un logiciel de gestion de documents). J'ai suivi le conseil de Menhir pour alléger le code et celui qui fonctionne bien est le suivant (j'ai réduit le nombre de lignes pour l'exemple). Je le lance depuis mon fichier variable reçu par courriel :

    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
    Sub Incidents()
    '
    Dim NewRow As Long
    NewRow = Range("A65536").End(xlUp).Row + 1    'ici on parle du FichierFixe. Ma colonne A ne contient aucune cellule vide. Une fois la dernière ligne vide trouvée, les données doivent être copiées dans cette ligne.
     
     
     
        Range("D6").Copy
        Windows("FichierFixe.XLS").Activate
        Range("B164").Select
        ActiveSheet.Paste
     
        Range("D20").Copy
        Windows("FichierFixe.XLS").Activate
        Range("D164").Select
        ActiveSheet.Paste
     
     
    End Sub
    Alors le dernier hic, c'est que je ne sais pas remplacer "B164" ou "D164" par NewRow... Je me doute bien qu'il ne suffit pas d'écrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Range(NewRow).Select
        ActiveSheet.Paste
    Ça me tue de ne pas savoir jongler avec ces Range, Cell et Cie... J'adore bricoler là-dedans et je donnerais cher pour maîtriser ces ficelles de base...

    Merci beaucoup à l'avance de votre aide.

  7. #7
    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 Accessifiante Voir le message
    J'ai suivi le conseil de Menhir pour alléger le code
    Pas suffisamment. Ton code peut s'écrire plus simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub Incidents()
        Dim NewRow As Long
     
        With Workbooks("FichierFixe.XLS").Worksheets("MonOnglet")
            NewRow = .Cells(.Row.Count,1).End(xlUp).Row + 1
        End With
     
        Range("D6").Copy
        Workbooks("FichierFixe.XLS").Worksheets("MonOnglet").Cells(NewRow,2).Paste
     
        Range("D20").Copy
        Workbooks("FichierFixe.XLS").Worksheets("MonOnglet").Cells(NewRow,4).Paste
     
    End Sub
    En remplaçant MonOnglet par le nom de l'onglet où doivent être copiés tes données dans le fichier de destination.

    Il était aussi possible de faire ça avec des Range (au lieu de cells) en faisant une concaténation du type ("B"&NewRow) mais je trouve qu'utiliser Cells est plus propre.

    Petit détail : il vaut mieux utiliser Workbooks que Windows.

    S'il n'y a pas de cellule vide dans ta colonne 1, les trois ligne entre With er End With peuvent se simplifier en une seule ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        NewRow = Workbooks("FichierFixe.XLS").Worksheets("MonOnglet").Cells(1,1).End(xlDown).Row + 1
    Ça me tue de ne pas savoir jongler avec ces Range, Cell et Cie...
    J'adore bricoler là-dedans et je donnerais cher pour maîtriser ces ficelles de base...
    Il te suffit d'ouvrir l'aide VBA intégrée à Excel et de mettre "Range" dans la case recherche.
    Ne te contente pas de regarder leur syntaxe, intéresse-toi aussi à la liste de leurs membres.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  8. #8
    Membre régulier
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Avril 2013
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2013
    Messages : 220
    Points : 98
    Points
    98
    Par défaut
    Bonjour Menhir !

    J'ai copié votre code dans mon classeur perso, changé le nom du FichierFixe. La fenêtre de débogage pointe sur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NewRow = .Cells(.Row.Count, 1).End(xlUp).Row + 1
    Quand je fais F1, l'aide me dit "Mot-clé introuvable" avec le blabla de Microsoft.

    De plus, j'avais constaté qu'avec notre application de gestion de documents, VBA n'est pas capable de gérer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Workbooks("FichierFixe.XLS")
    suivi de .Range ou de n'importe quoi d'autre. J'ai une fenêtre de débogage à chaque fois (avec les codes précédents en tout cas). Cette application semble être une barrière dans ce cas et seul
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Windows("FichierFixe.XLS")
    fonctionne. Dans le cas présent je n'ai pas encore pu le confirmer car le problème NewRow ne me laisse pas me rendre jusque là...

  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 Accessifiante Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NewRow = .Cells(.Row.Count, 1).End(xlUp).Row + 1
    Quand je fais F1, l'aide me dit "Mot-clé introuvable" avec le blabla de Microsoft.
    J'ai oublié un "s" au premier "Rows", celui qui est suivi de "Count".

    De plus, j'avais constaté qu'avec notre application de gestion de documents, VBA n'est pas capable de gérer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Workbooks("FichierFixe.XLS")
    suivi de .Range ou de n'importe quoi d'autre.
    Là encore, une erreur de ma part : Range n'est pas un objet de Workbook. Il faut mettre un Worksheet en intermédiaire.
    En langage clair, ça veut dire qu'on ne peut pas pointer directement sur la cellule d'un classeur sans lui dire à quel onglet appartient cette cellule.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

Discussions similaires

  1. Copie de données dans TCD vers un autre classeur Excel
    Par jerokat dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 13/02/2015, 11h21
  2. macro copie de données d'un fichier à un autre
    Par mdakini dans le forum Macros et VBA Excel
    Réponses: 21
    Dernier message: 05/04/2011, 11h09
  3. Réponses: 4
    Dernier message: 11/06/2008, 20h56
  4. Copie de données d'une table à une autre
    Par Jacques Bellavance dans le forum VBA Access
    Réponses: 2
    Dernier message: 04/04/2008, 16h33
  5. Réponses: 8
    Dernier message: 25/01/2008, 11h48

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