Création de feuilles selon résultat TCD
Bonjour,
De nouveau, je sollicite votre aide et générosité comme d'habitude
J'ai un TCD qui est fait selon une base variable et volumineuse dans l'onglet 'TCD_GLOBAL' dans le fichier ci-joint
mon besoin est de créer des nouvelles feuilles selon le filtre de ce TCD Global : par exemple dans le fichier ci-joint, je veux créer des feuilles en automatique selon la condition suivante : Le filtre de la colonne W commence par 'UR' (le nombre de feuilles à créer est variable selon le nombre de filtres commençant par UR)
Ensuite chaque feuille doit être nommée selon son filtre...
J'espère que j'étais clair, si non n'hésitez pas à me demander plus de détails et/ou de précisions ?
Ci-joint un fichier exemple simplifié qui contient des données non réelles et moins volumineux que la réalité
PS: Les feuilles en vert représente le résultat souhaité mais en automatique via une macro
Pouvez vous m'aider svp ?
D'avance, merci de votre aide
A+
Bonjour,
Me redire si cette proposition répond à tes attentes.
Cdlt.
Option Explicit
Option Private Module
Public Sub CreateWorksheets()
Dim wb As Workbook
Dim ws As Worksheet, wsPT As Worksheet
Dim PT As PivotTable
Dim pi As PivotItem
With Application
.DisplayAlerts = False
.ScreenUpdating = False
End With
'----------------------------------------------------------------
Set wb = ActiveWorkbook
Set wsPT = wb.Worksheets("TCD_GLOBAL")
Set PT = wsPT.PivotTables(1)
'----------------------------------------------------------------
For Each ws In wb.Worksheets
If Left(ws.Name, 3) = "UR_" Then ws.Delete
Next ws
Application.DisplayAlerts = True
'----------------------------------------------------------------
For Each pi In PT.PivotFields("W").PivotItems
If Left(pi.Name, 3) = "UR_" Then
PT.PivotFields("W").CurrentPage = pi.Name
wsPT.Copy after:=wb.Worksheets(Worksheets.Count)
With ActiveSheet
.Name = pi.Name
.Tab.ColorIndex = xlColorIndexNone
.Shapes.Range(Array("cmdCreateWorksheets")).Delete
End With
End If
Next pi
'----------------------------------------------------------------
PT.PivotFields("W").ClearAllFilters
'----------------------------------------------------------------
Set PT = Nothing
Set wsPT = Nothing
Set wb = Nothing
End Sub
Bonjour jean-Eric et merci beaucoup pour votre réponse
je viens de la tester sur le fichier test ça marche mais en copiant le code dans un classeur réel et l'adaptant par rapport aux noms des filtres et feuilles, ça ne fonctionne plus
je pense que le problème est lié à la commande 'CreateWorksheets' ?
Pouvez vous me dire comment corriger ce point et si possible rendre la macro publique pour qu'on peut l'exécuter directement à partir du menu 'Développeur- Macro'
Merci d'avance
Re,
Je viens de découvrir un autre problème à savoir si mon filtre ne comporte pas des valeurs qui commencent par UR_ (ce qui est possible parfois puisque j'ai multiplié la macro plusieurs fois en modifiant à chaque fois le filtre dont j'ai besoin), la macro me créer quand même des onglets !!
je pense qu'elle a gardé les valeurs du TCD en cache ?
est-il possible de la modifier pour ne pas créer de feuille si aucun filtre correspondant au critère et si possible avoir un petit message indiquant qu'aucun filtre correspond au critère ?
merci d'avance
Bonjour,
Voir la procédure modifiée en prenant en compte tes remarques et en fonction des éléments fournis.
Cdlt.
Option Explicit
'Option Private Module
Public Sub CreateWorksheets()
Dim wb As Workbook
Dim ws As Worksheet, wsPT As Worksheet
Dim PT As PivotTable
Dim pi As PivotItem
With Application
.DisplayAlerts = False
.ScreenUpdating = False
End With
'----------------------------------------------------------------
Set wb = ActiveWorkbook
Set wsPT = wb.Worksheets("TCD_GLOBAL")
Set PT = wsPT.PivotTables(1)
'----------------------------------------------------------------
With PT.PivotCache
.MissingItemsLimit = xlMissingItemsNone
.Refresh
End With
'----------------------------------------------------------------
For Each ws In wb.Worksheets
If Left(ws.Name, 3) = "UR_" Then ws.Delete
Next ws
Application.DisplayAlerts = True
'----------------------------------------------------------------
For Each pi In PT.PivotFields("W").PivotItems
If Left(pi.Name, 3) = "UR_" Then
PT.PivotFields("W").CurrentPage = pi.Name
wsPT.Copy after:=wb.Worksheets(Worksheets.Count)
With ActiveSheet
.Name = pi.Name
.Tab.ColorIndex = xlColorIndexNone
.Shapes.Range(Array("cmdCreateWorksheets")).Delete
End With
End If
Next pi
'----------------------------------------------------------------
PT.PivotFields("W").ClearAllFilters
'----------------------------------------------------------------
Set PT = Nothing
Set wsPT = Nothing
Set wb = Nothing
End Sub
Bonjour Jean-Eric,
Merci beaucoup
votre nouveau code me convient bien
PS: j'ai une petite question : est-il possible de rajouter dans le code une instruction qui permet de colorer les sous totaux et le total général de chaque TCD en couleur grise ?
Merci et excellente journée
A+
Bonjour,
Modifie ce que tu veux dans le TCD global, et vois le résultat après exécution de la procédure.
Cdlt.
Effectivement, je garde la même mise en forme de mon TCD lors de la création des nouveaux onglets par contre je la perds lorsque j'actualise ma base de données et du coup mon TCD global
Y a t-il un moyen pour conserver cette mise en forme ?
merci
Bonsoir jean-Eric,
Je me permets de revenir vers vous parce que j'ai fais une évolution de mon fichier et du coup votre macro nécessite une petite évolution pour fonctionner correctement
je m'explique : En fait, pour des besoins fonctionnels, j'ai rajouté un autre TCD dans le même onglet 'TCD_GLOBAL' qui a le même nom du filtre (CLE dans mon fichier ci-joint), du coup lorsque j'exécute votre macro, un seul TCD est filtré (le 2ème)
mon souhait est que les 2 tableaux soient filtrés avec le même filtre et si la valeur d'un filtre existe dans un seul TCD, une feuille est quand même crée mais avec un seul TCD (l'autre peut rester mais vide)
ci-joint mon fichier mis à jour pour mieux comprendre
est-il possible de faire cette évolution ?
D'avance, merci beaucoup pour votre aide qui était très précieux pour moi
A+
Bonsoir,
pas très claire la demande, mais.
A tester.
Cdlt.
Bonjour Jean-Eric et merci beaucoup pour votre réponse rapide
je viens de tester votre macro et ça répond à mon besoin mais juste une petite remarque concernant le cas lorsque la Clé existe dans le TCD 1 mais pas dans le TCD 2 (ou vice versa), je remarque que le filtre reste à 'tous' or qu'il doit être à 'aucun' (ou supprimer complètement) ==> voir onglet en jaune dans le fichier ci-joint
j'espère que ma demande est plus clair maintenant
merci infiniment
Bonjour,
J'ai considéré que le TCD 1 était maître. Le TCD 2 est affiché s'il comprend une clé du TCD 1.
J'ai lu entre les lignes. Je regarde ce jour.
Mais j'avoue ne plus comprendre grand chose vu ton dernier fichier.
A partir de ce dernier, peux-tu me dire précisément ce que tu souhaites ?
Cdlt.
Bonjour et merci pour votre rapidité,
En fait, pour moi, il n'y a pas de TCD maitre ==> je souhaite avoir des onglets par code CLE selon les cas suivantes :
1- Si le code CLE existe dans le TCD 1 ET le TCD 2 ==> l'onglet crée sera filtre sur ce code CLE pour les 2 TCD
2- Si le code CLE existe dans le TCD 1 mais n'existe pas dans le TCD 2 ===> l'onglet comporte que le TCD1 filtré sur le code CLE en question
3- Si le code CLE existe dans le TCD 2 mais n'existe pas dans le TCD 1 ===> l'onglet comporte que le TCD2 filtré sur le code CLE en question
j'espère que ma demande est plus explicite avec ces précisions, si non n'hésitez pas de demander plus de détails
Merci d'avance
Bonjour jean-Eric et merci pour votre réponse
je viens de tester votre macro mais elle ne répond toujours pas à mon besoin (point 2 et 3 dans mon précédent post)
En fait dans le TCD1, j'ai le code cle 'UR_992000946' qui n'existe pas dans le TCD 2, donc normalement je dois retrouver un onglet uniquement avec le TCD 1 (voir onglet 'UR_992000946' en rouge crée manuellement), or que la macro m'a crée en automatique que 2 onglets qui correspondent au cas 1 (même clé dans le TCD1 et TCD2)
Merci d'avance
Re,
J'ai crée une procédure événementielle au changement de valeurs dans les 2 rapports de filtre CLE dans les TCDs.
Le résultat est conforme à ta demande. Ou je ne comprends rien.
Sinon, peux-tu me dire si tu peux fermer le classeur avec sa croix (en haut à droite de l'écran) après la création d'une feuille ?
Cdlt.
Bonjour,
Pour info, le dernier fichier que vous avez posté ne contient pas la macro de création de feuilles, juste une macro HELP
Pour répondre à votre question, oui j'arrive à fermer le fichier après la création de feuilles
Si non, par rapport à mon fichier exemple, j'ai un problème au niveau du filtre suivant 'UR_599717103' qui existe dans le TCD 1 et non pas dans le TCD 2, donc j'attend à avoir un onglet qui contient uniquement le TCD 1 filtré sur ce code CLE or que pour le moment dans l'onglet intitulé 'UR_599717103', j'ai le 1er TCD OK mais le 2ème TCD contient 'Tous' (voir copie d'écran ci-jointe)
Pour simplifier est-il possible de supprimer le TCD lorsque il ne contient pas le code CLE du filtre et n'affiché que le TCD avec le bon filtre ?
merci d'avance
Bonjour,
la procédure est placée dans le module (TCD_GLOBAL).
Elle est exécutée au changement des valeurs des cellules B2 et E2.
Cdlt.
Bonjour jean-Eric et merci pour votre réponse,
je viens de tester le dernier fichier posté en changeant la valeur de la cellule B2 mais j'ai eu un message d'erreur (ci-joint)
en plus que le fait d'être obligé de toucher une cellule pour activer la macro ne me convient pas trop
est-il possible de rendre cette macro public et de pouvoir l'exécuter directement à partir de menu 'Macro' ?
PS: L'ancienne version de la macro fonctionne bien sauf qu'elle ne traite pas le point évoqué dans mon précédent poste, est-il possible d'améliorer juste ce point ?
merci d'avance
excellente journée
J'ai oublié de joindre le message d'erreur
le voilà :
Bonjour,
Pour le message d'erreur :
Ruban / Fichiers / Options / Centre de gestion de la confidentialité.
Cliquer sur Paramètres du centre de gestion de la confidentialité.
Dans Paramètres des macros, cocher Accès approuvé au modèle d'objet du projet VBA.
Teste ensuite la procédure.
Cdlt.