Macro excel
Résolu
red-69
Messages postés
15
Statut
Membre
-
Le Pingou Messages postés 12653 Date d'inscription Statut Contributeur Dernière intervention -
Le Pingou Messages postés 12653 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.
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.
A voir également:
- Macro excel
- Telecharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Liste déroulante excel - Guide
- Word et excel gratuit - Guide
- Si ou excel - Guide
- Déplacer colonne excel - Guide
10 réponses
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.
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.
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.
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.
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
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
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
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
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
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
'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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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
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
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
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
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
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
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.
Bonne journée à tous.
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 ??
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 ??
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
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
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
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
Bonjour red-69,
Il manque l'intruction suivante:
Sheets(W2.Name).Select
La placer juste avant la ligne : Cells.Select 'tri par date croissante
Il manque l'intruction suivante:
Sheets(W2.Name).Select
La placer juste avant la ligne : Cells.Select 'tri par date croissante
bonjour
Tout simplement : W2.Cells
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
bonjour Le Pingou,
à partir du moment où l'on a positionné la feuille avec
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
Ceci peut être remplacé sans aucun souci par:
à 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]
J'ai apprécié de découvrir votre procédure et d'enrichir mon savoir.
Bonne soirée.
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 ;-)
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.