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 :

Fiche synthèse de plusieurs onglets


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Acheteur
    Inscrit en
    Juillet 2017
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Acheteur

    Informations forums :
    Inscription : Juillet 2017
    Messages : 43
    Points : 17
    Points
    17
    Par défaut Fiche synthèse de plusieurs onglets
    Bonjour tout le monde,

    J'ai 45 feuilles nommé "A", "B", etc dans un fichier Excel. Elles ont toutes des données de C4 à S254.

    Je souhaite faire un copier coller de chaque feuille dans une autre nommé "Suivi AR" mais voici mon problème :

    J'ai essayé différent moyen mais je n'en trouve pas pour copier les colonnes de C à S mais en s’arrêtant à la dernière cellule non vide en C.

    Le but étant de compiler les 45 feuilles dans une seule.

    Je peux vous joindre un bout de fichier pour comprendre mon besoin.


    Merci par avance



    Base test.xlsx

  2. #2
    Membre actif Avatar de lucasgaetan
    Homme Profil pro
    dessinateur BE
    Inscrit en
    Août 2011
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : dessinateur BE
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2011
    Messages : 171
    Points : 276
    Points
    276
    Par défaut
    bonjour,

    pour la dernière ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim DernLigneClnnC As Long
    DernLigneClnnC = ActiveSheet.Range("C1048576").End(xlUp).Row
    bon courage

  3. #3
    Membre à l'essai
    Homme Profil pro
    Acheteur
    Inscrit en
    Juillet 2017
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Acheteur

    Informations forums :
    Inscription : Juillet 2017
    Messages : 43
    Points : 17
    Points
    17
    Par défaut
    Bonjour,

    Merci pour la réponse mais le soucis c'est que je souhaite copier les cellules jusqu'à la dernière cellule non vide et non jusqu'en bas du tableau en pièce jointe.

    Mon tableau est fait de sorte à ce que je n'ai pas plus de 254 lignes à copier


    EDIT:

    Je n'ai peut-être pas été assez précis. Vous trouverez ci-joint le fichier.
    Je souhaite copier les données de C4 à Cx étant la dernière ligne non vide mais copier jusqu'à S soit toutes la plage dans l'onglet "Suivi AR"

    Oui j'arrive à copier juste la colonne C mais pas la plage qui va avec.

    Merci !

    Base test.xlsx

  4. #4
    Membre actif Avatar de lucasgaetan
    Homme Profil pro
    dessinateur BE
    Inscrit en
    Août 2011
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : dessinateur BE
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2011
    Messages : 171
    Points : 276
    Points
    276
    Par défaut
    RE,

    Si j'ai bien compris ta demande, tu veux copier C4 à Sx , x etant la derniere ligne non vide de la colonne C:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    'pour chaque feuille
    Dim DernLigneClnnC As Long
    DernLigneClnnC = ActiveSheet.Range("C1048576").End(xlUp).Row
    Range("C4:S" & DernLigneClnnC ).Select
    Selection.Copy
    et ensuite coller dans ta feuille "Suivi AR" à la 1er ligne vide de la colonne A
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        Sheets("Suivi AR").Select
    Dim DernLigneClnnA As Long
        DernLigneClnnA = ActiveSheet.Range("A1048576").End(xlUp).Row
        DernLigneClnnA = DernLigneClnnA + 1
        Range("A" & DernLigneClnnA).Select
        ActiveSheet.Paste
    il te reste plus qu'à traverser ton document avec une boucle

  5. #5
    Membre à l'essai
    Homme Profil pro
    Acheteur
    Inscrit en
    Juillet 2017
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Acheteur

    Informations forums :
    Inscription : Juillet 2017
    Messages : 43
    Points : 17
    Points
    17
    Par défaut
    Bonjour,

    Je vous remercie ça marche super bien pour une feuille c'est exactement ce que je cherchais.
    Par contre je souhaite faire une boucle pour tous mes onglets alors je suis parti comme ça

    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
    Dim DernLigneClnnC As Long
    DernLigneClnnC = ActiveSheet.Range("C1048576").End(xlUp).Row
     
     
    Dim DernLigneClnnA As Long
        DernLigneClnnA = ActiveSheet.Range("A1048576").End(xlUp).Row
        DernLigneClnnA = DernLigneClnnA + 1
     
     
    Sheets("A").Select
    Range("C4:S" & DernLigneClnnC).Select
    Selection.Copy
    Sheets("Suivi AR").Select
    Range("A" & DernLigneClnnA).Select
    ActiveSheet.Paste
     
    Sheets("B").Select
    Range("C4:S" & DernLigneClnnC).Select
    Selection.Copy
    Sheets("Suivi AR").Select
    Range("A" & DernLigneClnnA).Select
    ActiveSheet.Paste
    Mais ça copie le haut du tableau et non le bas.
    Pourtant, comme DIM est une variable ne doit t-il pas être mis au début de la macro ?

  6. #6
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 766
    Points : 28 625
    Points
    28 625
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Par contre je souhaite faire une boucle pour tous mes onglets alors je suis parti comme ça
    La boucle For Each ... In Next est faite pour cela.
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub t()
     Dim sht As Worksheet
     For Each sht In ThisWorkbook.Worksheets
      MsgBox sht.Name
     Next
    End Sub
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  7. #7
    Membre actif Avatar de lucasgaetan
    Homme Profil pro
    dessinateur BE
    Inscrit en
    Août 2011
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : dessinateur BE
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2011
    Messages : 171
    Points : 276
    Points
    276
    Par défaut
    re,

    Regarde ton code il n'est pas bien ordonné, tu stockes tes variables "DernLigneClnnX" en debut de cycle alors qu'il faut les réinitialier à chaque fois.
    de plus, tu as tout interet à faire une "vrais" boucle
    pour t'aider va voir les tutos:
    http://silkyroad.developpez.com/vba/boucles/
    le sommaire des tuto
    https://excel.developpez.com/cours/?page=prog

    bon courage

  8. #8
    Membre émérite
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 703
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 703
    Points : 2 813
    Points
    2 813
    Par défaut
    Bonjour,
    2 remarques sur ton code qui pourront t'aider ensuite à adapter le code avec une boucle (For Each) :

    1. Evite les Select/Activate ... ils entraînent souvent des problèmes difficiles à repérer.
    N'écris pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sheets("A").Select
    Range("C4:S" & DernLigneClnnC).Select
    Selection.Copy
    Sheets("Suivi AR").Select
    Range("A" & DernLigneClnnA).Select
    ActiveSheet.Paste

    Mais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("A").Range("C4:S" & DernLigneClnnC).Copy destination:=Sheets("Suivi AR").Range("A" & DernLigneClnnA)
    Plus rapide, n'est-ce pas ? Et plus sûr aussi.
    2. Quand tu as finis d'utiliser une variable dans un code, tu peux la ré-utiliser pour le même type d'utilisation. Par ex.:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim i As Integer
    i = 3
    MsgBox "La famille Dupond a " & i & " enfants."
    i = 6
    MsgBox "La famille Durand a " & i & " enfants."
    Tu n'as pas besoin d'utiliser un i pour les Dupond et une autre variable (par ex. j) pour les Durand.

    Quand tu feras ta boucle : avant la boucle, tu déclareras une variable dernLigne (par ex.) que tu recalculeras à chaque itération de la boucle.
    Attention à ne pas utiliser des noms à rallonge pour tes variables cela augmente le risque d'erreur de frappe.

  9. #9
    Membre à l'essai
    Homme Profil pro
    Acheteur
    Inscrit en
    Juillet 2017
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Acheteur

    Informations forums :
    Inscription : Juillet 2017
    Messages : 43
    Points : 17
    Points
    17
    Par défaut
    Re-bonjour à tous,

    Je vous remercie de chercher à m'aider.

    Lucasgaetan j'ai regardé des tutos et j'ai compris pour Dim comment ça fonctionnait merci pour ça !

    Donc voilà le code est ça fonctionne correctement

    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
    Sheets("A").Select
    Dim DernLigneClnnC As Long
    DernLigneClnnC = ActiveSheet.Range("C1048576").End(xlUp).Row
    Range("C4:S" & DernLigneClnnC).Select
    Selection.Copy
     
    Sheets("Suivi AR").Select
    Dim DernLigneClnnA As Long
        DernLigneClnnA = ActiveSheet.Range("A1048576").End(xlUp).Row
        DernLigneClnnA = DernLigneClnnA + 1
        Range("A" & DernLigneClnnA).Select
        ActiveSheet.Paste
     
     
    Sheets("B").Select
    DernLigneClnnC = ActiveSheet.Range("C1048576").End(xlUp).Row
    Range("C4:S" & DernLigneClnnC).Select
    Selection.Copy
     
    Sheets("Suivi AR").Select
        DernLigneClnnA = ActiveSheet.Range("A1048576").End(xlUp).Row
        DernLigneClnnA = DernLigneClnnA + 1
        Range("A" & DernLigneClnnA).Select
        ActiveSheet.Paste
     
     
    Sheets("C").Select
    DernLigneClnnC = ActiveSheet.Range("C1048576").End(xlUp).Row
    Range("C4:S" & DernLigneClnnC).Select
    Selection.Copy
     
    Sheets("Suivi AR").Select
        DernLigneClnnA = ActiveSheet.Range("A1048576").End(xlUp).Row
        DernLigneClnnA = DernLigneClnnA + 1
        Range("A" & DernLigneClnnA).Select
        ActiveSheet.Paste


    Mais voilà le soucis, au final j'ai 45 pages à compiler .... Alors j'essaye de comprendre la boucle dont Philippe Tulliez parle mais je vous avouerai qu'en VBA je sais faire les trucs de base mais j'ai énormément de mal à comprendre.

    Donc pour utiliser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim sht As Worksheet
     For Each sht In ThisWorkbook.Worksheets
      MsgBox sht.Name
     Next

    Je ne vois pas comment créer une boucle pour que ce soit fait sur toutes les feuilles sans faire un bête copier/coller de la macro au dessus en changeant juste le nom de l'onglet.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim sht As Worksheet
     For Each sht In ThisWorkbook.Worksheets
     If Ws.Name = "Feuil2" Then Exit For
     'exeption que je change si j'arrive sur une feuille que je ne veux pas compiler
     
     Next
    Mais pour que la boucle se fasse, je dois intégrer une répétition avec x= mais je suppose que x doit être égal à ma première formule si je veux que la boucle fasse ma macro non ?

    Riaolle, merci et je dois avouer que je dois voir ça de plus près car j'ai d'autres macros mais beaucoup plus lourdes car je détaille tout de A à Z car je ne sais pas utiliser les boucles et j'ai donc une macro par feuille.

  10. #10
    Membre émérite
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 703
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 703
    Points : 2 813
    Points
    2 813
    Par défaut
    Attention, si tu écris Exit For, tu sors de la boucle, mais tu ne continues pas avec les prochaines feuilles. il faudrait que tu mettes une condition si le nom de la feuille <> Feuil2, alors je fais l'opération que je veux faire sur la feuille.
    Mais pour que la boucle se fasse, je dois intégrer une répétition avec x= mais je suppose que x doit être égal à ma première formule si je veux que la boucle fasse ma macro non ?
    Heu, j'ai pas compris ...
    Pour comprendre les boucles, lis les tutos, mais je peux te donner un exemple.
    Supposons que nous voulions écrire "toto" dans toutes les feuilles en cellule A1.
    On écrit d'abord une méthode qui permet d'écrire toto dans la cellule A1 d'une feuille donnée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub ecrireToto(feuille As Worksheet)
        feuille.Range("A1").Value = "toto"
    End Sub
    Puis on écrit notre boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub boucleToto()
        Dim ws As workSheet
        For Each ws In ThisWorkbook.Worksheets          'boucle sur toutes les feuilles
              Call ecrireToto(ws)              'on appelle la méthode ecrireToto pour la feuille ws.
        Next ws
    End Sub
    Est-ce que tu comprends ?

  11. #11
    Membre à l'essai
    Homme Profil pro
    Acheteur
    Inscrit en
    Juillet 2017
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Acheteur

    Informations forums :
    Inscription : Juillet 2017
    Messages : 43
    Points : 17
    Points
    17
    Par défaut
    Bonjour,

    Merci pour l'explication. Je ne comprenais pas que je devais créer deux macros et que la boucle appelle l'autre.


    Donc j'essaye d'adapter à mon problème et voici ce que j'ai

    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 suivi(feuille As Worksheet)
     
    'pour chaque feuille
     
     
    Dim DernLigneClnnC As Long
    DernLigneClnnC = ActiveSheet.Range("C1048576").End(xlUp).Row
    Range("C4:S" & DernLigneClnnC).Select
    Selection.Copy
     
    Sheets("Suivi AR").Select
    Dim DernLigneClnnA As Long
        DernLigneClnnA = ActiveSheet.Range("A1048576").End(xlUp).Row
        DernLigneClnnA = DernLigneClnnA + 1
        Range("A" & DernLigneClnnA).Select
        ActiveSheet.Paste
    Et la boucle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub boucle()
     
    Dim sht As Worksheet
     For Each sht In ThisWorkbook.Worksheets
     
        Call suivi(sht)
     
     Next
     
     
    End Sub
    Alors ça ne me mets pas d'erreurs et ça compile. Le seul soucis c'est que ça ne compile rien
    Je pense que ça vient de ma première macro car je n'intègre pas "feuille" et c'est là mon soucis. Une idée ?

    En tout cas grâce à toi j'ai compris le principe des boucles ! Faut que je lise les tutos mais c'est quand même pas évidement au début ^^
    Ca sera surtout pour simplifier mes autres macros... Si je vous les poste vous allez me fusiller tellement c'est horrible à voir

  12. #12
    Membre émérite
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 703
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 703
    Points : 2 813
    Points
    2 813
    Par défaut
    Je pense que ça vient de ma première macro car je n'intègre pas "feuille" et c'est là mon soucis.
    Oui, as-tu bien compris à quoi sert l'objet feuille ?
    Pour t'aider à trouver la solution, je ré-itère mon conseil :
    Evite les Select/Activate ... ils entraînent souvent des problèmes difficiles à repérer.
    N'écris pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sheets("A").Select
    Range("C4:S" & DernLigneClnnC).Select
    Selection.Copy
    Sheets("Suivi AR").Select
    Range("A" & DernLigneClnnA).Select
    ActiveSheet.Paste

    Mais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("A").Range("C4:S" & DernLigneClnnC).Copy destination:=Sheets("Suivi AR").Range("A" & DernLigneClnnA)
    Je reprends donc ton code, mais enlevant les Activate/Select ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub suivi(feuille As Worksheet)
     
    Dim DernLigneClnnC As Long
    Dim DernLigneClnnA As Long
    DernLigneClnnC = ActiveSheet.Range("C1048576").End(xlUp).Row
    DernLigneClnnA = ActiveSheet.Range("A1048576").End(xlUp).Row + 1
     
    ActiveSheet.Range("C4:S" & DernLigneClnnC).Copy destination:=Sheets("Suivi AR").Range("A" & DernLigneClnnA)
    Dans ton code tu dis "copier les données xxx de la feuille active et les coller dans la feuille Suivi AR". Ce n'est pas ce que tu veux avec cette méthode, n'est-ce pas? Toi tu veux : "copier les données xxx de la feuille feuille et les coller dans la feuille Suivi AR". Tu comprends ?
    Vois-tu comment changer ton code maintenant ?


    EDIT complément :
    Je ne comprenais pas que je devais créer deux macros et que la boucle appelle l'autre.
    Tu ne DOIS pas. C'est seulement pour bien structurer ton code, pour qu'il soit bien lisible. A la limite, ici tu aurais pu faire sans, car tu n'as pas beaucoup d'opérations à effectuer dans ta boucle. Mais dans le cas où tu as des macros avec beaucoup d'opérations, c'est mieux de découper la macro principale en plusieurs macros élémentaires.

  13. #13
    Membre à l'essai
    Homme Profil pro
    Acheteur
    Inscrit en
    Juillet 2017
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Acheteur

    Informations forums :
    Inscription : Juillet 2017
    Messages : 43
    Points : 17
    Points
    17
    Par défaut
    Bonjour,

    Merci pour le code j'ai oublié de transformer avec le conseil..

    En fait non, je souhaite que la boucle copie les données de la feuille A dans Suivi AR, ensuite de la feuille B dans Suivi AR à la suite etc.
    Sur 45 feuilles différentes...

    Mais je n'arrive pas à intégrer une variable pour le changement de feuille de A vers B puis vers C etc



    EDIT complémentaire : Merci pour l'info

  14. #14
    Membre émérite
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 703
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 703
    Points : 2 813
    Points
    2 813
    Par défaut
    Je ne suis pas sûre que tu aies bien compris.
    je souhaite que la boucle copie les données de la feuille A dans Suivi AR, ensuite de la feuille B dans Suivi AR à la suite etc
    Soit feuille une feuille parmis les feuilles A, B, C ... Tu veux copier les données de feuille dans Suivi AR. Le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub suivi(feuille As Worksheet)
     
    Dim DernLigneClnnC As Long
    Dim DernLigneClnnA As Long
    DernLigneClnnC = ActiveSheet.Range("C1048576").End(xlUp).Row
    DernLigneClnnA = ActiveSheet.Range("A1048576").End(xlUp).Row + 1
    
    ActiveSheet.Range("C4:S" & DernLigneClnnC).Copy destination:=Sheets("Suivi AR").Range("A" & DernLigneClnnA)
    End Sub
    copie les données de la feuille active vers Suivi AR. Or toi, tu veux copier les données de la feuille feuille vers la Suivi AR. Comment peux-tu adapter le code dans ce cas là ?

    Ca c'est l'étape 1 : on a un code qui permet de copier les données de n'import qu'elle feuille vers Suivi AR.
    Etape 2 : on utilise ce code pour copier les données de feuilles bien précises (A, B, C ....) --> on fait une boucle sur les feuilles.
    Est-ce qu'il n'y a que les feuille A, B, C etc .. et Suivi AR dans ton classeurs ? En faisant une boucle For Each sht in Worksheets, tu fais une boucle sur TOUTES les feuilles du classeur. Il faut donc mettre des conditions pour ne pas prendre en compte certaines feuilles le cas échéant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub boucle()
    Dim sht As Worksheet
     For Each sht In ThisWorkbook.Worksheets
        If sht.Name <> "Suivi AR" Then Call suivi(sht)
     Next sht
    End Sub

  15. #15
    Membre à l'essai
    Homme Profil pro
    Acheteur
    Inscrit en
    Juillet 2017
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Acheteur

    Informations forums :
    Inscription : Juillet 2017
    Messages : 43
    Points : 17
    Points
    17
    Par défaut
    Je ne comprends pas... J'utilise bien vos macros mais pourtant ça ne fonctionne pas, rien ne se copie.
    Pourtant je comprends bien le fonctionnement de vos macros, une "générique" pour copier la sélection et la coller dans Suivi AR mais pourtant quand je l’exécute elle ne copie rien du tout et je bloque complètement...


    Est-ce qu'il n'y a que les feuille A, B, C etc .. et Suivi AR dans ton classeurs ?
    Non j'en ai d'autres donc je dois trouver la variable pour avoir plusieurs exceptions dans la boucle. Je vais regarder ce soir sur les tutos.

  16. #16
    Membre émérite
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 703
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 703
    Points : 2 813
    Points
    2 813
    Par défaut
    Attention, je ne t'ai pas donné la solution. Pour l'instant, j'essaie de t'y amener : relis bien mon message precedent ! Le code avec la boucle est OK, mais le code générique doit encore être adapté. Saurais-tu l'adapter avec les commentaires et explications que je te fais ?
    Pour l'instant quels sont tes codes ?

  17. #17
    Membre à l'essai
    Homme Profil pro
    Acheteur
    Inscrit en
    Juillet 2017
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Acheteur

    Informations forums :
    Inscription : Juillet 2017
    Messages : 43
    Points : 17
    Points
    17
    Par défaut
    Si la boucle est bonne on la laisse de côté.

    Voilà mon raisonnement

    Je dois changer la feuille active par une variable qui correspond aux feuilles A B C etc
    Je vais donc utliser
    Une fois que j'utilise ça, je dois l'intégrer à ma formule générique


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim DernLigneClnnC As Long
    Dim DernLigneClnnA As Long
    Dim Ws As Worksheet
    DernLigneClnnC = Activesheet.Range("C1048576").End(xlUp).Row
    DernLigneClnnA = Activesheet.Range("A1048576").End(xlUp).Row + 1
     
    Activesheet.Range("C4:S" & DernLigneClnnC).Copy Destination:=Sheets("Suivi AR").Range("A" & DernLigneClnnA)
    Et maintenant je dois changer Activesheet par ma variable Ws
    Mais quand je la change, la macro me met une erreur car
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DernLigneClnnC = Ws.Range("C1048576").End(xlUp).Row
    DernLigneClnnA = Ws.Range("A1048576").End(xlUp).Row + 1
    Ne peut pas fonctionner.

    Ais-je le bon raisonnement ou pas ?

  18. #18
    Membre émérite
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 703
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 703
    Points : 2 813
    Points
    2 813
    Par défaut
    On y est presque !
    2 explications :
    1. Si tu écris cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim Ws As Worksheet
    DernLigneClnnC = Ws.Range("C1048576").End(xlUp).Row
    DernLigneClnnA = Ws.Range("A1048576").End(xlUp).Row + 1
    Tu ne dis jamais ce que vaut Ws, mais tu l'utilises ensuite. C'est comme si tu me disais "Soit x le nombre de pommes dans mon panier. Si x < 10, alors tu dois aller au marché m'acheter des pommes". Je ne saurais jamais si je dois aller au marché, car tu ne me dis pas ce que vaut x.
    2. Tu n'as pas besoin d'une nouvelle variable. Tu n'as pas très bien compris comment marche une méthode avec un argument. Prenons un exemple simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub fois2(x As Integer)
        Range("A1").Value = 2 * x
    End Sub
    Cette méthode permet d'écrire le double d'un entier donné (x) dans la cellule A1. Si je veux écrire le double de 5 je lance :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub test()
        Call fois2(5)
    End Sub
    Je peux aussi lancer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub test2()
        Dim x As Integer
        x = 5
        Call fois2(x)
    End Sub
    (mais la première est quand même plus rapide...)

    Si on reviens à ton cas, on se dit : notre méthode doit faire une copie d'une feuille données vers une autre. La feuille donnée, c'est feuille.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub suivi(feuille As Worksheet)
    Dim DernLigneClnnC As Long
    Dim DernLigneClnnA As Long
    DernLigneClnnC = feuille.Range("C1048576").End(xlUp).Row
    DernLigneClnnA = feuille.Range("A1048576").End(xlUp).Row + 1
    feuille.Range("C4:S" & DernLigneClnnC).Copy destination:=Sheets("Suivi AR").Range("A" & DernLigneClnnA)
    End Sub
    Tu comprends ?

  19. #19
    Membre à l'essai
    Homme Profil pro
    Acheteur
    Inscrit en
    Juillet 2017
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Acheteur

    Informations forums :
    Inscription : Juillet 2017
    Messages : 43
    Points : 17
    Points
    17
    Par défaut
    Je suis un peu perdu....

    Si je dois utiliser Call c'est bien dans la boucle non ? Pourtant on a dit que la boucle fonctionne normalement

    Après je comprends la logique, c'est juste que je ne comprends pas comment la macro va savoir qu'elle change de feuille lors de la boucle,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub suivi(feuille As Worksheet)
    Dim DernLigneClnnC As Long
    Dim DernLigneClnnA As Long
    DernLigneClnnC = feuille.Range("C1048576").End(xlUp).Row
    DernLigneClnnA = feuille.Range("A1048576").End(xlUp).Row + 1
    feuille.Range("C4:S" & DernLigneClnnC).Copy destination:=Sheets("Suivi AR").Range("A" & DernLigneClnnA)
    End Sub
    Comment feuille.range peut fonctionner ? Quand je la lance, ça mouline beaucoup et rien ne se passe...

  20. #20
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 766
    Points : 28 625
    Points
    28 625
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    c'est juste que je ne comprends pas comment la macro va savoir qu'elle change de feuille lors de la boucle
    Si tu avais lu le tutoriel sur les boucles que lucasgaetan t'a référencé et tout particulièrement le chapitre II. For Each Next, tu comprendrais
    De plus je t'ai donné un exemple de boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub t()
     Dim sht As Worksheet
     For Each sht In ThisWorkbook.Worksheets
      MsgBox sht.Name
     Next
    End Sub
    Si tu l'avais testée, tu te serais rendu compte que sht est, à chaque passage de la boucle, un des élément (l'objet feuille) de la collection de l'ensemble des feuilles (Worksheets) du classeur (ThisWorkbook)
    Par exemple, si j'avais découper la procédure en deux parties pour afficher le nom de la feuille dans une autre procédure, j'aurais passé sht comme argument.

    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub Main()
     Dim sht As Worksheet
     For Each sht In ThisWorkbook.Worksheets
      AfficheEtCacheLaFeuille sht
      ' ou Call AfficheEtCacheLaFeuille(sht)
     Next
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub AfficheEtCacheLaFeuille(maFeuille As Worksheet)
      With maFeuille
      .Visible = xlSheetHidden  ' Feuille masquée
       MsgBox .Name              ' Affiche le nom de la feuille
      .Visible = xlSheetVisible ' Feuille visible
      End With
    End Sub
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

Discussions similaires

  1. Réponses: 2
    Dernier message: 11/07/2017, 15h33
  2. [XL-2010] Synthèse de plusieurs onglets en un tableau
    Par founy27 dans le forum Conception
    Réponses: 3
    Dernier message: 07/07/2017, 07h45
  3. Synthése de plusieurs onglets « Devis »
    Par nduverger dans le forum Macros et VBA Excel
    Réponses: 31
    Dernier message: 21/10/2014, 17h06
  4. [XL-2010] Synthèse de plusieurs onglets de données
    Par LG-69 dans le forum Excel
    Réponses: 2
    Dernier message: 10/10/2014, 13h52
  5. Réponses: 3
    Dernier message: 09/04/2012, 15h03

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