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 :

Comment manipuler plusieurs fichiers Excel


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Inscrit en
    Août 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 13
    Points : 7
    Points
    7
    Par défaut Comment manipuler plusieurs fichiers Excel
    Comme vous pouvez le voir, je suis tout nouveau que ce sois sur ce site ou même VBA, je m'y suis mis avant-hier (je connais quand même le C). Ayant quelques 200 feuilles Excel à faire, j'en suis venu à penser que les macros pouvais m'aider, mais j'ai malheureusement des problèmes, le programme que je souhaite faire nécessite l'utilisation de 3 fichiers (2 sources + 1) et ne fonctionne pas je ne vois pas comment faire autrement pour faire l'appel des fichiers (je crois que c'est ca qui marche pas entre autres).

    d'ou ma question, comment faire pour utiliser plusieurs fichiers Excel sous VB?

    je mets mon programme pour que vous compreniez mieux comment j'ai fais et qui n'est pas bon.

    --
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
     
     
    Sub OM()
     
    'Declaration des variables
     
    Dim FP As Excel.Workbook
    Dim FPws As Excel.Worksheet
    Dim Listing As Excel.Workbook
    Dim Listingws As Excel.Worksheet
    Dim Produit As Excel.Workbook
    Dim Produitws As Excel.Worksheet
    Dim lig
    Dim I As Integer
     
     
    'Ouverture des applications
     
    Workbooks.Add ("C:\Documents and Settings\tai-sama\Mes documents\1. Olivier\ESIREM\Stage\Stage Bodycote\FP.xls")
    Set FP = ActiveWorkbook
    Set FPws = FP.Worksheets(1)
    FP.Sheets.Add After:=Sheets(FP.Sheets.Count), Count:=200
    Call Trierfeuilles
     
    Set Listing = Workbooks.Open("C:\Documents and Settings\tai-sama\Mes documents\1. Olivier\ESIREM\Stage\Stage Bodycote\AA Listing produits chimiques.xls")
    Set Listingws = Listing.Worksheets(2)
     
    Set Produit = Workbooks.Open("C:\Documents and Settings\tai-sama\Mes documents\1. Olivier\ESIREM\Stage\Stage Bodycote\Création Fiche de produits\Fiche Produits.xls")
    Set Produitws = Produit.Worksheets(1)
                                                            'Debut du programme de copie d'une sélection vers une autre feuille
    Set Produitws = ActiveWorkbook.Sheets(1)
    Produitws("Feuil1").Range("A1:AS42").Copy
    Set FPws = ActiveWorkbook.Sheets(1)                     'activation de la feuille que je souhaite
    FPws("Feuil1").Paste Destination:=FPws("Feuil1").Range("A1:AS42")
                                                            'ou FPws("Feuil1").Paste Destination:=FPws("Feuil1").Range("A1")
    Application.CutCopyMode = False
    Worksheets().FillAcrossSheets Worksheets("Feuil1").Range("A1:AS42", xlFillWithAll) 'doit être rediriger vers le fichier avec les 200 feuilles
     
     
                                                            'Debut du programme de remplissage des données
    Set Listing = ActiveWorkbook
    Set Listingws = Listing.ActiveSheet
     
    I = 1
    lig = 8
        For lig = 8 To 12
     
            Listingws("Feuil2").Range(Listingws.Cells(lig, 3)).Copy
            Set FP = ActiveWorkbook
            Set FPws = FP.ActiveSheet
            Sheets("Feuil(" & I & ")").Select
            FPws("Feuil(" & I & ")").Paste Destination:=FPws("Feuil(" & I & ")").Range(FPws.Cells(7, 12), FPws.Cells(9, 12))
            Set Listing = ActiveWorkbook
            Set Listingws = Listing.ActiveSheet
            Application.CutCopyMode = False
     
            Listingws("Feuil2").Range(Listingws.Cells(lig, 2)).Copy
            Set FP = ActiveWorkbook
            Set FPws = FP.ActiveSheet
            Sheets("Feuil(" & I & ")").Select
            FPws("Feuil(" & I & ")").Paste Destination:=FPws("Feuil(" & I & ")").Range(FPws.Cells(5, 12))
            Set Listing = ActiveWorkbook
            Set Listingws = Listing.ActiveSheet
            Application.CutCopyMode = False
     
            Listingws("Feuil2").Range(Listingws.Cells(lig, 41)).Copy
            Set FP = ActiveWorkbook
            Set FPws = FP.ActiveSheet
            Sheets("Feuil(" & I & ")").Select
            FPws("Feuil(" & I & ")").Paste Destination:=FPws("Feuil(" & I & ")").Range(FPws.Cells(9, 12))
            Set Listing = ActiveWorkbook
            Set Listingws = Listing.ActiveSheet
            Application.CutCopyMode = False
     
            I = I + 1
        Next lig
     
    'Fermeture d'Excel
    FP.Close
    Listing.Close
    Produit.Close
    Set FPws = Nothing
    Set Listingws = Nothing
    Set Listing = Nothing
    Set Produitws = Nothing
    Set Produit = Nothing
     
    'Fin du programme
    End Sub
     
    Sub Trierfeuilles()
     Dim Ws As Object
     Dim I As Byte
     
     Application.ScreenUpdating = False
        For Each Ws In ActiveWorkbook.Sheets
            For I = 2 To ActiveWorkbook.Sheets.Count
                If Sheets(I - 1).Name > Sheets(I).Name Then Sheets(I - 1).Move After:=Sheets(I)
            Next I
        Next Ws
    End Sub
    --
    Merci pour l'aide que vous pourrez m'apporter

  2. #2
    Membre averti Avatar de mordrhim
    Inscrit en
    Avril 2007
    Messages
    270
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2007
    Messages : 270
    Points : 314
    Points
    314
    Par défaut
    Maintenant,
    Ce que je ne comprends pas dans ton message :
    - Tu créés les objets Workbook, tu les initialies mais tu ne les utilises pas.

    tu ne les actives pas ou ne les lies pas aux worksheets.

  3. #3
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 19
    Points : 13
    Points
    13
    Par défaut
    Bon alors je ne m'y connais pas en VBA mais là c'est d'un point de vue programmation pur donc je pense savoir où ca va pas :

    Quand tu fais tes instructions du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Set Listing = appExcel.Workbooks.Open("C:\Documents and Settings\tai-sama\Mes documents\1. Olivier\ESIREM\Stage\Stage Bodycote\AA Listing produits chimiques.xls")
    Set Listingws = wbExcel.Worksheet(1) 'ouverture d'un fichier
    Tu créés bien un Objet Workbokk initialisé avec ton fichier dont le lien est passé en paramêtre.
    Mais ensuite tu initialise ton objet Worksheet avec rien du tout, il faut utilisé ton précédent objet, le Workbook.
    Donc si je ne me plante pas cela devrait donner :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Set Listing = appExcel.Workbooks.Open("C:\Documents and Settings\tai-sama\Mes documents\1. Olivier\ESIREM\Stage\Stage Bodycote\AA Listing produits chimiques.xls")
    Set Listingws = Listing.Worksheet(1) 'ouverture d'un fichier
    Après si d'autres personnes beaucoup plus à l'aise en VBA désirent me corriger pas de souçis

  4. #4
    Futur Membre du Club
    Inscrit en
    Août 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    j'ai effectivement changé les différentes choses que vous m'avez dis, disons que ca fonctionne et je vais un peu plus loin, cependant j'ai une erreur qui s'affiche pour RAnge("L1C1:L42C45").select et je dois donc avoir la même erreurà Cells(7,12).Select

    Pourrais-t-on me dire comment faire, j'ai repris ca du Dossier VB-VBA: Programmer efficacement Microsoft Excel



    Je sais que mon problème est maintenant différent ou je le crois... Mais je ne veux pas créer un autre post

    PS: j'ai modifier le programme en haut
    Merci pour votre aide, je comprend un peu mieux

  5. #5
    Futur Membre du Club
    Inscrit en
    Août 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    C'est bon j'ai réussi, ca marche, il faut mettre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ActiveSheet.range("L1C1:L42C45").select

  6. #6
    Membre averti Avatar de mordrhim
    Inscrit en
    Avril 2007
    Messages
    270
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2007
    Messages : 270
    Points : 314
    Points
    314
    Par défaut
    remplace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets().FillAcrossSheets Worksheets("Feuil1").Range("L1C1:L42C45", xlFillWithAll)
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets().FillAcrossSheets Worksheets("Feuil1").Range("A1:AS42"), xlFillWithAll
    appuie F1 de temps en temps et regarde bien les structures

  7. #7
    Futur Membre du Club
    Inscrit en
    Août 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    En fait, je croyais que c'étais la même chose, et qu'il y avait deux types d'adressage possibles, ce qui veut dire que maitenant je suis en relatif, mais pourquoi est-ce que c'est mieux? et pourquoi avant de changé ca marchais et j'allais à l'erreur suivante (problème avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Sheets("Feuil(i-7)").Select
    ) et maintenant j'ai un problème avec

  8. #8
    Membre averti Avatar de mordrhim
    Inscrit en
    Avril 2007
    Messages
    270
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2007
    Messages : 270
    Points : 314
    Points
    314
    Par défaut
    parceque ton code est tout moche et tres mal écrit ?

    alors si tu veux qu'on suive tes déboires :
    - donne les erreur que le debugueur te rale.
    - relis ton code et corrige tes fautes de frappes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("Feuil(i-7)").Select
    a changer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("Feuil(" & i - 7 & ")").Select
    étant donné que je ne pense pas que tu aies une feuille réellement nommée Feuil(i-7).

  9. #9
    Futur Membre du Club
    Inscrit en
    Août 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Je voulais simplement savoir la différence...
    Merci de me rappeller que mon code est mal écris car j'en suis conscient

    Pour :
    , il s'agit de l'erreur 1004 : la méthode Paste de la WorkSheet a échoué.
    Pour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Sheets("Feuil(" & i - 7 & ")").Select
    n il s'agit de l'erreur 9 : l'indice n'appartient pas à la sélection.

    Je vais essayer d'utiliser For Each ... Next qui semble plus efficace

  10. #10
    Membre averti Avatar de mordrhim
    Inscrit en
    Avril 2007
    Messages
    270
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2007
    Messages : 270
    Points : 314
    Points
    314
    Par défaut
    Est-ce que le "Paste" se fait sur la feuille "Feuil(i-7)" ?

    Erreur 9 : plusieurs raisons possibles.
    - La feuille n'existe pas
    - Le nom que tu donnes : "Feuil(" & i - 7 & ")" donnant "Feuil(1)" pour i = 7 est mal orthographié.

    Erreur 1004 :
    Comme il n'a pas réussit à sélectionner la feuille il ne peut pas coller dessus

    Ensuite pour les lignes du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set Produitws = appExcel.ActiveWorkbook.Sheets(1)
    ActiveSheet.Range("A1:AS42").Select 'copie de la plage que je souhaite
    Tu créés un objet que tu n'utilises pas. Pourquoi ne fais tu pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set Produitws = appExcel.ActiveWorkbook.Sheets(1)
    Produitws.Range("A1:AS42").Select
    Je ne te dis pas que ton code est pas propre par méchanceté, mais normalement un programme est analysé avant

  11. #11
    Futur Membre du Club
    Inscrit en
    Août 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    j'ai réfléchis à mon problème et j'ai deux questions qui me sont venues à l'esprit et leurs réponses qui expliquerai en partie pourquoi certaines parties de mon programme ne fonctionne pas:

    Comment peux t on vérifier que que les feuilles du classuer que nous avons crée existe sous VBA, car en effet quand j'écris simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("Feuil1").Select
    qui devrait marcher, ca ne marcha pas, avec la même erreur, signe que la feuille si j'ai bien compris, n'existe pas.

    J'ai aussi lu que la fonction Copy pouvais afficher des erreurs si une des plage avait des cellules fusionnées, ce qui est le cas pour mon fichier Source Produit, cela expliquerai le fait que je ne puisse pas coller... Et le cas échéant comment faire?

    De plus, j'aurais une autre question qui est en rapport avec le sujet, peut-on utiliser une seule variable Workbook et Worksheet pour manipuler plusieurs fichiers et classeurs? Dans ce cas je devrais ouvrir à chaque fois le dossier que j'ai besoin. Et pour plus de clarté faire appel à des sous-programmes.

  12. #12
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Quelques commentaires:
    Inutile de créer une instance de l'application Excel si tu es déjà en VBA (donc dans Excel).
    Le code qui manipule des données dans des feuilles doit se trouver dans un module (et pas dans le code d'une feuille).
    Evite, autant que possible, les Select et privilégie l'instanciation d'objets pour les feuilles et les classeurs.
    Tu avais d'ailleurs bien commencé en créant des instances (Set) pour tes différents classeurs et feuilles. Après, il faut utiliser ces instances et ne plus faire de références, par exemple, à ActiveSheet ou Selection.
    Quand tu utilises Cells, dis toujours à quelle feuille tu te réfères.
    Exemple:
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range(Produitws.Cells(1, 3), Produitws.Cells(5, 10)
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  13. #13
    Futur Membre du Club
    Inscrit en
    Août 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    j'ai remplacer les commandes CopyCut par d'autres commandes plus clair que les premières que j'ai trouvé dans les différents tutotiaux disponibles sur le site. J'ai aussi enlèvé toutes les applications Excel (appExcel), qui étaient inutiles. Et changé le modes d'adressages comme vous me l'avez conseillé et oh miracle, je n'ai plus d'erreur...

    Mais j'ai quand même un problème, ou plutôt une question qui vas sans doute posé problème, quand j'exécute mon macro, il affiche des trois classeurs que j'ai appelé et cré dans le classeur FP les 200 feuilles. Cependant pour le reste, on dirait que rien ne se passe, comme si le programme semblais fini? A-t-on un moyen de vérifier que le programme est toujours actif?


    PS j'ai remplacé le programme du 1er post

  14. #14
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Puisque tu en es à prendre de bonnes habitudes, autant continuer.

    Puisque tu es dans Excel, il est inutile de préciser l'application pour les types:
    Le code est beaucoup plus lisible en préfixant les noms des variables:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim wbkFP As Workbook
    Dim wksFP As Worksheet
    Dim wbkListing As Workbook
    Dim wksListing As Worksheet
    Dim wbkProduit As Workbook
    Dim wksProduit As Worksheet
    A ce sujet, je conseille fortement de lire ce tutoriel.


    Tu as encore des Select inutiles dans ton code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Listingws("Feuil2").Range(Listingws.Cells(lig, 2)).Copy
    FPws("Feuil(" & I & ")").Paste Destination:=FPws("Feuil(" & I & ")").Range(FPws.Cells(5, 12))
    peut avantageusement être remplacé par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set wksFP = wbkFP.("Feuil(" & I & ")")
    wksListing.Listingws.Cells(lig, 2).Copy Destination:=wksFP.Cells(5, 12)
    Tu noteras la suppression de Range qui est inutile pour une seule cellule.


    Ces liges-là sont inutiles dans la boucle puisque les variables sont initialisées avant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set Listing = ActiveWorkbook
    Set Listingws = Listing.ActiveSheet
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  15. #15
    Futur Membre du Club
    Inscrit en
    Août 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Merci encore pour tes conseils et pour le lien pour le tutoriel, encore un qui me manquait et qui me sera utile...


    J'ai bien compris pourquoi il fallait enlever les Excel.. car j'ai deja une application excel ouverte, cependant j'ai toujours les mêmes problèmes, c'est à dire que quand j'excute mon macro, j'ai les trois fichiers qui s'affiche (donc un de 200 qui est plus ou moins trier.. Je vais devoir le modifier..) et c'est tout, je ne sais pas si mon programme tourne toujours ou si simplement il tourne en rond.. aussi comment faire dois-je ? Ajouter un espion, mettre un point d'arrêt, je sais qu'en C on peut voir le parcours du programme, mais apparament pas là.

    J'ai lu que l'on pouvait bloquer le clavier quand le programme tournais et jusqu'a ce qu'il finisse; une solution, mais j'aurais quand même besoin de mon ordi pour continuer de bosser

    Merci encore pour le temps que ca doit prendre de lire ce programme..

  16. #16
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Pour ma part, quand j'ai un traitement long, je crée un Form qui affiche le message de patience et je lance le traitement dans l'événement Activate de ce Form.

    Il n'y a plus qu'à le décharger quand le traitement est terminé.
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  17. #17
    Futur Membre du Club
    Inscrit en
    Août 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    OK, je vais essayer de faire cela pour voir mon programme en esperant que les différents tutoriaux que j'ai télécharger sur votre forum puisse m'aidé (j'ai encore jamais utilisé ces objets).

    Merci encore

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 31/05/2011, 19h05
  2. Réponses: 2
    Dernier message: 20/12/2010, 20h00
  3. comment ouvrir plusieurs fichiers excel?
    Par julianauribe dans le forum MATLAB
    Réponses: 6
    Dernier message: 16/04/2009, 15h45

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