Tableau croisé dynamique

Bonjour à tous.

C'est ma seconde visite, j'ai un nouveau problème à résoudre après avoir creusé le sujet sans résultat !

J'ai une macro VBA qui doit prendre en compte la totalité d'un tableau pour un tableau croisé dynamique. Je cherche le moyen de transmettre à la donnée "sourcedata" le tableau entier. Je définis une variable "masource", mais le système n'en veux pas!

Comment puis-je faire cela? Merci de vos lumières (avant le réveillon, tant qu'on a les idées claires !).

masource = "OA!L1C1:L" & DernLigne& & "C" & Derncol

Sheets.Add

ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=masource, _

Version:=xlPivotTableVersion14).CreatePivotTable _

TableDestination:="Feuil1!R3C1", TableName:="Tableau croisé dynamique1", _

DefaultVersion:=xlPivotTableVersion14

Bonjour,

Simple question : faute de frappe : 2 fois & :

masource = "OA!L1C1:L" & DernLigne& & "C" & Derncol

Bonne journée

Bouben

Bonjour

Quelle est la page exacte à couvrir A1 à L et dernière ligne ?

Crdlt

Bonjour.

Merci de votre intérêt à mon souci.

Il n'y a pas de faute de frappe, je viens de vérifier. Le système me propose deux "&", et lorsque je vérifier avec MSGBOX, j'ai les bonnes cellules !

Pour la plage à prendre en compte, il s'agit d'un tableau de valeurs mensuelles, le nombre de colonnes est figé, mais je n'ai jamais la même quantité de lignes, c'est pourquoi je dois sélectionner d'abord les les lignes à prendre en compte.

Merci de votre réponse.

Cordialement.

Bonjour à tous les 2

Une autre piste : le TCD est recréé à l'emplacement où le TCD précédent était. Ca bloque.

Solution préconisée : construire une fois pour toute le TCD et simplement redéfinir la plage ensuite.

Cf exemple en PJ, à tester

Bouben

19tcd-bug.xlsm (28.51 Ko)

Re

Quelle est la référence de la dernière colonne ?

Exemple si C est ta dernière colonne, utilise ceci --> 

masource = Sheets("OA").Range("A1:C" & dernligne)

Crdlt

Bonjour à tous ,

si ça commence en A1:

Set masource = Range("A1").CurrentRegion

debug.print masource.address

Bonjour.

Merci de vos réponses, mais la commande de création de TCD refuse "masource", quelle que soit la façon de la déclarer.

BOUBEN,

J'ai vu que tu proposais une solution pour créer le TCD, pourrais-tu détailler un peu cette commande, par rapport à ce que propose la macro, je ne sais pas remplacer mes lignes par ce que tu proposes?

Sheets.Add
    ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=masource, _
         Version:=xlPivotTableVersion14).CreatePivotTable _
        TableDestination:="Feuil1!R3C1", TableName:="Tableau croisé dynamique1", _
        DefaultVersion:=xlPivotTableVersion14

Merci d'avance.

Dans ma proposition, on ne crée plus le TCD par macro. Donc ce code est obsolète.

La structure du TCD est créée une fois pour toutes. A priori, dans ton cas, le modèle du TCD est fait. Il ne reste plus qu'à le rafraichir.

Le code proposé ne fait que rafraichir le TCD en reprécisant les lignes à prendre en compte

Ci-dessous le code commenté.

Avec un fichier en PJ, avec quelques lignes de données, cela nous aiderait

A bientôt !

Bouben

    'dernière ligne de données :
    ' (Worksheets("OA") : nom de l'onglet contenant les données
    DernLigne = Worksheets("OA").Range("A" & Rows.Count).End(xlUp).Row

    'dernière colonne de données
    '  à voir si le nombre de colonne est susceptible d'évoluer
    Derncol = 5

    'définition de la plage
    masource = "OA!R1C1:R" & DernLigne & "C" & Derncol

    'récupération de l'objet "TCD" :
    '   Worksheets("TCD") : onglet contenant le TCD
    '   PivotTables(1) : premier TCD de cet onglet (à voir s'il y a plusieurs TCD dans l'onglet)
    Set oTCD = Worksheets("TCD").PivotTables(1)

    'Affectation de la nouvelle plage
    oTCD.SourceData = masource

    'Actualisation du TCD
    oTCD.PivotCache.Refresh

    'destruction de l'objet
    Set oTCD = Nothing

Merci BOUBEN.

Je vais plus loin dans ma description :

Je récupère un fichier TXT provenant de la base Informix existante.

Je dois trier les données des commandes reçues et non reçues, afin de communiquer un plan de trésorerie valide pour la compta.

Je traite le fichier txt depuis Excel, en ajoutant une colonne prix total, en sauvegardant le complet, puis en enlevant les commandes reçues, pour ne conserver que ce qui doit être livré et facturé -(clot_oal = "N").

Le nombre de colonnes est figé, seul le nombre de lignes varie (c'est déja ça !).

Je regroupe par le TCD les dossiers, les NOs de semaine de livraison et le prix total attendu par semaine.

Le tableau croisé dynamique est à recréer à chaque fois, je pense, du fait que je pars d'un fichier TXT. A moins d'avoir une autre solution?

Ci-joint le fichier avec le résultat que j'obtiens sur le complet, et la page "OA" avec quelques lignes exemples.

Merci.

C'est un peu plus clair, mais pas encore totalement

Je pars du postulat que l'onglet "OA" est alimenté correctement à partir du fichier txt (et des formules)

=> pas de modification (à voir si on veut aussi automatiser cet import pour une version suivante)

La première étape dans la PJ :

- construction d'un TCD (onglet TCD)

=> la structure du TCD (champs à inclure peut être modifiée si besoin)

- macro de MAJ du TCD qui va récupérer la totalité des lignes de l'onglet OA (redéfinition de la plage, tel que proposé tout à l'heure)

Est-ce la bonne orientation ?

A bientôt, je pense

Bouben

Bonjour,

Je tente de résumer la chose par un exemple à adapter

Bonnes fêtes de fin d'année.

Cdlt.

Option Explicit

Public Sub Create_Pivot_Table()
Dim wb As Workbook
Dim wsData As Worksheet, wsPT As Worksheet
Dim rngData As Range
Dim ptCache As PivotCache
Dim pt As PivotTable

    Application.ScreenUpdating = False

    Set wb = ThisWorkbook
    Set wsData = wb.Worksheets("OA")
    Set wsPT = wb.Worksheets("TCD")
    Set rngData = wsData.Cells(1).CurrentRegion

    With wsPT
        On Error Resume Next
        .PivotTables(1).TableRange2.Clear
        On Error GoTo 0
        Set ptCache = wb.PivotCaches.Create(xlDatabase, rngData, 4)
        Set pt = ptCache.CreatePivotTable(.Cells(1), "TCD_1", , 4)
        With pt
            .ManualUpdate = True
            .AddFields RowFields:="num_cdec", ColumnFields:="delai_oa"
            With .PivotFields("Ptot")
                .Orientation = xlDataField
                .Function = xlSum
                .NumberFormat = "#,##0.00"
                .Caption = ChrW(931) & " Ptot"
            End With
            .RowAxisLayout xlTabularRow
            .ManualUpdate = False
        End With
        .Activate
    End With

    Set pt = Nothing: Set ptCache = Nothing
    Set rngData = Nothing
    Set wsPT = Nothing: Set wsData = Nothing
    Set wb = Nothing

End Sub

Merci Bouben et Jean-Eric.

Je vais compulser vos solutions et tester tout ça dès le début de l'année prochaine, qui devrait arriver très vite !

Je clos ce sujet et reviendrai vers vous si je n'arrive pas à solutionner mon problème (uniquement pour me faire gagner du temps, sinon je fais tout ça manuellement).

Passez de bonnes fêtes de fin d'année!

Cordialement.

MagicB

Rechercher des sujets similaires à "tableau croise dynamique"