Macro excel

Résolu
red-69 Messages postés 15 Statut Membre -  
Le Pingou Messages postés 12275 Date d'inscription   Statut Contributeur Dernière intervention   -
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

  1. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    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. Le Pingou Messages postés 12275 Date d'inscription   Statut Contributeur Dernière intervention   1 478
       
      Merci gbinforme,
      J'ai apprécié de découvrir votre procédure et d'enrichir mon savoir.
      Bonne soirée.
      0
    2. aquarelle Messages postés 7181 Date d'inscription   Statut Modérateur Dernière intervention   1 311
       
      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
      1. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744 > aquarelle Messages postés 7181 Date d'inscription   Statut Modérateur Dernière intervention  
         
        bonjour

        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
      2. Le Pingou Messages postés 12275 Date d'inscription   Statut Contributeur Dernière intervention   1 478 > aquarelle Messages postés 7181 Date d'inscription   Statut Modérateur Dernière intervention  
         
        Merci aquarelle, bonne semaine.
        0
  2. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    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. red-69
       
      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. NONO
       
      Bonjour,

      Question pour les pros de la macro: que signifie le message "erreur de compilation dans le module caché this workbook"?
      0
  3. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    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. red-69 Messages postés 15 Statut Membre
       
      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
      1. aquarelle Messages postés 7181 Date d'inscription   Statut Modérateur Dernière intervention   1 311 > red-69 Messages postés 15 Statut Membre
         
        Bonsoir 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
      2. red-69 Messages postés 15 Statut Membre > aquarelle Messages postés 7181 Date d'inscription   Statut Modérateur Dernière intervention  
         
        Bonjour,

        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
      3. aquarelle Messages postés 7181 Date d'inscription   Statut Modérateur Dernière intervention   1 311 > red-69 Messages postés 15 Statut Membre
         
        Bonjour,
        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
      4. red-69 Messages postés 15 Statut Membre > aquarelle Messages postés 7181 Date d'inscription   Statut Modérateur Dernière intervention  
         
        D'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. aquarelle Messages postés 7181 Date d'inscription   Statut Modérateur Dernière intervention   1 311
     
    '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. red-69 Messages postés 15 Statut Membre
       
      OK merci aquarelle, j'attendrais donc gbinforme
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. red-69
     
    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. Le Pingou Messages postés 12275 Date d'inscription   Statut Contributeur Dernière intervention   1 478
       
      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
      1. red-69 Messages postés 15 Statut Membre > Le Pingou Messages postés 12275 Date d'inscription   Statut Contributeur Dernière intervention  
         
        Bonsoir à 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
  7. red-69 Messages postés 15 Statut Membre
     
    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. red-69 Messages postés 15 Statut Membre
       
      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
  8. Le Pingou Messages postés 12275 Date d'inscription   Statut Contributeur Dernière intervention   1 478
     
    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. red-69 Messages postés 15 Statut Membre
       
      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
  9. Le Pingou Messages postés 12275 Date d'inscription   Statut Contributeur Dernière intervention   1 478
     
    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
  10. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    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. Le Pingou Messages postés 12275 Date d'inscription   Statut Contributeur Dernière intervention   1 478
       
      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
  11. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    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. red-69 Messages postés 15 Statut Membre
       
      merci à tous.

      Cela fonctionne comme je le souhaitais.
      0
    2. Le Pingou Messages postés 12275 Date d'inscription   Statut Contributeur Dernière intervention   1 478
       
      Bonjour gbinforme,
      Merci infiniment pour votre serviabilité et de vos explications qui me sont très profitables.
      Excellente journée.
      0