XL 2016 Création de tableau dynamique croisé

VBA

XLDnaute Nouveau
Bonjour,
J'ai développer un code pour selectionner les données d'un excel et les met en forme dans un tableau dynamique croisé, mais j'ai une erreur au niveau du nom a chaque fois.
Pouvez vous m'aider svp ?

Voici mon code

VB:
Sub TCD_échéancier()

    Der = ActiveSheet.Cells(Rows.count, "A").End(xlUp).Row

For i = 2 To Der
    If Range("M" & i) = 0 Then
        Rows(i).Insert
        Exit For
    End If
Next

    Range("A1:N1").Select
    Range(Selection, Selection.End(xlDown)).Select
    Sheets.Add
    ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
        "Feuil1!R1C1:R" & i - 1 & "C14", Version:=6).CreatePivotTable TableDestination:= _
        "Feuil2!R3C1", TableName:="Tableau croisé dynamique1", DefaultVersion:=6
    Sheets("Feuil2").Select

    With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields( _
        "FER MON")
        .Orientation = xlRowField
        .Position = 1
    End With
    With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Article" _
        )
        .Orientation = xlDataField
        .Position = 1
    End With
    With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Domaine" _
        )
        .Orientation = xlRowField
        .Position = 2
    End With

    With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields( _
        "Semaine échéancier")
        .Orientation = xlColumnField
        .Position = 1
    End With
    With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields( _
        "Reste a livr.")
        .Orientation = xlPageField
        .Position = 1
    End With



End Sub
J'ai aperçu sur le net de mettre sous un tableau et insérer ensuite le TCD. Mias je ne vois pas vraiment comment sa marche.
D'avance merci.
 

Staple1600

XLDnaute Barbatruc
Re

@VBA
Si tu insères une ligne, où alors se situe la ligne d'entête pour le TCD?
Mettre des couleurs sur toutes les lignes d'une feuille alourdit le poids du fichier.

Mais bon, cest ton fichier, ta question ;)
Tu demandes aide et conseil mais tu préféres les ignorer et faire à ta façon ;)
Dans ce cas, pourquoi donc continuer à te donner mes suggestions et conseils ?
 

VBA

XLDnaute Nouveau
Ce n'est pas faire à ma facon le cahier des charges qu'on m'a donné dis que je dois filtrer les lignes qu'on ne veut pas prendre dans le TCD si vous avez une autre solution pour cela je suis preneur. La personne à qui je fais sa travail comme sa, elle filtre les données inutile les met en couleur et les tries, pour que ce soit plus facile à séparer.
 

MJ13

XLDnaute Barbatruc
Bonjour "VBA", JM

Bon si vraiment tu veux aller jusque la première ligne vide, voir ce code à tester.

VB:
Sub TCD_TEST_V2()
On Error Resume Next
derl = Range("A2").End(xlDown).Row
Range("A1:T" & derl).Select
ActiveWorkbook.Names.Add Name:="ForTCD", RefersToR1C1:=Selection()
    ActiveWorkbook.Names("ForTCD").Delete
    ActiveWorkbook.Names.Add Name:="ForTCD", RefersToR1C1:=Selection()
Dim Plg As Range, Nom_TCD
Nom_TCD = InputBox("Nom du TCD?", "TCD", "TCD_N" & Second(Time))
     ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _
        "ForTCD").CreatePivotTable TableDestination:="", TableName:= _
        CStr(Nom_TCD), DefaultVersion:=xlPivotTableVersion10
With ActiveSheet
.PivotTableWizard TableDestination:=.Cells(1, 1)
With .PivotTables(CStr(Nom_TCD))
     With .PivotFields("Division")
         .Orientation = xlRowField
         .Position = 1
    End With
    With .PivotFields("Article")
         .Orientation = xlDataField
         .Position = 1
    End With
    With .PivotFields("Mag.")
         .Orientation = xlRowField
         .Position = 2
    End With
End With
End With
End Sub
 

Staple1600

XLDnaute Barbatruc
Bonjour MJ13

Moi j'ai compris que le but est d'ignorer les données initiales (au dessus de la ligne) et ne prendre que les nouvelles données en dessous de la ligne vide.
D'où ma réflexion à propos des entêtes et la suggestion de simplement actualiser tout le TCD puis appliquer des filtres selon les besoins.

Me trompe-je?
 

MJ13

XLDnaute Barbatruc
Re JM

J'essaye juste de répondre à la question, mais cela me fait surtout progresser.

C'est toujours bien d'avoir quelques travaux pratiques à se mettre sous la dent. :)

Sinon, si c'est en dessous, il faut vraiment que VBA revoit sa façon de travailler et il est toujours risquer de travailler avec des filtres pour établir un TCD, à moins d'avoir bien vérifier le comportement du TCD.
 

Staple1600

XLDnaute Barbatruc
Re

@ MJ13
Mon message n'était pas une critique à ton endroit
Mais une question quant à l'interprétation de la question du demandeur.
Donc pour savoir si nous avions compris la même chose.

Sauf erreur, ton code définit la plage du TCD (en cherchant la dernière ligne non vide)
Donc OK jusqu'ici, nos codes font quasiment la même chose.
On créé un TDC à partir de la base de donnée.

Pour la suite, en me basant sur ces commentaires:
il est indispensable d'insérer une ligne et de séparer des produits pris en compte dans le tcd des autres coloré d'une autre couleurs. C'est pour cela que je veux que ça ne prenne les produits avant la ligne insérée
La personne à qui je fais sa travail comme sa, elle filtre les données inutile les met en couleur et les tries, pour que ce soit plus facile à séparer.

Je ne vois pas trop comment est alimentée la base de donnée
Si il faut prendre les données avant la ligne (alors c'est déjà ce que fait le TCD lors de sa création)
Ensuite si on ajoute des données, pourquoi ensuite les ignorer ?
 

MJ13

XLDnaute Barbatruc
Re JM

C'est pour cela que je demande souvent un fichier, sinon, pour moi, c'est une perte de temps. Bon ici, c'est pas encore ça. :)

Je pense que j'ai fait le tour de la question. A "VBA" de finir son TP. ;)

Sinon dans son cas je ne serais pas passé par un TCD mais par du code VBA qui scanne la Base et fait les calculs. Bien sûr c'est plus compliqué mais si la base est toujours la même, c'est plus simple au final.

Ou, on pourrait aussi chercher les zones de lignes coloriées, insérée 2 lignes et copier la ligne d'entête, ensuite on pourrait pour chaque zone coloriée faire le TCD en cherchant chaque plage.
 
Dernière édition:

VBA

XLDnaute Nouveau
Bonjour @Staple1600 @MJ13
Je vais vous expliquer plus clairement la chose. Chaque semaine je fais une extraction des réceptions de produits qu'on a eu la semaine d'avant depuis l'erp de l'entreprise (SAP) pour pouvoir faire un petit compte rendu des entrées et sorties de la semaine d'avant, mais dans ce compte rendu il y a certains produits qui ne sont pas pris en compte. Pour cela je leur appliquer un filtre qui me permet de les séparer de ce qui est utile, et ainsi pouvoir créer mon tcd sans ces valeurs.
 

Staple1600

XLDnaute Barbatruc
Bonjour le fil, le forum

@VBA
Au vu de tes dernières explications, je ne vois donc pas la nécéssité de cette insertion de ligne vide
Voir exemple ci-dessous
Ici je n'affiche dans le TCD que les données de la semaine 19 (semaine en cours)
01TCDNL.png
 

VBA

XLDnaute Nouveau
Je m'exprime mal je pense.
Les données que je filtre et que j'exclue sont des données comme les autres mais seulement je n'en prend pas compte dans la suite moi. D'où l'insertion de ligne pour la délimitation
 

Staple1600

XLDnaute Barbatruc
Re

@VBA
Pas besoin de ligne vide pour exclure ou inclure.
Tu as regardé ma copie d'écran?
On voit bien que le TCD exclut directement tout ce qui n'appartient pas à la semaine 19.
(qui est mon critère ici pour l'exemple)
(Donc pas eu besoin d'insérer de ligne vide, non ?)

Encore un fois les possibilités du TCD, permettent de ne prendre ne compte que les données souhaitées sans avoir à toucher à la base de données.

Petit rappel
Qui a écrit?
si vous avez une autre solution pour cela je suis preneur.

J'essaie de te présenter les avantages du TCD, mais tu restes campé sur ton idée et ta manière de faire.
C'est ton droit.
Mais dans ce cas pourquoi demander avis et conseil sur le forum?
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
315 093
Messages
2 116 138
Membres
112 669
dernier inscrit
Guigui2502