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 :

Aide pour code VBA Fichiers Tableau à scinder en plusieurs feuilles selon colonne définie


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2010
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Aide pour code VBA Fichiers Tableau à scinder en plusieurs feuilles selon colonne définie
    Bonjour, je suis assez bon avec Excel, mais je n'y connais pas grand chose en Macro (VBA). J'ai un fichier dans lequel j'ai dans une feuille, un tableau qui se complète au fil des jours, c'est-à-dire que nous ajoutons des lignes de nouvelles données. Le tableau ne change pas au fil du temps sauf pour l'ajout de lignes.
    J'aimerais pouvoir faire un tri pour une colonne contenant 5 données possible seulement. Je souhaite pouvoir les acheminer sur des feuilles distinctes avec seulement les données pour triées des 5 choix possible.
    Dans mon tableau, il y a des listes de choix que je souhaite conserver dans les nouvelles feuilles crées, de même que la mise en forme et la mise en forme conditionnelle.
    Je joins mon fichier en attente d'une réponse d'une personne plus expérimentée que moi.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 291
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 291
    Points : 1 889
    Points
    1 889
    Par défaut
    Salut,

    Oublie VBA pour cela, et tourne toi du coté de Power Query.
    Ca fera le job de façon autrement plus efficace.

  3. #3
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2013
    Messages : 113
    Points : 177
    Points
    177
    Par défaut
    Bonjour Deedolith, Dabert

    Dabert , faire un tri pour une colonne contenant 5 données possible seulement : tu peux expliquer?
    Pour la colonne A de type date, les 2 critères pour répartir sur des feuilles sont mois et année?

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 291
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 291
    Points : 1 889
    Points
    1 889
    Par défaut
    Après avoir regardé ton fichier:

    Définir un tableau de 2000 lignes ne sert à rien, les tableaux sont auto-extensibles, autant les faire le plus petit possible.

    Ensuite, concernant Power Query:
    1) Sélectionne une cellule quelconque de ton tableau.
    2) Dans le ruban, clic sur l'onglet "Données" puis le bouton "A partir d'un tableau", ca ouvrira l'éditeur Power Query.
    3) Filtre / trie tes données comme bon te semble (l'interface ressemble beaucoup à Excel).
    4) Dan le ruban, clique sur "Fermer et charger", tes données se retrouverons dans une nouvelle feuille.

    Dernier point, lorsque les données de la feuille "Données" auront été mises à jour, dans le ruban, il te suffira de cliquer sur l'onglet "Données" et le bouton "Actualiser tout".

    Le temps de faire tout cela: Moins de 5 minutes.
    Zéro lignes de code.
    Zéro sources d'erreur ni de stress.

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2010
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par fraflt69 Voir le message
    Bonjour Deedolith, Dabert

    Dabert , faire un tri pour une colonne contenant 5 données possible seulement : tu peux expliquer?
    Pour la colonne A de type date, les 2 critères pour répartir sur des feuilles sont mois et année?
    Bon, d'abord merci pour avoir répondu à ma demande. Comme c'est un fichier qu'une autre personne, qui ne connaît pas Excel utilisera, j'aimerais l'automatiser au maximum.
    Le tri doit se faire sur la colonne Opérateur et je souhaite avoir les 5 feuilles (nom des opérateurs) dans le même fichier que mes données.
    La personne qui entrera les données, ajoutera au quotidien des lignes avec de nouvelles données. À chaque jour où à un moment opportun, il pourra faire la demande de refaire le le tri et obtenir les 5 feuilles mises à jour avec les novelles données. C'est pourquoi, j'avais fait un tableau de 2000 lignes. Cela pouvait, je pensais, éviter d'être obligé de remettre en forme les nouvelles données.
    De plus, la colonne Terminé est en format conditionnel pour la ligne, c-à-d que si un OUI est inscrit, toute la colonne s'affiche en vert pour indiquer qu'on ne doit plus tenir compte de cette ligne de données. Serait-il possible de mettre toutes ces données dans une nouvelle feuille pour les conserver pour utilisation future?

  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 903
    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 903
    Points : 28 871
    Points
    28 871
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Un tableau structuré recopie automatiquement les formules, le format, la mise en forme conditionnelle ainsi que la validation de données.
    Pourquoi avoir créer 7 règle de mise en forme soit le nombre de colonnes de votre table pour mettre en évidence la ligne de la table contenant "Oui" en colonne G. Une seule règle suffit à condition d'utiliser une référence mixte soit =$G2="OUI".
    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
    Expert éminent sénior

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 468
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 468
    Points : 16 348
    Points
    16 348
    Par défaut
    Bonjour à tous

    pour compléter :
    Citation Envoyé par dabert Voir le message
    Bon, d'abord merci pour avoir répondu à ma demande. Comme c'est un fichier qu'une autre personne, qui ne connaît pas Excel utilisera, j'aimerais l'automatiser au maximum.
    PowerQuery une fois paramétré, c'est aussi automatique que VBA : et le bouton pour mettre à jour existe déjà : Données, Actualiser tout

    Citation Envoyé par dabert Voir le message
    De plus, la colonne Terminé est en format conditionnel pour la ligne, c-à-d que si un OUI est inscrit, toute la colonne s'affiche en vert pour indiquer qu'on ne doit plus tenir compte de cette ligne de données. Serait-il possible de mettre toutes ces données dans une nouvelle feuille pour les conserver pour utilisation future?
    Pas clair ! Tu veux mettre quelles données où et pour quoi faire ? Celle où terminé est égal à OUI ? Là aussi une simple requête PowerQuery le fait à moins que tu ne veuilles effacer ces lignes du tableau initial...

    Pourquoi une liste déroulante en B et pas en G ? en plus pour deux valeurs il est plus simple de les lister dans la Validation directement que d'utiliser des cellules.
    Sinon, dans tous les cas on place les sources de listes déroulantes dans un onglet spécifique et sous forme de tableau structuré (un par liste) afin d'avoir une liste évolutive sans modifier quoi que ce soit et de ne pas risquer qu'une insertion, suppression dans le tableau de saisie ne fasse exploser ces listes.
    Chris
    PowerQuery existe depuis plus de 13 ans, est totalement intégré à Excel 2016 &+. Utilisez-le !

    Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson.
    Confucius

    ----------------------------------------------------------------------------------------------
    En cas de résolution, n'hésitez pas cliquer sur c'est toujours apprécié...

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2010
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Philippe Tulliez Voir le message
    Bonjour,
    Un tableau structuré recopie automatiquement les formules, le format, la mise en forme conditionnelle ainsi que la validation de données.
    Pourquoi avoir créer 7 règle de mise en forme soit le nombre de colonnes de votre table pour mettre en évidence la ligne de la table contenant "Oui" en colonne G. Une seule règle suffit à condition d'utiliser une référence mixte soit =$G2="OUI".
    Comme je ne suis pas un expert, j'ai composé avec ce que je sais. Pour ce qui est de la mise en forme, je crois que j'ai dû faire colonne après colonne par inexpérience.

    Mon but est d'avoir une feuille où une personne saisit des données et qu'à la fin de la saisie, on exécute une macro pour obtenir 5 feuilles, chacune nommée du nom de l'opérateur avec le contenu de chaque ligne y faisant référence. Et le lendemain on recommence et ainsi de suite.

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2010
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par 78chris Voir le message
    Bonjour à tous

    pour compléter :


    PowerQuery une fois paramétré, c'est aussi automatique que VBA : et le bouton pour mettre à jour existe déjà : Données, Actualiser tout



    Pas clair ! Tu veux mettre quelles données où et pour quoi faire ? Celle où terminé est égal à OUI ? Là aussi une simple requête PowerQuery le fait à moins que tu ne veuilles effacer ces lignes du tableau initial...

    Pourquoi une liste déroulante en B et pas en G ? en plus pour deux valeurs il est plus simple de les lister dans la Validation directement que d'utiliser des cellules.
    Sinon, dans tous les cas on place les sources de listes déroulantes dans un onglet spécifique et sous forme de tableau structuré (un par liste) afin d'avoir une liste évolutive sans modifier quoi que ce soit et de ne pas risquer qu'une insertion, suppression dans le tableau de saisie ne fasse exploser ces listes.

    Pour répondre à la question des données à mettre ailleurs, il s'agit de prendre les données des lignes qui ont un OUI dans la cellule G et de les regrouper dans une feuille portant le titre Terminé.
    Comme je le mentionnais, il faut savoir que la personne qui entrera les données ne connaît pas Excel. Donc pour lui permettre de faire les entrées rapidement et par la suite de faire une mise à jour pour chaque opérateur sans se poser de question, c'est pour cela que je préférais mettre en code VBA.

  10. #10
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 291
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 291
    Points : 1 889
    Points
    1 889
    Par défaut
    En quoi cliquer sur un bouton est compliqué ?

    Tu as quelques notions de VBA, tu ne vois que ça, et tu ne veux pas en démordre.
    On arrête pas de te dire que Power Query est plus simple, plus fiable, on t'a donné toutes la cartes pour faire ton classeur et tu ne veux même pas essayer.
    Ca s'appelle de la résistance au changement.

  11. #11
    Membre habitué
    Homme Profil pro
    libre
    Inscrit en
    Mai 2024
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : libre

    Informations forums :
    Inscription : Mai 2024
    Messages : 109
    Points : 199
    Points
    199
    Par défaut
    Le code suivant filtre par chaque d'opérateur et crée une page pour enregistre le résultat du filtrage

    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
    Sub FilterAndCopy()
    Dim opr, Dats, DstSheet, flt
    Application.ScreenUpdating = False
    Set Dats = Sheets("Données")
    For Each opr In Dats.Range("Opérateurs")
      On Error Resume Next
      Set DstSheet = Sheets(CStr(opr))
      If Err.Number <> 0 Then  ' la feuille n'existe pas
        Set DstSheet = Sheets.Add(After:=Sheets(Sheets.Count))  ' ajouter nouvelle
        DstSheet.Name = opr
      Else
        DstSheet.UsedRange.ClearContents
      End If
     
      Dats.Range("Tableau1").AutoFilter Field:=6, Criteria1:=opr
      DstSheet.Range("A1:G1") = Dats.Range("A1:G1").Value
     
      Dats.Range("Tableau1").SpecialCells(xlCellTypeVisible).Copy
      DstSheet.Range("A2").PasteSpecial Paste:=xlPasteValues
    Next
    Dats.Range("Tableau1").AutoFilter
    Application.ScreenUpdating = True
     
    End Sub

  12. #12
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2010
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Volid Voir le message
    Le code suivant filtre par chaque d'opérateur et crée une page pour enregistre le résultat du filtrage

    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
    Sub FilterAndCopy()
    Dim opr, Dats, DstSheet, flt
    Application.ScreenUpdating = False
    Set Dats = Sheets("Données")
    For Each opr In Dats.Range("Opérateurs")
      On Error Resume Next
      Set DstSheet = Sheets(CStr(opr))
      If Err.Number <> 0 Then  ' la feuille n'existe pas
        Set DstSheet = Sheets.Add(After:=Sheets(Sheets.Count))  ' ajouter nouvelle
        DstSheet.Name = opr
      Else
        DstSheet.UsedRange.ClearContents
      End If
     
      Dats.Range("Tableau1").AutoFilter Field:=6, Criteria1:=opr
      DstSheet.Range("A1:G1") = Dats.Range("A1:G1").Value
     
      Dats.Range("Tableau1").SpecialCells(xlCellTypeVisible).Copy
      DstSheet.Range("A2").PasteSpecial Paste:=xlPasteValues
    Next
    Dats.Range("Tableau1").AutoFilter
    Application.ScreenUpdating = True
     
    End Sub

    MERCI VOLID! Tu as bien saisi ma demande. C'est le résultat attendu. Y aurait-il une façon d'ajouter les mise en forme conditionnelles qui sont dans la feuilles Données? Si oui, est-ce préférable de mettre en forme sur la nouvelle feuille ou si c'est possible avec le code VBA?
    Encore une fois merci pour ton aide!

  13. #13
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 291
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 291
    Points : 1 889
    Points
    1 889
    Par défaut
    La même chose avec Power Query:
    TestProduction.xlsx

  14. #14
    Membre expérimenté
    Inscrit en
    Décembre 2002
    Messages
    836
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 836
    Points : 1 320
    Points
    1 320
    Par défaut
    Salut, j'ai ajouté 2 lignes au code de Volid, une pour ajuster les colonnes automatiquement dans les nouvelles feuilles, et une pour recopier les mises en forme de la feuille "Données.
    J'ai réduit la taille du tableau, elle s'ajustera automatiquement à chaque ajout de nouvelle ligne.
    J'ai également adapté les règles de MFC, il n'y en a plus que 2 au lieu de 7.

    TestProduction.xlsm

  15. #15
    Membre habitué
    Homme Profil pro
    libre
    Inscrit en
    Mai 2024
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : libre

    Informations forums :
    Inscription : Mai 2024
    Messages : 109
    Points : 199
    Points
    199
    Par défaut
    La dernière version améliorée pour inclure la mise en forme des entêtes.

    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 FilterAndCopy()
    Dim opr, Dats, DstSheet, rng, lastRow
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    Set Dats = Sheets("Données")
    lastRow = Dats.Cells(Dats.Rows.Count, 1).End(xlUp).Row
    Set rng = Dats.Range("A1:G" & lastRow)
    For Each opr In Dats.Range("Opérateurs")
      On Error Resume Next
      Sheets(CStr(opr)).Delete 'supprimer la feuille
      If Err.Number <> 0 Then: Err.Clear  ' la feuille n'existe pas
      Set DstSheet = Sheets.Add(After:=Sheets(Sheets.Count))
      DstSheet.Name = CStr(opr)
      rng.Rows(2).AutoFilter Field:=6, Criteria1:=opr
      rng.SpecialCells(xlCellTypeVisible).Copy
      With DstSheet.Range("A1")
        .PasteSpecial Paste:=xlPasteColumnWidths
        .PasteSpecial Paste:=xlPasteFormats
        .PasteSpecial Paste:=xlPasteValues
      End With
      DstSheet.Range("aA2").Select
    Next
    rng.AutoFilter
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
    End Sub

Discussions similaires

  1. Aide pour Code VBA ppour agrandire une image
    Par PixelsBoy dans le forum VBA PowerPoint
    Réponses: 2
    Dernier message: 09/01/2023, 11h56
  2. [XL-365] aide pour Code VBA
    Par papoumarc dans le forum Macros et VBA Excel
    Réponses: 23
    Dernier message: 23/08/2021, 22h31
  3. Aide pour code VBA Excel
    Par NEC14 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 01/02/2008, 09h33
  4. Aide pour code VBA
    Par bigbiboun dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 19/12/2007, 09h55
  5. [VBA] Aide pour code
    Par Virgile59 dans le forum Access
    Réponses: 2
    Dernier message: 22/05/2006, 14h16

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