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-E] fusionner 2 pages


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 175
    Par défaut [VBA-E] fusionner 2 pages
    Bonjour,

    J'aimerais savoir comment fusionner le plus efficacement 2 pages excel d'un meme classeur sachant
    - qu'elles contiennent les memes colonnes
    - que le nombre de lignes de chacune est a priori indéterminé

    pour l'instant j'ai une solution en bois qui consiste à compter le nombre de ligne de la "feuille 1" (ca donne le nombre i) et copier le contenu de la "feuille 2" à partir de la ligne i+1 de la "feuille 1"

    je précise que je compte avec une boucle "while"

    ps: je pense que dans qq temps je vous demanderai votre avis quant à l'optimisation de bouts de code que j'ai déjà... j'ai en effet l'impression qu'il peut y avoir des "raccourcis" à ce que j'ai fait grace à des fonctions "built-in" de VBA

    merci d'avance !

  2. #2
    Membre émérite
    Inscrit en
    Septembre 2005
    Messages
    617
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 617
    Par défaut
    va voir ca va te serivr je pense...

    http://www.info-3000.com/vbvba/selec...ioncellule.php

    regarde du coté de currentregion.select

  3. #3
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Pour avoir la première ligne vide dans la feuille 1 (où coller) tu as plusieurs solutions :
    Si certaines lignes de ta plage peuvent être entièremeent vides tu peux faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        PremièreLigneLibre = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row + 1
    Si ta plage est homogène (pas de ligne ni colonne entièrement vides), tu peux utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        PremièreLigneLibre = Selection.CurrentRegion.End(xlDown).Row + 1
    Si tu connais la colonne ayant le plus grand nombre de lignes renseignées, tu peux faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        PremièreLigneLibre = Cells(65535, 1).End(xlUp).Row +1
    Pour connaître la plage à copier dans feuille 2, si ta plage est homogène tu peux la connaître en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        LaPlage = Cells(1, 1).CurrentRegion.Address (RowAbsolute:=False, ColumnAbsolute:=False)
    Si ta plage n'est pas homogène, tu utilises les syntaxe précédente pour connaître la dernièreLigne, et en remplaçant Row par Column pour la dernière colonne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        Cells(1,1).select
        LaPlage = Range(Cells(1, 1), Cells(Selection.CurrentRegion.End(xlDown).Row, _
    Selection.CurrentRegion.End(xlDown).Column)).Address _
    (RowAbsolute:=False, ColumnAbsolute:=False)
    Pour toute explication concernant la syntaxe utilisée : sur chaque terme

    Bonne chance

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut [VBA-E]Syntaxe élémentaire pr copie de plage de cellules
    Je cherche à simplifier le code pour copier une plage de cellules d'une feuille à la suite des cellules renseignées d'une autre feuille.
    Un truc "comme ça" mais qui fonctionnerait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Worksheets("Feuil1").Range("A7:B11") = Worksheets("Feuil2").Range("A1:B4")
    Si quelqu'un a une idée...
    Merci

  5. #5
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    peu- être :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("Feuil2").Range("A1:B4").Copy Worksheets("Feuil1").Range("A7:B10")

  6. #6
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    MatMeuh ? T'es toujours là ?
    Donc, tu remplaces juste "A1:B4" et "A7:B10" par les plages que tu auras établies par l'une des méthodes données plus tôt.

    Merci bbil

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 175
    Par défaut
    Oui je suis toujours là j'étais juste en w-e ! je tente ça ce matin et je reviens vous voir !!!


    merki !

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 175
    Par défaut
    bien.... bon j'ai testé ca :

    Code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WsInstance.Range(WsInstance.UsedRange.Rows("2:" & WsInstance.UsedRange.Rows.Count).Select).Copy WsResultat.Range('WsResultat.Cells.SpecialCells(xlCellTypeLastCell).Row + 1)
    et j'ai une erreur de "Range"

    Sachant que WsInstance représente la feuille ou je veux sélectionner tout sauf la première ligne et est déclarée comme
    Code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Dim WsInstance As Worksheet

    et que WsResultat est la feuille ou je veux copier la sélection précédente, mais en dessus de ce que contient déjà WsResulat. Elle est déclarée comme :
    Code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Dim WsResultat As Worksheet

  9. #9
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Juste un conseil en passant : Essaie déjà de faire ce qu'on te conseille... Ensuite on pourra compliquer pour simplifier ton code
    - Etablis ta plage de cellules à copier
    - Etablis la plage où coller
    - Pour la copie, utilise le code fourni par bbil en remplaçant les adresses par les variables représentant tes deux plages
    Ensuite on verra.

    j'ai vu où tu avais trouvé ton code mais, désolé, je n'ai jamais utilisé cette syntaxe
    UsedRange.Rows("2:" & WsInstance.UsedRange.Rows.Count)
    et ne pourrai donc pas t'aider dans cette direction

    A+

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 175
    Par défaut
    justement c'est bizarre.... je fais ce qu'il faut, j'arrive à sélectionner la bonne partie, à trouver le bon numéro de ligne mais quand je fais effectivement la directive "copy" ... ben ca marche pas

    alors p-e que "copy" ne prend pas les args que j'attends d'autant plus que si je fais une sub a part sur les 2 feuilles ca marche... mais lorsque je l'integre à mon code... ca plante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    WsInstance.Activate
    WsInstance.UsedRange.Rows("2:" & WsInstance.UsedRange.Rows.Count).Select
     
    WsResultat.Activate
    Selection.Copy Destination:=WsResultat.Cells _
                      (WsResultat.UsedRange.CurrentRegion.End(xlDown).Row + 1, 1)
    voila mon bout de code actuel... ca pourrait venir de quoi ces effets de bord étranges ?

    ps: pour le morceau de code de bbil si je mets les "range" j'ai encore plus d'erreurs.... et je sais pas si ca répond completement à mon besoin : j'arrive à sélectionner l'ensemble de la source, j'arrive à identifier à partir de quelle ligne je veux copier, mais j'ai pas l'ensemble du range où va etre copier la source...

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 175
    Par défaut
    mon prob est donc maintenant :

    - j'ai ma sélection faite dans une feuille 1
    - j'ai le num' de ligne de la feuille 2 à partir de laquelle je veux copier la sélection

    comment faire ?

    j'ai testé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Selection.copy destination:=Worksheet("feuille2").Cells(num,1)

  12. #12
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    WsInstance.UsedRange.Rows("2:" & WsInstance.UsedRange.Rows.Count).Copy _ 
            Destination:=WsResultat.Cells(WsResultat.Cells.SpecialCells _
            (xlCellTypeLastCell).Offset(1, 0).Row, 1)

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 175
    Par défaut
    bon, ben là ca fonctionne a priori ... so strange !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    WsInstance.UsedRange.Rows("2:" & WsInstance.UsedRange.Rows.Count).Select
     
    Selection.Copy WsResultat.Cells(WsResultat.UsedRange.CurrentRegion.End(xlDown).Row + 1, 1)
    merci !

  14. #14
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Ok ! Content que bbil soit dans le coin... (salut bbil)
    Un nouveau conseil ? Sont tous gratuits ce matin... Si tu veux éviter les mouvements de feuilles quand s'exécute ton code, si tu veux accélerer ton code... Evite les "select", ton code aimera mieux et se déroulera en douceur.
    Dis nous

    A+

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 175
    Par défaut
    Merci beaucoup !!!

    en tant que newb, j'avais en effet tendance à décomposer avec des "select"

    ps: c'est p-e aussi plus clair pour qqn qui reprendrait le code non ?
    pps: en tout cas, ca marche au poil !

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 175
    Par défaut
    en fait non ca marche pas !!!! mais comme c'est étrange !!!

    je fais une fois la copie ca roule... une autre fois juste derriere et plus rien ne va !!!!

    j'ai essayé avec les 2 méthodes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WsInstance.UsedRange.Rows("2:" & WsInstance.UsedRange.Rows.Count).Copy WsResultat.Cells(WsResultat.UsedRange.CurrentRegion.End(xlDown).Row + 1, 1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     WsInstance.UsedRange.Rows("2:" & WsInstance.UsedRange.Rows.Count).Copy Destination:=WsResultat.Cells(WsResultat.Cells.SpecialCells(xlCellTypeLastCell).Offset(1, 0).Row, 1)
    et qui plus est le problème est différent !

    avec le premier code, l'erreur d'exécution se produit au premier passage
    avec le deuxième code, l'erreur est au second !!!

  17. #17
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    l'erreur à bien lieu sur cette ligne ? il y as un message .?

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 175
    Par défaut
    dans les 2 cas j'ai l'erreur

    Erreur d'exécution 1004
    Impossible de copier car les zones de Copier et Collage sont de format différent.

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 175
    Par défaut
    Le problème vient que le UsedRange de la première partie n'est pas bon

    WsInstance.UsedRange.Rows.Count renvoie un nombre bcp trop grand et donc il y a explosion de la limite excel de 65000 et quelques

    comment se fait ce que le UsedRange peut ne pas fonctionner à chaque fois ? comment faire ?

  20. #20
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 175
    Par défaut
    Y'a quand meme un problème la.... on tourne en rond autour de qq chose qui est des plus simples !!!!


    Je repose donc la problèmatique

    J'ai feuille1, feuille2, ... , feuilleX qui ont toutes les memes colonnes colonne1, colonne2,..., colonneX

    comment faire pour avoir feuille_resultat avec toutes les colonnes ainsi que l'ensemble des lignes de toutes les feuilles ? ... en gros la fusion de feuille excel de meme nature !

    merci

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [VBA-E]Numéro de page 1/X
    Par MJMJ dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 20/04/2006, 18h56
  2. [VBA-E] Mise en page de tout le classeur avec nb feuill inconnu
    Par tonf dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 20/04/2006, 15h25
  3. [VBA-W]Numéro de page des titres d'un document Word
    Par bonigo dans le forum VBA Word
    Réponses: 9
    Dernier message: 07/04/2006, 18h22
  4. [VBA-E] Numéro de page
    Par franckh99 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 14/03/2006, 18h04
  5. [VBA-W]sauter une page...
    Par gusrom86 dans le forum VBA Word
    Réponses: 2
    Dernier message: 07/02/2006, 13h20

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