Macro excel

Résolu
Bonjour,

Je débute en macro et je souhaite à partir d'un tableau excel créer une macro qui me fasse apparaître une nouvelle feuille pour chaque nouvelle entité de l'une de mes colonnes.
Je m'explique :
En colonne A c'est le nom des clients et je veux une nouvelle feuille pour chaque client qui reprenne toutes les données de ce client.

Merci d'avance.
Configuration: Windows XP
Firefox 2.0.0.14

10 réponses

Résumé de la discussion

Le sujet porte sur la création d'une macro Excel permettant, à partir d'un tableau, de générer une nouvelle feuille pour chaque client dans la colonne A et de reprendre les données associées à ce client. Des exemples de macros et des approches pratiques abondent, allant de la création automatique de feuilles nommées d'après chaque client à l'organisation des données et à l'exclusion des feuilles existantes. Plusieurs échanges évoquent des choix techniques, notamment éviter les événements, gérer l'unicité des noms d'onglets en majuscules et privilégier des références plutôt que des sélections, pour une macro plus robuste et réutilisable.

Bobot (l’IA à votre service)
  1. Contributeur
    bonjour red-69,

    Puisque tu n'apprécies pas la gestion des événements, voici le modèle avec le gros bouton à cliquer : https://www.cjoint.com/?ffwZTB5Am4

    Excel ne gère pas la casse dans le nom des onglets donc je fonctionne en majuscule comme toi.

    PS : bonjour Le Pingou et merci de l'aide mais red-69 ne veux apparemment pas d'événementiel car il n'a pas intégré ses fonctionnalités avancées qu'il faut comprendre pour les utiliser.
    2
    1. Merci gbinforme,
      J'ai apprécié de découvrir votre procédure et d'enrichir mon savoir.
      Bonne soirée.
      0
    2. Modérateur
      Je me joins aux remerciements de Le Pingou car comme lui, la lecture de vos procédures me permet d'apprendre énormément.
      Je profite donc aussi de l'occasion pour te saluer Le Pingou car cela faisait longtemps que nous ne nous étions pas croisés.
      Bonne nuit et jolis rêves à tous ;-)
      0
    3. Contributeur
      @aquarellebonjour

      Merci pour ce sympathique message car une belle journée commence !

      En fait chacun progresse avec les échanges d'idées... et c'est très bien ainsi.

      à très bientôt sur un autre sujet.
      0
    4. @aquarelleMerci aquarelle, bonne semaine.
      0
  2. Contributeur
    bonjour

    C'est tout à fait possible mais ce n'est pas nécessairement une bonne formule car le nombre d'onglets n'est pas infini mais limité par la mémoire.

    Si tu as plusieurs dizaines de clients tu sera rapidement bloqué sinon je peux te mettre un exemple.
    0
    1. Merci gbinforme de répondre.

      Le nom de clients n'est pas très élevé, entre 5 à 10 par fichier. En revanche j'ai un nombre important de ficihers excel c'est pour cela qu'une macro s'impose à mon avis.
      Si tu pouvais me donner ton exemple, ce serait avec joie.
      0
    2. Bonjour,

      Question pour les pros de la macro: que signifie le message "erreur de compilation dans le module caché this workbook"?
      0
  3. Contributeur
    bonjour

    Voici donc un petit exemple qui fait cela à partir d'une feuille "modèle"pour avoir le même formatage des données

    https://www.cjoint.com/?fevZdLj6Dw
    0
    1. Ton fichier semble répondre à mes attentes. Je n'ai juste pas accès à la macro !!! je peux donc pas la reproduire pour mes propres fichiers. Pourrais-tu me la fournir stp ??
      0
    2. Modérateur
      @red-69Bonsoir red-69,
      La macro que gbinforme te propose est une macro évènementielle, donc quand tu es dans l'éditeur VBA, dans l'arborescence, il te faut double cliquer sur "Feuil1(récapitulatif)" et tu y verras la macro qu'il a faite.
      Bonne nuit
      0
    3. @aquarelleBonjour,

      j'essaye de faire tourner la macro de gbinforme, mais lorsque j'exécute sa macro à son exemple pour bien comprendre le principe, cela m'indique erreur d'exécution 424 et le débogage se bloque sur la ligne "For Each sel In zone".

      que dois-je faire pour réussir à la faire fonctionner ?
      0
    4. Modérateur
      @red-69Bonjour,
      La macro de gbinforme n'est, en fait, pas une macro habituelle, comme je te l'ai dit au dessus c'est une macro évenementielle qui se déclenche seule à partir du moment où le contenu de certaines cellules changent, tu n'as pas à la lancer toi même.
      Pour la déclencher, il te suffit de compléter dans la feuille "récapitulatif", une nouvelle ligne du tableau : n°client /QUANTITE/INTITULE /UNITE (la macro se déclenchera seule et ajoutera un nouvel onglet).
      J'espère que ces explications t'aideront quelque peu.
      Bonne journée

      0
    5. @aquarelleD'accord merci de ces explications.

      Du coup je viens de le tester, cela fonctionne effectivement comme tu l'annonces.
      Seul souci maintenant, si dans la feuille récapitulatif je créer la ligne 1 avec le client A pour une quantité de 1, intutile AA et Unité AA et sur la ligne 2 je créer le client A pour une quantité de 2, intutile AA et Unité AA, un nouvel onglet apparait nommé "A" (donc jusqu'ici tout va bien) par contre dans ce nouvel onglet, n'apparait que la ligne 2 le client A avec la quantité 1 n'existe pas.

      Il me faudrait dans l'onglet A en ligne 1 le client A quantité 1 et en ligne 2 le client A avec la quantité 2

      merci d'avance pour votre aide
      0
  4. Modérateur
    'Lu,
    Là, désolée mais il va te falloir attendre que gbinforme (que je salue au passage) revienne car je ne m'y connais pas suffisamment dans ce genre de macro pour pouvoir t'aider. Je suis juste intervenue pour t'aider à comprendre comment fonctionnait la macro.

    Je te souhaite donc bonne continuation et une bonne journée
    0
    1. OK merci aquarelle, j'attendrais donc gbinforme
      0
  5. Pour être plus clair :
    https://www.cjoint.com/?ffmPel0qiZ

    voila un exemple de fichier.
    à partir de la feuille 1, je souhaite obtenir les feuilles A, D, EF et B.
    Je voudrais pouvoir cliquer sur le bouton de commande "trier par nom" pour obtenir les 4 feuilles.

    Moi je sais le faire en citant systématiquement dans ma macro le nom recherché. Or je souhaite faire une macro où pour toute information apparaissant dans la colonne nom une nouvelle feuille soit créée.

    Merci à tous
    0
    1. Bonsoir,
      J'ai adapté le super modèle de gbinforme (au passage, merci de nous faire profiter de votre savoir)
      par rapport à votre demande.
      Entrer les données sur la feuille "EntrerData"
      Le lien : https://www.cjoint.com/?ffwvdlfEIK
      0
    2. @Le PingouBonsoir à tous.

      Je viens de tester la modification apportée par Jean-Pierre que je remercie au passage. Cela fonctionne très bien avec mon modèle.
      Je voudrais savois si, à partir de cette macro, il serait possible de créer un bouton de commande me permettant de faire des mises à jour de toutes les feuilles. Je m'explique, si par exemple mon entité A a une quantité de 200 et que j'ai besoin de la passer à 250, la macro ne tient pas comte de cette modification sauf à créer une nouvelle ligne auquel cas je me retrouve dans la feuille "A" avec une ligne A d'une quantité de 200 et une ligne "A" d'une quantité de 250.

      merci d'avance de votre aide
      0
  6. Merci à tous pour votre aide et vos différentes solutions. Tout cela m'a été très utile, j'avance petit à petit dans les macros.

    Bonne journée à tous.
    0
    1. rebonjour à tous,

      je souhaite apporter des modification à la macro de de gbinforme.

      je voudrais trier les nouvelles feuilles par ordre croissant des dates en case H2
      et j'aimerais une mise en page automatique .

      J'ai donc rajouter les lignes suivantes :

      Cells.Select 'tri par date croissante
      Selection.Sort Key1:=Range("H2"), Order1:=xlAscending, Header:=xlYes, _
      OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
      DataOption1:=xlSortNormal

      Cells.Select ' ajustement lmise en forme
      With Selection
      .HorizontalAlignment = xlCenter
      .VerticalAlignment = xlCenter
      .WrapText = True
      .Orientation = 0
      .AddIndent = False
      .IndentLevel = 0
      .ShrinkToFit = True
      .ReadingOrder = xlContext
      .MergeCells = False
      End With

      Cette formule fonctionne mais pas systématiquement, donc je suis un peu perdu. Mes tableuax initiaux sont similaire dans la forme mais le résultat la macro ne donne pas les me^mes résultats. Dans certains cas la mise en forme est faite dans les nouveaux onglets avec le tri par date en H2 ; dans d'autre cas rien de tout cela n'est effectué .

      D'après vous, où se situe l'erreur ??
      0
  7. Bonjour,
    Juste en passant, comment voulez-vous que l'on trouve le disfonctionnement de la moitié d'un code.
    Il faut mettre toute la macro pour celà.
    Merci
    0
    1. très bien Le Pingou. Désolé. Voici la macro entière :

      Option Explicit
      ___________________________________________________________
      Public Sub Tri_par_nom()
      ' en fonction de la valeur de la colonne A
      ' création d'une feuille avec nom colonne A
      ' autres colonnes documentant les cellules concernées
      Dim W1 As Worksheet ' feuille base
      Dim W2 As Worksheet ' feuille client
      Dim lig As Long ' ligne traitée
      Dim feu As Object ' feuille présente
      Dim ong As Integer ' numèro feuille
      Set W1 = Sheets("Feuil1") ' position feuille base
      Application.ScreenUpdating = False
      For Each feu In Sheets ' suppression feuilles
      If feu.Name <> W1.Name Then
      Application.DisplayAlerts = False
      feu.Delete
      Application.DisplayAlerts = True
      End If
      Next feu
      ' création des feuilles client
      For lig = 10 To W1.Cells(65536, 7).End(xlUp).Row
      For ong = 1 To Sheets.Count ' test existance feuille
      If Sheets(ong).Name = UCase(W1.Cells(lig, 7).Text) Then
      Set W2 = Sheets(ong)
      Exit For
      End If
      Next ong
      If ong > Sheets.Count Then
      For ong = 2 To Sheets.Count ' tri feuille
      If Sheets(ong).Name > UCase(W1.Cells(lig, 7).Text) Then Exit For
      Next ong ' création feuille
      Sheets.Add(After:=Sheets(ong - 1)).Name = UCase(W1.Cells(lig, 7).Text)
      Set W2 = ActiveSheet
      W1.Rows(8).Copy Destination:=W2.Rows(1) ' ajout titre

      End If
      W1.Rows(lig).Copy Destination:=W2.Rows(W2.Cells(65536, 7).End(xlUp).Row + 1) ' ajout ligne traitée

      Cells.Select 'tri par date croissante
      Selection.Sort Key1:=Range("H2"), Order1:=xlAscending, Header:=xlYes, _
      OrderCustom:=1, MatchCase:=True, Orientation:=xlTopToBottom, _
      DataOption1:=xlSortNormal

      Cells.Select ' ajustement lmise en forme
      With Selection
      .HorizontalAlignment = xlCenter
      .VerticalAlignment = xlCenter
      .WrapText = True
      .Orientation = 0
      .AddIndent = False
      .IndentLevel = 0
      .ShrinkToFit = True
      .ReadingOrder = xlContext
      .MergeCells = False
      End With

      Next lig
      W1.Activate
      Application.ScreenUpdating = True
      End Sub

      Voila , encore merci
      0
  8. Bonjour red-69,
    Il manque l'intruction suivante:
    Sheets(W2.Name).Select
    La placer juste avant la ligne : Cells.Select 'tri par date croissante
    0
    1. Contributeur
      bonjour

      Tout simplement : W2.Cells

        'tri par date croissante
      W2.Cells.Sort Key1:=Range("H2"), Order1:=xlAscending, Header:=xlYes, _
      OrderCustom:=1, MatchCase:=True, Orientation:=xlTopToBottom, _
      DataOption1:=xlSortNormal
      
       ' ajustement lmise en forme
      With W2.Cells
         .HorizontalAlignment = xlCenter
         .VerticalAlignment = xlCenter
         .WrapText = True
         .Orientation = 0
         .AddIndent = False
         .IndentLevel = 0
         .ShrinkToFit = True
         .ReadingOrder = xlContext
         .MergeCells = False
      End With
      


      0
      1. Bonjour gbinforme,
        Juste pour comprendre: la notation W2.Cells.... à la place de Selection......
        permet de se passer du Sheets(W2.Name).Select suivit du Cells.Select
        Est-ce bien comme celà.!
        0
    2. Contributeur
      bonjour Le Pingou,

      à partir du moment où l'on a positionné la feuille avec
      Set W2 = Sheets(ong) 
      ou
      Set W2 = ActiveSheet

      le fait d'utiliser W2. identifie clairement la feuille concernée et la sélection (depuis excel 2000) n'a aucune utilité pour la plupart des actions.

      Tu noteras que dans chaque macro événementielle ou non, je n'ai jamais sélectionné de données : il suffit qu'elles soit clairement identifiées.

      Bien sûr si tu lances l'enregistreur de macro tu vas avoir systématiquement des "select" mais c'est seulement dû au fait que l'enregistreur enregistre les sélections effectuées.

      On obtient donc par exemple
          Range("A1").Select
          Selection.Copy
          Range("I1").Select
          ActiveSheet.Paste

      Ceci peut être remplacé sans aucun souci par:
      Range("A1").Copy
      Range("I1").Paste
      
      ou sur une ligne
      
      Range("A1").Copy Destination:=Range("I1")
      
      ou en condensé
      
      [A1].Copy Destination:=[I1]
      0
      1. merci à tous.

        Cela fonctionne comme je le souhaitais.
        0
      2. Bonjour gbinforme,
        Merci infiniment pour votre serviabilité et de vos explications qui me sont très profitables.
        Excellente journée.
        0