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 :

Macro VBA & création synthèse de plusieurs feuilles Excel [XL-2013]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Femme Profil pro
    Chargé d'affaire
    Inscrit en
    Février 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Février 2019
    Messages : 4
    Par défaut Macro VBA & création synthèse de plusieurs feuilles Excel
    Bonjour à tous !

    Je suis toute nouvelle sur ce forum (j'ai même fait une petite présentation dans la partie appropriée) et dans le monde du langage VBA également.

    Alors, je vous expose ma problématique : j'ai un classeur Excel constitué de plusieurs feuilles. Toutes ces feuilles ont la même trame, il s'agit d'une analyse de risques par domaines, chaque feuille concerne un domaine particulier. Je souhaite faire une feuille de synthèse (appelée "Synthèse" forcément) qui reprendrait les lignes "prioritaires".
    J'ai donc écrit un petit bout de macro qui fonctionne jusqu'à une certain point. En fait, c'est le processus du "Copier-Coller" les lignes intéressantes que je ne maîtrise pas. Je ne récupère que la toute dernière ligne souhaitée (au lieu d'avoir toutes les lignes les unes en dessous des autres) et j'ai l'impression que je copie-colle à chaque fois sur la même ligne. J'ai pourtant essayer de déclarer une variable définie comme la première ligne vide sur laquelle écrire.
    J'ai vérifié que ma macro allait bien lire toutes les lignes de toutes les feuilles et ça semble bien fonctionner. Donc c'est vraiment dans cette dernière partie que j'ai une erreur.

    Auriez-vous un petit conseil à me donner s'il-vous-plaît ? Si besoin, je peux vous fournir les approximativement 5 lignes de code qui composent ma macro ^^

    Merci d'avance.

    Praline.

  2. #2
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Bonjour Praline89

    (J'adore tout ce qui est praliné: chocolat, Paris-Brest...)

    Donc soit doublement la bienvenue sur ce forum.

    Le plus efficace serait bien entendu que tu reportes l'intégralité du code en précisant le(s) point(s) d'achoppement.

  3. #3
    Membre à l'essai
    Femme Profil pro
    Chargé d'affaire
    Inscrit en
    Février 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Février 2019
    Messages : 4
    Par défaut
    Bonjour MarcelG,

    Merci beaucoup pour ton accueil ! Et c'est vrai, c'est vraiment trop bon le praliné.

    Bref, revenons à nos moutons. Tu trouveras ci-dessous le code "Synthèse"

    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
    Sub Synthèse()
     
    Dim i As Integer
    Dim j As Integer
    Dim der_ligne As Integer
    Dim last_line As Integer
     
    last_line = Worksheets("Synthèse").Range("A65536").End(xlUp).Row + 1
     
    For i = 2 To Worksheets.Count
     
    der_ligne = Worksheets(i).Cells.SpecialCells(xlCellTypeLastCell).Row
     
        For j = 3 To der_ligne
     
            If Worksheets(i).Cells(j, 23).Value = 1 Then
                Worksheets(i).Cells(j, 1).EntireRow.Copy
                Worksheets("Synthèse").Cells(last_line, 1).EntireRow.Select
                Worksheets("Synthèse").Paste
            End If
     
        Next j
     
    Next i
     
    End Sub
    A première vue, ce sont les deux dernières lignes de ma boucle If qui me posent problème. En effet, j'ai vérifié le fait que ma macro allait bien la condition Worksheets(i).Cells(j, 23).Value = 1 sur toutes les feuilles grâce à la macro 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
    Sub Test()
     
    Dim i As Integer
    Dim j As Integer
    Dim der_ligne As Integer
     
    For i = 2 To Worksheets.Count
     
    der_ligne = Worksheets(i).Cells.SpecialCells(xlCellTypeLastCell).Row
     
        For j = 3 To der_ligne
     
            If Worksheets(i).Cells(j, 23).Value = 1 Then
                Worksheets("Synthèse").Cells(j, i) = 1
                Else: Worksheets("Synthèse").Cells(j, i) = 0
            End If
     
        Next j
     
    Next i
     
    End Sub
    Celle-ci fonctionne correctement.

    Voilà ! Je te remercie d'avance de ton aide.

    Praline.

  4. #4
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 681
    Par défaut
    Essaye ceci:
    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
    Sub Synthèse()
     
    Dim i As Integer
    Dim j As Integer
    Dim der_ligne As Integer
    Dim last_line As Integer
     
    last_line = Worksheets("Synthèse").Range("A65536").End(xlUp).Row + 1
     
    For i = 2 To Worksheets.Count
     
    der_ligne = Worksheets(i).Cells.SpecialCells(xlCellTypeLastCell).Row
     
        For j = 3 To der_ligne
     
            If Worksheets(i).Cells(j, 23).Value = 1 Then
                Worksheets(i).Cells(j, 1).EntireRow.Copy
                Worksheets("Synthèse").Cells(last_line, 1).EntireRow.Select
                Worksheets("Synthèse").Paste
                last_line=last_line +1
            End If
     
        Next j
     
    Next i
     
    End Sub
    Vu ta condition tu pourrais aller plus (sans boucle sur les lignes) en passant par un filtre avancé

  5. #5
    Membre à l'essai
    Femme Profil pro
    Chargé d'affaire
    Inscrit en
    Février 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Février 2019
    Messages : 4
    Par défaut
    Halaster08,

    Je te remercie pour ta première remarque, c’est exactement ce que j’ai fait.

    Citation Envoyé par halaster08 Voir le message
    Essaye ceci
    Du coup, ça fonctionne beaucoup mieux ! Je me sens un peu bête, c’était tellement évident.

    MarcelG, merci pour tes remarques également, je vais essayer ce que tu me proposes pour simplifier et je reviens te donner le résultat !

    [EDIT] : MarcelG, j’ai testé le code que tu m’as proposé, ça fonctionne parfaitement. Et c’est vrai que c’est beaucoup plus simple comme ça. Je ne connaissais pas le .Name, merci.

    Encore merci à tous les deux pour vos conseils !

  6. #6
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Praline,

    Autre chose.
    Eviter les copies de lignes entières car des erreurs peuvent survenir.
    Mieux vaut, dans ce cas, définir la dernière colonne informée et, partant, l'objet Range à recopier.

    Ainsi

    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
    Option Explicit
     
    Sub Synthèse()
     
    Dim i As Integer
    Dim j As Integer
    Dim der_ligne As Integer, der_col As Byte
    Dim last_line As Integer
     
    last_line = Worksheets("Synthèse").Range("A65536").End(xlUp).Row + 1
     
    For i = 2 To Worksheets.Count
     
            With Worksheets(i)
     
                    If .Name <> "Synthèse" Then
     
                            der_ligne = .Cells.SpecialCells(xlCellTypeLastCell).Row
     
                            For j = 3 To der_ligne
     
                                    If .Cells(j, 23).Value = 1 Then
                                            der_col = .Cells(1, .Columns.Count).End(xlToLeft).Column
                                            .Range(.Cells(j, 1), .Cells(j, dercol)).Copy Destination:=Worksheets("Synthèse").Cells(last_line, 1)
                                            last_line = last_line + 1
                                    End If
     
                            Next j
     
                    End If
     
            End With
     
    Next i
     
    End Sub

  7. #7
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Salut Praline,

    J'ai rapidement regardé ton code.
    Attention de bien redéfinir la variable last_line après copie.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    last_line = last_line +1
    Autre remarque, s'il te plaît, supprime ces f...Select.
    La méthode Copy admet comme argument Destination

    Enfin, afin de rendre un code plus lisible, ne pas hésiter à utiliser le bloc With

    Essaie donc d'appliquer le code ci-dessous proposé.

    Code non testé.

    Je reviendrai sur le Forum vers 13 h 45. D'ici là, n'hésite pas à revenir.

    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
    Option Explicit
     
    Sub Synthèse()
     
    Dim i As Integer
    Dim j As Integer
    Dim der_ligne As Integer
    Dim last_line As Integer
     
    last_line = Worksheets("Synthèse").Range("A65536").End(xlUp).Row + 1
     
    For i = 2 To Worksheets.Count
     
            With Worksheets(i)
     
                    If .Name <> "Synthèse" Then
     
                            der_ligne = .Cells.SpecialCells(xlCellTypeLastCell).Row
     
                            For j = 3 To der_ligne
     
                                    If .Cells(j, 23).Value = 1 Then
                                            .Cells(j, 1).EntireRow.Copy Destination:=Worksheets("Synthèse").Cells(last_line, 1)
                                            last_line = last_line + 1
                                    End If
     
                            Next j
     
                    End If
     
            End With
     
    Next i
     
    End Sub

  8. #8
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 681
    Par défaut
    Bonjour,
    Citation Envoyé par Praline89 Voir le message
    Je ne récupère que la toute dernière ligne souhaitée (au lieu d'avoir toutes les lignes les unes en dessous des autres) et j'ai l'impression que je copie-colle à chaque fois sur la même ligne. J'ai pourtant essayer de déclarer une variable définie comme la première ligne vide sur laquelle écrire.
    Si tu copie colle tout sur la même ligne c'est probablement pour ça que tu n'as que la dernière.
    Déclarer ta variable c'est bien, mais as-tu penser à la recalculer après chaque copier-coller ?

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

Discussions similaires

  1. [XL-2010] VBA - Aide sur macro "qui récapitule plusieurs feuilles excel dans une seule"
    Par fonzzie31 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 17/08/2016, 09h53
  2. [XL-2007] Synthèse de plusieurs feuilles Excel
    Par Math_D dans le forum Excel
    Réponses: 4
    Dernier message: 31/07/2012, 15h33
  3. tableau de synthèse de plusieurs feuilles
    Par ALTINEA dans le forum Excel
    Réponses: 7
    Dernier message: 01/10/2009, 18h31
  4. écrire dans plusieur feuille Excel depuis vba access
    Par bossLINDROS dans le forum VBA Access
    Réponses: 1
    Dernier message: 11/11/2008, 21h28
  5. [VBA-E] Données identiques sur plusieurs feuilles
    Par pm2036 dans le forum Macros et VBA Excel
    Réponses: 42
    Dernier message: 09/05/2007, 15h05

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