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
21sample-de-test.xlsx (13.96 Ko)

Bonjour,

Pour le principe.

Cdlt

21sample-de-test.xlsm (23.26 Ko)
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 :

erreur 1004

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,

Re,

Ton fichier modifié.

Cdlt.

Re,

Ton fichier modifié.

Cdlt.

Sample de test 2.xlsm

Ow le changement se faisait donc là !

Hé bien merci pour tout, j'aurais beaucoup appris grâce à toi !

Avec toute ma sympathie,

Ira'

Rechercher des sujets similaires à "tcd feuille via macro"