TCD sur une autre feuille via une macro
Bonjour à toutes et à tous !
Je viens vers vous car je suis bloqué dans un projet :
Je suis dans une école et j'essaye d'améliorer la gestion des absences.
À partir d'un document source (une extraction excel des données d'un logiciel) j'aimerais créer un tableau croisé dynamique sur une autre feuille.
J'ai déjà créé quatre macros :
- Une pour renommer la première feuille
- Une pour suprimer les données dont je n'ai pas besoin,
- Une pour créer le TCD sur une autre feuille
- Et une pour les appeler toutes
Vous trouverez les macros en fin de post.
Je rencontre le problème suivant :
Quand j'insère mes macro dans un nouveau document, puis que je copie colle des données en guise de test et que j'exécute, tout marche.
Lorsque je j'insère mes macros sur un document brut de l'extraction et que j’exécute j’obtiens :
Erreur d'exécution 5 : Argument ou appel de procédure incorrect.
Basiquement, je n'arrive pas à créer une matrice où les professeurs n'aurons qu'à cliquer sur un bouton pour exécuter le tout...
En fichier joint un échantillon de donnée.
En vous remerciant,
Irareon
<!-- Supprime les abscences justifiée "O" -->
Dim PLG_FIL As Range
If Not ActiveSheet.AutoFilterMode Then
Range("K1:K1000").AutoFilter Field:=1, Criteria1:="O"
End If
Set PLG_FIL = ActiveSheet.AutoFilter.Range
PLG_FIL.Offset(1, 0).Resize(PLG_FIL.Rows.Count - 1, 1).EntireRow.Delete
ActiveSheet.AutoFilterMode = False
<!-- Renomme sheet(1)-->
Sheets(1).Select
Sheets(1).Name = "Absence"
<!-- Création du TCD -->
Cells.Select
Range("C22").Activate
Sheets.Add
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
"Absence!R1C1:R1048576C16", Version:=6).CreatePivotTable TableDestination:= _
"Feuil1!R3C1", TableName:="Tableau croisé dynamique1", DefaultVersion:=6
Sheets("Feuil1").Select
Cells(3, 1).Select
With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("nom")
.Orientation = xlRowField
.Position = 1
End With
With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("prenom")
.Orientation = xlRowField
.Position = 2
End With
With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("cours")
.Orientation = xlRowField
.Position = 3
End With
ActiveSheet.PivotTables("Tableau croisé dynamique1").AddDataField ActiveSheet. _
PivotTables("Tableau croisé dynamique1").PivotFields("justif_flg"), _
"Nombre de justif_flg", xlCount
Range("B3").Select
ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotCache.Refresh
End Sub
Bonjour,
Pour le principe.
Cdlt
Option Explicit
Public Sub CreatePivotTable()
Dim wb As Workbook
Dim ws As Worksheet, ws2 As Worksheet
Dim rng As Range
Dim PTCache As PivotCache
Dim PT As PivotTable
Dim pf As PivotField
With Application
.DisplayAlerts = False
.ScreenUpdating = False
End With
Set wb = ActiveWorkbook
Set ws = wb.Worksheets("Absence")
On Error Resume Next
wb.Worksheets("TCD Absence").Delete
On Error GoTo 0
Application.DisplayAlerts = True
Set rng = ws.Cells(1).CurrentRegion
Set PTCache = wb.PivotCaches.Create(xlDatabase, rng)
Set ws2 = wb.Worksheets.Add
ws2.Name = "TCD Absence"
Set PT = PTCache.CreatePivotTable(ws2.Cells(3, 1), "TCD_1")
With PT
.ManualUpdate = True
.AddFields RowFields:=Array("nom", "prenom", "cours"), PageFields:="justif_flg"
With .PivotFields("justif_flg")
.Orientation = xlDataField
.Function = xlCount
.Caption = "Nombre de justif_flg"
End With
.RowAxisLayout xlTabularRow
.TableStyle2 = "PivotStyleLight1"
.ColumnGrand = False
.RowGrand = False
For Each pf In .RowFields
pf.Subtotals(1) = True
pf.Subtotals(1) = False
Next pf
.PivotFields("justif_flg").CurrentPage = "O"
.ManualUpdate = False
End With
End Sub
Bonjour à tous
Dans nombre de cas similaires, on crée un document contenant le TCD qui pointe sur une source externe portant toujours le même nom, chaque extraction écrasant la précédente.
Il suffit d'ouvrir le classeur contenant le TCD et d'actualiser : pas de VBA nécessaire...
Bonjour,
Pour le principe.
Cdlt
Sample de test.xlsm
Option Explicit Public Sub CreatePivotTable() Dim wb As Workbook Dim ws As Worksheet, ws2 As Worksheet Dim rng As Range Dim PTCache As PivotCache Dim PT As PivotTable Dim pf As PivotField With Application .DisplayAlerts = False .ScreenUpdating = False End With Set wb = ActiveWorkbook Set ws = wb.Worksheets("Absence") On Error Resume Next wb.Worksheets("TCD Absence").Delete On Error GoTo 0 Application.DisplayAlerts = True Set rng = ws.Cells(1).CurrentRegion Set PTCache = wb.PivotCaches.Create(xlDatabase, rng) Set ws2 = wb.Worksheets.Add ws2.Name = "TCD Absence" Set PT = PTCache.CreatePivotTable(ws2.Cells(3, 1), "TCD_1") With PT .ManualUpdate = True .AddFields RowFields:=Array("nom", "prenom", "cours"), PageFields:="justif_flg" With .PivotFields("justif_flg") .Orientation = xlDataField .Function = xlCount .Caption = "Nombre de justif_flg" End With .RowAxisLayout xlTabularRow .TableStyle2 = "PivotStyleLight1" .ColumnGrand = False .RowGrand = False For Each pf In .RowFields pf.Subtotals(1) = True pf.Subtotals(1) = False Next pf .PivotFields("justif_flg").CurrentPage = "O" .ManualUpdate = False End With End Sub
Merci beaucoup je vais faire des tests !
Bonjour à tous
Dans nombre de cas similaires, on crée un document contenant le TCD qui pointe sur une source externe portant toujours le même nom, chaque extraction écrasant la précédente.
Il suffit d'ouvrir le classeur contenant le TCD et d'actualiser : pas de VBA nécessaire...
Merci de ta réponse !
Le problème étant que mes extractions doivent être retravaillé et ne portent pas toujours le même nom :/
Re-bonjour,
Après un test avec la macro fournie par Jean-Eric (merci encore, cette manière de faire est bien plus propre que la mienne...), je me retrouve à nouveau avec un soucis :
J'ai implémenté la macro dans un nouveau fichier, et j'ai inséré un bouton d’exécution sur la ligne 1, puis j'ai collé les données de test.
Excel me donne :
Je crois comprendre que c'est dû au fait que le TCD va aller chercher les données à partir de la ligne 1 et y trouver que le bouton, mais même en allant voir dans le debuger, je vois pas où modifier :/
Je joint le fichier où j'ai réalisé le test.
En vous remerciant,