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 :

Débutant: Application à toutes les feuilles d'un classeur


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 11
    Points : 7
    Points
    7
    Par défaut Débutant: Application à toutes les feuilles d'un classeur
    Bonjour,
    Je suis nouveau par ici...et ça m'a l'air très intéressant!
    Voici mon problème:
    J'ai un classeur avec plusieurs feuille.
    Selon certains critères, je dois copier une plage de chaque feuille ET la copier dans une nouvelle feuille.
    J'arrive le faire pour une feuille avec la manière suivante:

    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
    Sub enter()
    Dim istartrow, iStartCol, iendRow, iendCol As Integer
     
    Dim cpteurrow As Integer
    cpteurrow = 3
    While Not Cells(cpteurrow, 3) = ""
    cpteurrow = cpteurrow + 1
    Wend
    Range("c3") = cpteurrow - 1
     
    Dim cpteurcol As Integer
    cpteurcol = 2
    While Not Cells(2, cpteurcol) = ""
    cpteurcol = cpteurcol + 1
    Wend
    Range("c3") = cpteurcol
     
    istartrow = 3: iStartCol = 1
    iendRow = cpteurrow - 1: iendCol = cpteurcol
    Range(Cells(istartrow, iStartCol), Cells(iendRow, iendCol)).Copy
     
    Workbooks.Add
     
    ActiveSheet.Paste
    End Sub
    Donc maintenant, c'est là que je suis coincé.
    Je voudrais faire cette opération sur toute les feuilles de mon classeur et les coller à la suite dans la nouvelle feuille. (je pense qu'il y a une addition de mes cpteurcol là-dessous)
    Pouvez-vous me donner des pistes à suivre?
    Merci d'avance et meilleures salutations

  2. #2
    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
    Points : 15 546
    Points
    15 546
    Par défaut
    Sans regarder si ton code fait bien ce que tu veux (je ne sais pas à partir de quelle ligne tu colles tes données) pour passer en revue toutes les feuilles d'un classeur, tu peux faire
    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
    Dim CL1 as Workbook
    Dim FL1 as Worksheet
    Dim CL2 as Workbook
    Dim FL2 as Worksheet
    
    Dim istartrow, iStartCol, iendRow, iendCol As Integer
    Dim cpteurrow As Integer
    Dim cpteurcol As Integer
    
    'instance du classeur dont tu copies les plages de données
    Set CL1 = Workbooks("TonClasseur.xls")
    
    'instance du classeur créé
    Set CL2 = Workbooks.Add
    
    'Instance de la feuille active du nouveau classeur (sans doute "Feuil1")
    Set FL2 = Activesheet
    
        'On passe en revue toutes les feuilles du classeur CL1
        For each FL1 in CL1.worksheets
    
            cpteurrow = 3
            'FL1 est une feuille du classeur CL1
            While Not FL1.Cells(cpteurrow, 3) = ""
                cpteurrow = cpteurrow + 1
            Wend
            FL1.Range("c3") = cpteurrow - 1
     
            cpteurcol = 2
            While Not FL1.Cells(2, cpteurcol) = ""
                cpteurcol = cpteurcol + 1
            Wend
            FL1.Range("c3") = cpteurcol
     
            istartrow = 3: iStartCol = 1
            iendRow = cpteurrow - 1: iendCol = cpteurcol
    
            'Colle la plage de FL1 sur FL2 qui est "feuil1" de CL2
            '.......sur quelle lignes colles-tu tes données ?
            FL1.Range(Cells(istartrow, iStartCol), Cells(iendRow, iendCol)).Copy _
            FL2 'Paste n'est pas indispensable si tu mets copie et collage sur la même ligne de code
        Next
    End Sub
    A+

  3. #3
    Futur Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Merci beaucoup pour la réponse!
    En fait, je veux coller les données dès la ligne 1 du nouveau fichier que j'ai ouvert et si possble toutes les données à la suite.
    Donc les données de la première feuille, puis celle de la deuxième, etc ->tout sur la meme nouvelle feuille

    et j'ai quelques questions sur ton code
    - pourquoi tu as pas de Set FL1
    - j'ai de la peine à comprendre ce que tu veux dire à la fin (depuis 'colle les données...) et surtout ce que je dois faire pour le copy/paste

    Encore mille mercis pour ton aide!

  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
    Points : 15 546
    Points
    15 546
    Par défaut
    Citation Envoyé par spirit1300 Voir le message
    En fait, je veux coller les données dès la ligne 1 du nouveau fichier que j'ai ouvert et si possble toutes les données à la suite.
    C'est bien ce qu'il me semblait. Là tu colles toutes tes plages les unes sur les autres.
    Pour coller ces plages à la suite l'une de l'autre, tu dois définir la première ligne vide dans FL2
    - j'ai de la peine à comprendre ce que tu veux dire à la fin (depuis 'colle les données...) et surtout ce que je dois faire pour le copy/paste
    Je m'aperçois que la mise en rouge de la ligne a supprimé un saut de ligne. Je corrige.
    Maintenant pour ce que j'ai mis, tu réponds à ma question dans ta première observation.
    La syntaxe que j'utilise copie et colle en une seule ligne la plage prise sur FL1 sur la première ligne de FL2.
    FL1.Range(Cells(istartrow, iStartCol), Cells(iendRow, iendCol)).Copy _
    FL2 'J'avais une erreur, j'ai corrigé (suppression de Activesheet)
    C'est ceci que tu dois modifier pour placer tes plages à la suite les unes des autres.
    Citation Envoyé par spirit1300
    - pourquoi tu as pas de Set FL1
    Si, je crée bien l'instance de la feuille FL1, ici
    For each FL1 in CL1.worksheets
    La correction à apporter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            Dim PremLigVid as long
     
            PremLigVid = FL2.Cells(Columns(1).Cells.Count, 1).End(xlUp).Row + 1
            FL1.Range(Cells(istartrow, iStartCol), Cells(iendRow, iendCol)).Copy _
            FL2.Cells(1, PremLigVid)
    Tu dis
    A+

  5. #5
    Futur Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Merci beaucoup pour toute l'explication!
    J'ai donc remplacé les dernières lignes de code par les nouvelles pour le collage des données.
    Maintenant, ca me marque erreur 438
    Object doesnt support this property or method
    avec cette ligne en jaune:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     FL1.Range(Cells(istartrow, iStartCol), Cells(iendRow, iendCol)).Copy FL2.Cells(1, PremLigVid)
    (si jamais, j'ai excel 2002)

    merci encore!

  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
    Points : 15 546
    Points
    15 546
    Par défaut
    Vérifie ce que tu as dans tes variables istartrow, iStartCol, iendRow, iendCol
    Pour ça, tu vas dans l'éditeur VB, tu affiches la fenêtre "Exécution" et dans le code, avant la ligne de copie, tu ajoutes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Debug.print "istartrow = " & istartrow
    Debug.print "iStartCol = " & iStartCol
    Debug.print "iendRow = " & iendRow
    Debug.print "iendCol = " & iendCol
    Si l'une d'elle = 0 alors tu as ton erreur. C'est la partie du code que je n'ai pas vérifiée et je ne peux pas vérifier
    A+

  7. #7
    Futur Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Alors je n'ai pas de 0, mais je dois avoir un autre problème....
    je te mets ci-dessous mon fichier (un extrait, car j'ai 10 feuilles)
    mon but:
    faire une feuille qui récapitule les données (donc sans les entêtes) entre:
    la cellule A3
    et
    la cellule EN$(donc la première cellule vide +1 depuis la colonne 2) de la dernière ligne ou il y a qqch en colonne 3

    je ne veux donc pas non plus la colonne "Comments"

    Merci beaucoup!

    EDIT: j'ai modifié le fichier joint, car il y avait une feuille cachée
    Fichiers attachés Fichiers attachés

  8. #8
    Futur Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Alors j'ai fait un grand controle du fichier ci-dessus:

    les cellules de sélection pour copy sont corrects pour chaque feuille.
    Mon souci vient donc uniquement de la partie ou ont fait le copier-coller.
    Il y a deja un problème au moment de copier la 1er plage (car si je laisse la ligne (donc je ne mets pas de " ' " avant), ca m'arrete le debug.print).
    Quelqu'un aurait une petite idée?

    Merci d'avance

    EDIT: j'ai avancé! j'arrive à faire mon copier/Coller avec cette modification de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim PremLigVid As Long
     PremLigVid = 0
            PremLigVid = FL2.Cells(Columns(1).Cells.Count, 1).End(xlUp).Row + 1
          FL1.Activate
          Range(Cells(istartrow, iStartCol), Cells(iendRow, iendCol)).Copy Destination:=FL2.Cells(PremLigVid, 1)
    mais maintenant, ca commence sur la ligne 2....

  9. #9
    Futur Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Alors voilà, j'ai ma ma macro qui fait tout ce que je veux...
    Merci pour ton aide ouskel'n'or

    le 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
    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
    Sub deventer()
    Dim CL1 As Workbook
    Dim FL1 As Worksheet
    Dim CL2 As Workbook
    Dim FL2 As Worksheet
     
    Dim istartrow, iStartCol, iendRow, iendCol As Integer
    Dim cpteurrow As Integer
    Dim cpteurcol As Integer
     
     Dim PremLigVid As Long
     
    'instance du classeur dont tu copies les plages de données
    Set CL1 = Workbooks("test_dsa.xls")
     
    'instance du classeur créé
    Set CL2 = Workbooks.Add
     
    'Instance de la feuille active du nouveau classeur (sans doute "Feuil1")
    Set FL2 = ActiveSheet
     
        'On passe en revue toutes les feuilles du classeur CL1
        For Each FL1 In CL1.Worksheets
     
            cpteurrow = 3
            'FL1 est une feuille du classeur CL1
            While Not FL1.Cells(cpteurrow, 3) = ""
                cpteurrow = cpteurrow + 1
            Wend
            FL1.Range("c3") = cpteurrow - 1
     
            cpteurcol = 2
            While Not FL1.Cells(2, cpteurcol) = ""
                cpteurcol = cpteurcol + 1
            Wend
            FL1.Range("c3") = cpteurcol
     
            istartrow = 3: iStartCol = 1
            iendRow = cpteurrow - 1: iendCol = cpteurcol
     
            'Debug.Print "istartrow = " & istartrow
            'Debug.Print "iStartCol = " & iStartCol
            'Debug.Print "iendRow = " & iendRow
            'Debug.Print "iendCol = " & iendCol
     
     
     
     
            PremLigVid = FL2.Cells(Columns(1).Cells.Count, 1).End(xlUp).Row + 1
            'Debug.Print "PremLigVid = " & PremLigVid
          FL1.Activate
          Range(Cells(istartrow, iStartCol), Cells(iendRow, iendCol)).Copy Destination:=FL2.Cells(PremLigVid, 1)
     
              Next
              FL2.Rows(1).Delete
     
    End Sub

  10. #10
    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
    Points : 15 546
    Points
    15 546
    Par défaut
    Citation Envoyé par spirit1300
    mais maintenant, ca commence sur la ligne 2....
    Quand la feuille est vide, c'est normal. La ligne de code cherche le dernière ligne renseignée et + 1 te permet d'obtenir la première ligne vide après la dernière ligne renseignée. Si ta feuille est vide, le code seul donne 1 et si tu fais +1, tu as 2. Tu peux tester PremLigVid et ajouter sur la ligne suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            PremLigVid = FL2.Cells(Columns(1).Cells.Count, 1).End(xlUp).Row + 1
            If PremLigVid = 2 and FL2.Cells(1,1) = empty then PremLigVid = 1

  11. #11
    Futur Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Merci pour ta réponse...ta solution est plus propre que la mienne...je me suis pas posé de question, j'ai supprimé la première ligne

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 18/09/2008, 08h18
  2. Réponses: 2
    Dernier message: 06/05/2008, 16h05
  3. effacer toutes les feuilles d'un classeur commencant par "GRAPH"
    Par oscar.cesar dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 25/11/2007, 19h40
  4. Comment parcourir toutes les feuilles d'un classeur excel?
    Par Subkill dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 01/02/2007, 20h47
  5. Action sur toutes les feuilles d'un classeur
    Par beurnoir dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 23/12/2005, 15h11

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