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 :

Opérations entre plusieurs classeurs


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2011
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 15
    Par défaut Opérations entre plusieurs classeurs
    Bonjour,

    J'aimerais réaliser plusieurs opérations entre différents classeurs.

    Je vous explique :

    Problème 1

    Dans un classeur A, j'exécute une macro qui ouvre un classeur B.
    Sur ce classeur B, la même macro va créer un nouvel onglet "Projet1" où seront retraités pleins de chiffres. Une fois cet onglet "Projet1" créé, la macro continue : elle déplace cet onglet, plus exactement elle le coupe puis le colle en valeur sur le classeur A.
    Après avoir coupé/collé, je voudrais que le classeur B se ferme.

    Le problème, c'est que le nom du classeur B est une variable. En effet, ma macro commence par une invite qui laisse le choix à l'utilisateur du fichier qu'il veut traiter. Donc son nom change.
    Or, après avoir coupé/collé, c'est mon classeur A qui est sélectionné. Comment sélectionné après coup le classeur B sachant qu'il n'a pas un nom bien déterminé ?


    Problème 2

    Comme je vous l'expliquais, ma macro crée un onglet "Projet 1" sur le fichier B qu'elle déplace sur le fichier A.
    Or, il se peut que cet onglet existe déjà dans le fichier A.
    Comment faire en sorte que lorsque ce cas de figure se rencontre, l'onglet "Projet1" du fichier B écrase l'onglet "Projet1" du fichier A ?

    Voici mon code :

    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
     
    'Insérer nouveau projet
     
     
        Dim Fichier As Variant
        Fichier = Application.GetOpenFilename
        If Fichier = False Then Exit Sub
        Workbooks.Open Fichier
     
        Sheets("1-Suivi projet").Select
        Sheets.Add
     
        Application.Run "Synth.xls!Analyse"
        ActiveSheet.Name = Range("B3")
        ActiveSheet.Select
        Cells.Select
        Range("F34").Activate
        Selection.Copy
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
       ActiveSheet.Move Before:=Workbooks("Synth.xls").Sheets(5)
     
    Fichier.Activate
        ActiveSheet.Activate
        ActiveWindow.WindowState = xlNormal
        ActiveWindow.Close SaveChanges:=False
    Là c'est le classeur A qui se ferme au lieu du classeur B...

  2. #2
    Membre Expert
    Femme Profil pro
    Data engineer
    Inscrit en
    Juin 2007
    Messages
    673
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Data engineer
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2007
    Messages : 673
    Par défaut
    Bonjour,

    Problème 1 :
    Pour manipuler plusieurs classeurs, le plus sûr est de définir des variables qui les désignent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim objFichierA As Workbook
    Dim objFichierB As Workbook
    ...
    Set objFichierA = ActiveWorkbook
    ...
    Set objFichierB = Workbooks.Open(Fichier)
    Ensuite, les actions sont préfixées par le classeur avec lequel on veut travailler :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    objFichierB.Close SaveChanges:=False
    Problème 2 :
    Avant de copier l'onglet il faut vérifier s'il y en a déjà un dans le classeur A et le supprimer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Dim objFeuille as Worksheet
    For Each objFeuille In objFichierA.Sheets
    If objFeuille.Name = "Projet1" Then
        objFeuille.Delete
        Exit For
    End If
    Next objFeuille

  3. #3
    Membre averti
    Inscrit en
    Février 2011
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 15
    Par défaut
    Merci de ta réponse tedo01.

    Pour le problème 1, tout fonctionne très bien sauf la dernière instruction,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    objFichierB.Close SaveChanges:=False
    En effet, j'ai une message d'erreur :
    "Erreur d'exécution 2147221080 (800401a8)
    Erreur Automation"

    J'ai l'impression qu'en fait, après être passé sur le fichier A pour faire la copie, VBA n'arrive pas à revenir au fichier B, bien que j'ai précisé objFichierB.Activate au préalable.


    Pour le problème 2, il y a une petite subtilité : "Projet1" est un nom variable, donc je ne peux pas mettre une instruction faisant référence à un nom fixe.
    En fait, j'aimerais quelque chose comme :
    Si le nom de l'onglet créé sur B = UN des noms des onglets de A, alors, avant de déplacer l'onglet de B vers A, celui sur A est supprimé.
    Mais je ne connais pas bien la syntaxe pour ce type de code.

  4. #4
    Membre Expert
    Femme Profil pro
    Data engineer
    Inscrit en
    Juin 2007
    Messages
    673
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Data engineer
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2007
    Messages : 673
    Par défaut
    Re-bonjour,
    Pour le problème 1 le code marche chez moi, ce n'est pas un problème d'activate.

    Problème 2 : Il y a même plus simple que le code de mon post précédent. Si le nom de l'onglet est par exemple dans la variable strOnglet :
    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
    Dim strOnglet As String
    ...
    strOnglet = xxx 'Nom de l'onglet créé dans B
    ...
    'Pour éviter que le code plante si l'onglet n'existe pas
    On Error Resume Next 
     
    'Pour ne pas avoir de message de confirmation de la suppression
    Application.DisplayAlerts = False 
     
    'Suppression de l'onglet
    objFichierA.Sheets(strOnglet).Delete
     
    'Rétablir l'affichage des messages
    Application.DisplayAlerts = False 
     
    ' Ou reprendre la gestion d'erreur précédente
    On Error Goto 0
    Ce code supprime du classeur A l'onglet qui s'appelle strOnglet s'il existe.

  5. #5
    Membre averti
    Inscrit en
    Février 2011
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 15
    Par défaut
    1) Le code pour fermer le fichier ne marche vraiment pas chez moi. Du coup j'ai trouvé un moyen pour le contourner :

    Je copie mes cellules sur le fichier B.
    Je ferme le fichier B.
    J'ouvre le fichier A.
    J'y crée un nouvel onglet.
    Je devrais pouvoir coller les cellules issus de B.

    Et c'est là où ça bloque !
    En effet, Paste ne fonctionne pas.

    Voici mon code :
    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
     
     
    'Opérations sur fichier B
     
        ActiveWorkbook.Worksheets.Add
        Application.CutCopyMode = True
        Application.Run "Synth.xls!Analyse"
        ActiveSheet.Name = Range("B3")
        ActiveSheet.Select
        Cells.Select
        Application.DisplayAlerts = False
        Selection.Copy
        ActiveWorkbook.Close Savechanges = True
     
    'Opérations sur fichier A
     
    Windows("Synth.xls").Activate
        ActiveWorkbook.Worksheets.Add
        ActiveSheet.Select
        Cells.Select
    ActiveSheet.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
             ActiveSheet.Name = Range("B3")
    J'ai cru comprendre qu'il fallait préciser l'objet avant PasteSpecial, mettre le nom précis de la feuille concernée.
    Le problème c'est qu'elle n'a pas de nom précis, étant donné que celui-ci dépend de la valeur inscrite en B3, valeur que l'on ne peut avoir qu'après avoir fait le collage des valeurs du presse-papiers.
    Comment faire ?

    2) Le problème n'est pas résolu, car il faut préciser un nom précis d'onglet que l'on a pas justement car il est variable :
    Enfin, merci pour tes propositions tout de même.

  6. #6
    Membre Expert
    Femme Profil pro
    Data engineer
    Inscrit en
    Juin 2007
    Messages
    673
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Data engineer
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2007
    Messages : 673
    Par défaut
    Bonjour,
    Avant de copier les données, il suffit de mémoriser dans une variable le contenu de la cellule B3 pour nommer plus tard l'onglet créé dans le fichier A.

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

Discussions similaires

  1. Copier - coller des feuilles excel entre plusieurs classeurs
    Par DodoCanada dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 08/04/2014, 20h58
  2. [XL-2003] Visibilité des variables déclarées "Public" entre plusieurs classeurs
    Par gerardmarquer dans le forum Excel
    Réponses: 0
    Dernier message: 17/06/2013, 20h03
  3. [XL-2003] liaisons entre plusieurs classeurs
    Par PhilippeBesac dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 11/12/2011, 19h56
  4. [XL-2007] comment migrer des données entre plusieurs classeurs excel
    Par Iichham dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 10/06/2011, 14h28
  5. Liaison entre plusieurs classeurs?
    Par zalalus dans le forum Excel
    Réponses: 13
    Dernier message: 20/09/2010, 11h46

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