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 :

[VBA]Excel Passer d'un classeur à un autre


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 36
    Points : 23
    Points
    23
    Par défaut [VBA]Excel Passer d'un classeur à un autre
    Bonjour à tous!
    Je travaille sur deux classeurs "liés" par une macro en utilisant Run.
    Quand je suis dans le classeur B, je voudrais pouvoir revenir dans le classeur A, sur la feuille active qui a lancé la macro, et y recopier les données grâce à une nouvelle macro.

    J'ai visité la FAQ, j'ai bien trouvé une réponse de Bidou :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim objWorkbookSource As Workbook, objWorkbookCible As Workbook
    objWorkbookSource = Application.Workbooks.Open(Application.GetOpenFilename)
    objWorkbookCible = Application.Workbooks.Add

    Mais je ne comprend pas comment faire dans mon cas. Faut-il que j'indique les noms de mes classeurs?

    Merci pour votre aide!

  2. #2
    Membre expérimenté Avatar de Megaxel
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    1 187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 1 187
    Points : 1 405
    Points
    1 405
    Par défaut
    Ce n'est pas très compliqué: en fait, tu dois commencer par ouvrir tes deux classeurs, ou plutôt ouvrir le deuxième, puisque le premier est déjà ouvert, puisque ta macro est lancée.
    A partir de ce moment, tu peux travailler indifféremment sur les données des deux classeurs en préfixant les cellules par l'informations COMPLETE de leur position:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaVariable = WorkBooks("ClasseurA.xls").Worksheets("Feuil1").Cells(3,1)
    Ainsi, tu mets dans "MaVariable" le contenu de la cellule A3 de l'onglet "Feuil1" du classeur "ClasseurA.xls".
    Quant à lancer une autre macro qui se trouve dans l'autre classeur, je trouve que c'est une cinématique bien compliquée pour réaliser une copie de cellules d'un classeur vers un autre. Tu es bien sûr qu'il n'y a pas plus simple?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 36
    Points : 23
    Points
    23
    Par défaut
    Merci pour ton aide Megaxel.
    En effet, je pense qu'il y a bcp plus simple. Il suffirait d'un userform mais je ne sais pas les faire.
    Et le problème, c'est que j'ai besoin de récupérer certaines données qui se trouvent colonnes B, C, E, F et H et ceci sur une ligne choisie par l'utilisateur.
    Par exple :
    j'ai besoin de récupérer les données de la ligne 6, B6, C6, E6, F6 et H6 dans le classeur Projets, feuille "Données". Pour ensuite aller les coller dans la feuille active "1er trimestre" du classeur Dupond, aux emplacements nommés par des variables.
    Cette manipulation sera valable pour les autres onglets "2ème trimestre", "3ème trimestre" et "4ème trimestre" du classeur Dupond.
    Et Dupond n'est pas seul, il y a Durand, Martin, etc.
    La même manipulation pour les autres personnes.

    Donc en effet, ta solution est intéressante mais ta remarque l'est encore plus.Si comme tu dis il faut
    "préfixer les cellules par l'informations COMPLETE de leur position", dans mon cas ce n'est pas possible, vu qu'il y a 4 onglets et plusieurs classeurs.

    Je pensais qu'il était possible de dire en VBA " de retourner dans le classeur, sur la feuille qui a lancé la macro" sans avoir à l'appeler par son nom(la feuille). Hélàs...
    J'ai plus qu'à....me mettre au userform!

  4. #4
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Je pensais qu'il était possible de dire en VBA " de retourner dans le classeur, sur la feuille qui a lancé la macro" sans avoir à l'appeler par son nom(la feuille). Hélàs...
    Rien, semble-t-il ,ne saurait t'empêcher d'écrire ce qui te convient dans un fichier temporaire... puis d'y lire l'information nécessaire .... et de l'effacer après utilisation.
    Ce n'est pas très élégant, certes, mais....

  5. #5
    Expert éminent
    Avatar de bidou
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2002
    Messages
    3 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 055
    Points : 7 962
    Points
    7 962
    Par défaut
    Je pensais qu'il était possible de dire en VBA " de retourner dans le classeur, sur la feuille qui a lancé la macro" sans avoir à l'appeler par son nom(la feuille). Hélàs...
    ThisWorkbook surement

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 36
    Points : 23
    Points
    23
    Par défaut
    Et non ce n'est pas Thisworkbook puisqu'il est déjà ouvert. Je veux aller dans l'autre Workbook (dont le nom peut varier suivant l'utilisateur), Worksheet 1,2, 3 ou 4.

  7. #7
    Expert éminent
    Avatar de bidou
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2002
    Messages
    3 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 055
    Points : 7 962
    Points
    7 962
    Par défaut
    soyons clair parce que tu commence à m'embrouiller

    ThisWorkbook contient le code de la macro qui est en train de s'exécuter donc c'est bien "le classeur qui a lancé la macro"

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 36
    Points : 23
    Points
    23
    Par défaut
    J'aime bcp ton smiley qui se casse la tête!
    voici ce que j'ai fait, peut-être serait-ce plus clair?

    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
     
    Sub RechercheProjet()
    'macro dans le classeur A qui s'exécute grâce à un bouton
     
        ChDir "C:\Gestion\Heures\essais"
        Workbooks.Open Filename:= _
            "C:\Gestion\Heures\essais\Liste_projets_essais.xls"
     
    'lance la macro pour ouvrir le classeur liste des projets 
    Choix1
     
    End Sub
     
    Sub Choix1()
    Run ("Liste_projets_essais.xls!ChoixProjet")
    End Sub
    Puis j'arrive sur le classeur B soit Liste_projets_essais :

    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
    Sub ChoixProjet()
     
    Sheets("Projets Ing").Select
     
    'teste si la sélection est bien devant un numéro de projet
    If ActiveCell.Value <> " --->" Then MsgBox "Sélectionnez la flèche devant le N° de projet et validez": Exit Sub
     
    Selection.Offset(0, 1).Select
    CAT = ActiveCell.Value
     
    Selection.Offset(0, 1).Select
    N°_Projet = ActiveCell.Value
     
    Selection.Offset(0, 2).Select
    Site = ActiveCell.Value
     
    Selection.Offset(0, 1).Select
    Affectation = ActiveCell.Value
     
    Selection.Offset(0, 2).Select
    Désignation = ActiveCell.Value
     
    Selection.Offset(0, -6).Select
     
     
    End Sub
     
    Sub Valider()
    'bouton qui va fermer le classeur et de ce fait va réactiver l'autre
     
    Workbooks("Liste_projets_essais.XLS").Close False
     
    End Sub

    Maintenant, il faut que je recopie les données que j'ai sélectionnées grâce à la flèche, qui sont "en mémoire" par des variables dans le classeur A. (je n'ai pas encore fait le code, je rame)

    Après, lequel est ThisWorkbook dans cette histoire, je l'ignore.

  9. #9
    Expert éminent
    Avatar de bidou
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2002
    Messages
    3 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 055
    Points : 7 962
    Points
    7 962
    Par défaut
    Du coup je ne vois plus l'intérêt d'utiliser des macros différentes puisque ca revient à faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ChDir "C:\Gestion\Heures\essais" 
    Set MonClasseur=Workbooks.Open(Filename:= "C:\Gestion\Heures\essais\Liste_projets_essais.xls")
    With MonClasseur.Sheets("Projets Ing")
       If .Cell(x,y).Value <> " --->" Then 
           MsgBox "Sélectionnez la flèche devant le N° de projet et validez"
           Exit Sub
       EndIf
    etc..... 
    End With

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 36
    Points : 23
    Points
    23
    Par défaut
    Merci! en effet, c'est beaucoup plus court et plus simple que de faire appel à une autre macro ailleurs.

    Par contre, je ne comprend pas pourquoi mes variables ne veulent pas se recopier après avoir "valider".
    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
    27
    28
    29
    30
    'déclaration de toutes les variables
     
    Dim Cat As String
    Dim N°_projet As String
    Dim Site As String
    Dim Affectation As String
    Dim Désignation As Variant
     
    Sub Valider()
     
    Selection.Offset(0, 1).Select
    Cat = ActiveCell.Value
     
    Selection.Offset(0, 1).Select
    N°_projet = ActiveCell.Value
     
    Selection.Offset(0, 2).Select
    Site = ActiveCell.Value
     
    Selection.Offset(0, 1).Select
    Affectation = ActiveCell.Value
     
    Selection.Offset(0, 2).Select
    Désignation = ActiveCell.Value
     
    Selection.Offset(0, -6).Select
     
    Workbooks("Liste_projets_INGessais.XLS").Close False
     
    End Sub
    Dans mon classeur A, je fais :

    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
    Sub Parcourir()
    'Parcourir le tableau pour trouver la dernière ligne vide
    Range("A5:A27").Activate
    En_Colonne = ActiveCell.Column
    En_Ligne = ActiveCell.Row + 1
    While Not IsEmpty(ActiveCell.Value)
    Cells(En_Ligne, En_Colonne).Activate
    En_Ligne = En_Ligne + 1
    Wend
    With ActiveCell
    ActiveCell.Select
    End With
     
    End Sub
     
    Sub Recopie_données()
    ActiveCell.Select
    ActiveCell.Value = Cat
     
    End Sub
    Mais la cellule (A5 pour exemple) reste vide. Par contre, si je relance la macro Parcourir, la cellule vide suivante est A6 !!

  11. #11
    Expert éminent
    Avatar de bidou
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2002
    Messages
    3 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 055
    Points : 7 962
    Points
    7 962
    Par défaut
    Pour chercher la dernière cellule vide se serait peut être plus simple de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A27").End(xlUp).Offset(1).Select

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 36
    Points : 23
    Points
    23
    Par défaut
    Merci Bidou !
    C'est vrai que c'est plus rapide et plus simple ta solution.

    Par contre, je ne comprend toujours pas pourquoi mes variables ne se recopient pas quand je lance la macro Recopie_données dans le classeur A.
    J'ai vérifié, en faisant pas à pas la macro Valider, dans le classeur B je vois bien que les variables ont une valeur quand je positionne la souris dessus, mais après, quand j'exécute l'autre macro, elles ont disparu!!
    Je n'y comprend rien...
    Aurais-je oublié qqch :

  13. #13
    Membre expert
    Avatar de Igloobel
    Homme Profil pro
    Développeur ERP - VBA et Formateur bureautique
    Inscrit en
    Septembre 2005
    Messages
    1 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur ERP - VBA et Formateur bureautique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 869
    Points : 3 442
    Points
    3 442
    Billets dans le blog
    1
    Par défaut
    Salut,
    personellement quand je veux affecter à une cellule une valeur je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(lign, col).FormulaR1C1 = variable
    ou
    lign : est le N° de ligne
    col : est le N° de colonne
    variable : ta variable qui contient ta valeur à affecter

    Voilà, c'est comme cela que je fais, je ne connaissais pas ce type d'instruction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ActiveCell.Select 
    ActiveCell.Value = Cat
    @+

    Igloobel

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 36
    Points : 23
    Points
    23
    Par défaut
    Merci pour ta proposition Igloobel mais dans mon cas, je ne peux pas indiquer dans Cells la ligne et la colonne car comme avant je demande la dernière cellule vierge du tableau, la Cells en question n'aura jamais la même "adresse"

  15. #15
    Expert éminent
    Avatar de bidou
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2002
    Messages
    3 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 055
    Points : 7 962
    Points
    7 962
    Par défaut
    Il faut que tes variables soient déclarées dans le classeur A.

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 36
    Points : 23
    Points
    23
    Par défaut
    mais elles le sont, dans le module 1:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    'déclaration de toutes les variables
     
    Dim Cat As String
    Dim N°_projet As String
    Dim Site As String
    Dim Affectation As String
    Dim Désignation As Variant

  17. #17
    Expert éminent
    Avatar de bidou
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2002
    Messages
    3 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 055
    Points : 7 962
    Points
    7 962
    Par défaut
    montre moi tout ton code sinon on va faire 12 pages

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 36
    Points : 23
    Points
    23
    Par défaut
    Non c'est bon :trouve:

    Il faut que je déclare mes variables en Public et non en Dim

    Après, tout fonctionne à merveille!!
    Je suis contente que cela se termine enfin.

    Donc pour moi le pb est

    Merci à tous!

Discussions similaires

  1. VBA EXCEL - Copier des ligne vers un autre calseur.
    Par patine31 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 17/03/2007, 12h46
  2. [VBA-E] Passer d'un contrôle à l'autre avec tab dans une feuille de calculs
    Par small_heart dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 23/02/2007, 20h57
  3. VBA – EXCEL :copier colonnes d’un classeur à un autre
    Par hiline6 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 13/12/2006, 14h18
  4. [VBA-Excel] traitement dossier de classeur Excel
    Par ash_rmy dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 20/10/2006, 11h06
  5. [VBA-Excel]Copier des cellules vers un autre classeur
    Par Tartenpion dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 04/10/2006, 18h18

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