[VBA]Tableau croisé dynamique sur plage variable

Tableau croisé dynamique sur plage variable [VBA] - VB/VBA/VBS - Programmation

Marsh Posté le 26-12-2005 à 17:51:48    

Bonjour à tous :hello:  
 
Je cherche à créer une macro éxécutant un tableau croisé dynamique à partir d'une plage contenue dans une autre feuille. Si la macro fonctionne parfaitement en sélection de plage fixe (je n'ai mis que la partie correspondant à la création du TCD même; il n'y a donc pas celle concernant l'insertion des champs dans le TCD):
 

Citation :


        ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _
        "'Historique relations clients'!R3C1:R44C5").CreatePivotTable TableDestination _
        :="'[Projet VBA - 15-12.xls]TCD - Analyse clientèle'!R3C3", TableName:= _
        "Tableau croisé dynamique1", DefaultVersion:=xlPivotTableVersion10


 
Je n'arrive pas à faire de même pour une plage qui peut par la suite évoluer (en l'occurence voir son nombre de ligne augmenter...). J'ai tenté ceci:
 

Citation :


        Range("A3" ).CurrentRegion.Select
        ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _
        Selection).CreatePivotTable TableDestination _
        :="'[Projet VBA - 15-12.xls]TCD - Analyse clientèle'!R3C3", TableName:= _
        "Tableau croisé dynamique1", DefaultVersion:=xlPivotTableVersion10


 
Mais lors de l'éxécution de la macro, un message d'erreur s'affiche: "Erreur d'éxécution '1004'. Impossible de lire la propriété PivotTables de la classe WorkSheet." Comment donc faire une macro qui construirait un TCD à partir d'une plage dont les lignes peuvent augmenter avec le temps?
 
Merci d'avance :hello:


Message édité par Nico-Rep le 26-12-2005 à 17:54:53

---------------
Topic de vente HW - Ancien feed
Reply

Marsh Posté le 26-12-2005 à 17:51:48   

Reply

Marsh Posté le 27-12-2005 à 09:23:40    

Salut nico-rep,

Code :
  1. dim lastrow
  2. lastrow = range("A3" ).end(xldoxn).row
  3.         ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _
  4.         "'Historique relations clients'!R3C1:R" & lastrow & "C5" ).CreatePivotTable TableDestination _
  5.         :="'[Projet VBA - 15-12.xls]TCD - Analyse clientèle'!R3C3", TableName:= _
  6.         "Tableau croisé dynamique1", DefaultVersion:=xlPivotTableVersion10


 
Essaye avec ça, ça devrait marcher
Tu peux faire de mmême pour les colones :)
 
@+

Reply

Marsh Posté le 27-12-2005 à 11:32:28    

Merci pour ton aide ;)
 
J'ai hélas toujours le même message d'erreur qui s'affiche... Il refuse de créer la PivotTable à partir d'une plage de donnée variable :pfff:


Message édité par Nico-Rep le 27-12-2005 à 11:37:07

---------------
Topic de vente HW - Ancien feed
Reply

Marsh Posté le 27-12-2005 à 11:51:26    

Re en reregardant le code j'ai repéré qu'il manquait la virgule en gras. Est-ce corrigé chez toi ? Qui sait ça peut venir de là...

Citation :

ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _
        "'Historique relations clients'!R3C1:R" & lastrow & "C5" ).CreatePivotTable , TableDestination


@+


---------------
Je bidouillle c'est sur... Mais j'essaye de faire en sorte que ça marche ;-)
Reply

Marsh Posté le 27-12-2005 à 12:29:14    

La virgule ne semble pas être utile, puisque le code n'est pas compris en sa présence...
 
Est-ce que ça peut être un bug d'excel 2003? J'ai demandé à un ami de faire le même type de commande sous Excel 2000 (à savoir créer un TCD à partir d'une plage de données variable) et cela marche avec un simple CurrentRegion...
 

Citation :

   ActiveSheet.PivotTableWizard SourceType:=xlDatabase, SourceData:= _
        Sheets("Historique Relations Clients" ).Range("A3" ).CurrentRegion, TableDestination:=Sheets("TCD" ).Range("A1" ), TableName:= _
        "Tableau croisé dynamique2"
    ActiveSheet.PivotTables("Tableau croisé dynamique2" ).AddFields RowFields:= _
        "Numéro" & Chr(10) & "client", ColumnFields:="Type événement"
    With ActiveSheet.PivotTables("Tableau croisé dynamique2" ).PivotFields( _
        "Numéro événement" )
        .Orientation = xlDataField
        .Name = "NB Numéro événement"
        .Function = xlCount
    End With


---------------
Topic de vente HW - Ancien feed
Reply

Marsh Posté le 27-12-2005 à 14:08:44    

Je suis aussi sous excel 2000, je ne sais pas dans quel sens t'orienter... J'espère que quelqu'un d'autre saura t'aider ...
Bon courage


---------------
Je bidouillle c'est sur... Mais j'essaye de faire en sorte que ça marche ;-)
Reply

Marsh Posté le 27-12-2005 à 15:22:24    

Merci ;)


---------------
Topic de vente HW - Ancien feed
Reply

Marsh Posté le 14-04-2008 à 11:55:07    

Salut nico-rep,
 
>>lastrow = range("A3" ).end(xldoxn).row
 
 
une seule faute et tous ne marche pas comme prévu.
 
Essai avec çà. Et ca fonctionnera
lastrow = range("A3" ).end(xldown).row
       
 
Salut

Reply

Marsh Posté le 30-04-2010 à 11:42:00    

Créer un TCD à partir d’une base de données évolutive, soit évolution des données à l’intérieur du TCD, soit évolution par rajout des données (rajout des lignes), sans modification du nombre de colonnes.
 
1 : Les données sont sur Feuil1. La 1ère ligne est réservée aux titres des colonnes.
2 : Le TCD est sur Feuille2
3 : Sur Feuil2, en cellule A1 par exemple : tapes NombreEntrées (pas d’espace entre les mots)
4 : Feuil2, cliquer sur A1, Insertion, Nom, Définir, Fait référence à, C1,
=Feuil2!$C$1
OK.
5 : Feuil2, cliquer sur C1, =, NBVAL, Feuil1 (en bas), cliquer sur A (sommet de la 1ère colonne), OK
6 : Feuille2, cliquer sur C1, dans l’espace à côté de fx, où est écrit
=NBVAL(Feuil1!A:A)-1
tapes -1 (pour enlever la1ère ligne des titres)
pour obtenir
=NBVAL(Feuil1!A:A)-1-1
 
Ainsi, en Feuil2, A1 fait référence à un nom, dont la valeur est de C1.
En Feuil2, C1 fait référence au nombre d’entrées de la 1ère colonne de Feuil1 moins la 1ère ligne des titres.
S’assurer qu’il n’y a pas de cellule vide entre les 1ère et dernière entrées de la 1ére colonne de Feuil1.
 
Test :
Entrer les données en Feuil1.
Choisis 4 colonnes.
Vérifies que C1 en Feuil2 correspond bien au nombre de lignes -1 de Feuil1.
 
Ensuite on passe à VBA en tapant sur Alt et F11 en même temps.
 
Créer un 1er module et tapes le code suivant :
 
Option Explicit
 
'variable booleen pour la mise à jour
Public blnMAJ As Boolean
 
'variable nbligne pour le nombre d'entrées
Public lngNombreEntrées As Long
 
'objet feuilles
Public objFeuil1 As Worksheet
Public objFeuil2 As Worksheet
 
Créer un 2e module et tapes le code suivant :
 
Sub MajTCDEssai()
 
    Range("A5" ).Select
     'A5 est la cellule où on insère un TCDEssai de la feuille2
 
    ActiveSheet.PivotTableWizard SourceType:=xlDatabase, SourceData:= _
        "Feuil1!R1C1:R" & Range("NombreEntrées" ).Value + 1 & "C4"
 
     'R1CI veut dire à partir de la Rangée 1 et Colonne 1 de la feuille Données
     'vers la Rangée correspondant au nombre de lignes
     'selon le nom défini NombreEntrées + 1, correspondant à la ligne des titres
     'ici le Nombre_Entrées se trouve en C1 de la feuille2
     'et le nombre de colonne, qui est de 4
 
End Sub
 
En Feuille2, tapes le code suivant :
 
Private Sub Worksheet_Activate()
    Call MajTCDEssai
End Sub
 
Fermer VBA
 
Cliquer sur Feuille1
Ensuite sur Feuille2.
 
Un TCD est créé en Feuille2.
A vous de modifier le TCD selon vos critères.
 
Exemple Date en A6
Euros en B7
Selectionner la colonne B. Format. Cellule. Monétaire…..OK
Clique droit sur Date en A6
Grouper et afficher…
Grouper
Mois et Années
OK
 
FIN
 
NB : Je ne suis pas un expert en VBA. J’ai simplement compilé les données ici et là pour satisfaire mes besoins : un TCD avec des données qui peuvent varier soit à l’intérieur de la base des données, soit en rajoutant ou en enlevant des lignes. Le nombre de colonnes est déterminé d’avance et restera fixe.
 
Je reste réceptif à tout conseil.

Reply

Marsh Posté le 30-04-2010 à 11:43:45    

CORRECTIF
 
Créer un TCD à partir d’une base de données évolutive, soit évolution des données à l’intérieur du TCD, soit évolution par rajout des données (rajout des lignes), sans modification du nombre de colonnes.
 
1 : Les données sont sur Feuil1. La 1ère ligne est réservée aux titres des colonnes.
2 : Le TCD est sur Feuille2
3 : Sur Feuil2, en cellule A1 par exemple : tapes NombreEntrées (pas d’espace entre les mots)
4 : Feuil2, cliquer sur A1, Insertion, Nom, Définir, Fait référence à, C1,
=Feuil2!$C$1
OK.
5 : Feuil2, cliquer sur C1, =, NBVAL, Feuil1 (en bas), cliquer sur A (sommet de la 1ère colonne), OK
6 : Feuille2, cliquer sur C1, dans l’espace à côté de fx, où est écrit
=NBVAL(Feuil1!A:A)
tapes -1 (pour enlever la1ère ligne des titres)
pour obtenir
=NBVAL(Feuil1!A:A)-1
 
Ainsi, en Feuil2, A1 fait référence à un nom, dont la valeur est de C1.
En Feuil2, C1 fait référence au nombre d’entrées de la 1ère colonne de Feuil1 moins la 1ère ligne des titres.
S’assurer qu’il n’y a pas de cellule vide entre les 1ère et dernière entrées de la 1ére colonne de Feuil1.
 
Test :
Entrer les données en Feuil1.
Choisis 4 colonnes.
Vérifies que C1 en Feuil2 correspond bien au nombre de lignes -1 de Feuil1.
 
Ensuite on passe à VBA en tapant sur Alt et F11 en même temps.
 
Créer un 1er module et tapes le code suivant :
 
Option Explicit
 
'variable booleen pour la mise à jour
Public blnMAJ As Boolean
 
'variable nbligne pour le nombre d'entrées
Public lngNombreEntrées As Long
 
'objet feuilles
Public objFeuil1 As Worksheet
Public objFeuil2 As Worksheet
 
Créer un 2e module et tapes le code suivant :
 
Sub MajTCDEssai()
 
    Range("A5" ).Select
     'A5 est la cellule où on insère un TCDEssai de la feuille2
 
    ActiveSheet.PivotTableWizard SourceType:=xlDatabase, SourceData:= _
        "Feuil1!R1C1:R" & Range("NombreEntrées" ).Value + 1 & "C4"
 
     'R1CI veut dire à partir de la Rangée 1 et Colonne 1 de la feuille Données
     'vers la Rangée correspondant au nombre de lignes
     'selon le nom défini NombreEntrées + 1, correspondant à la ligne des titres
     'ici le Nombre_Entrées se trouve en C1 de la feuille2
     'et le nombre de colonne, qui est de 4
 
End Sub
 
En Feuille2, tapes le code suivant :
 
Private Sub Worksheet_Activate()
    Call MajTCDEssai
End Sub
 
Fermer VBA
 
Cliquer sur Feuille1
Ensuite sur Feuille2.
 
Un TCD est créé en Feuille2.
A vous de modifier le TCD selon vos critères.
 
Exemple Date en A6
Euros en B7
Selectionner la colonne B. Format. Cellule. Monétaire…..OK
Clique droit sur Date en A6
Grouper et afficher…
Grouper
Mois et Années
OK
 
FIN
 
NB : Je ne suis pas un expert en VBA. J’ai simplement compilé les données ici et là pour satisfaire mes besoins : un TCD avec des données qui peuvent varier soit à l’intérieur de la base des données, soit en rajoutant ou en enlevant des lignes. Le nombre de colonnes est déterminé d’avance et restera fixe.
 
Je reste réceptif à tout conseil.

Reply

Marsh Posté le 30-04-2010 à 11:43:45   

Reply

Marsh Posté le 14-12-2010 à 00:50:55    

bonsoir,
 
apres plusieurs jour de recherche je vous pose mon probleme,
 
je souhaite mettr à jour un tcd apres avoir ajouté des lignes et des collones.
je recherche avec come base ceci:
 
Range("a1" ).CurrentRegion.Select
 
ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _
Sheets("Feuil1" ).Range("a1" ).CurrentRegion).PivotTables("Tableau croisé dynamique3" ).PivotCache.Refresh , _
DefaultVersion:=xlPivotTableVersion10
 
mais pas de resultat jusqu'à present,
 
pouvez vous m'aider ,
 
Merci d'avance

Reply

Marsh Posté le 14-12-2010 à 11:41:35    

Bonjour
 
Problème également, excel ne veut pas se lancer et se bloque ici :  
 
 

Code :
  1. Sheets.Add
  2.     ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
  3.         "POINTAGE ATELIER!L98C2:L312C9", Version:=xlPivotTableVersion10). _
  4.         CreatePivotTable TableDestination:="Feuil1!L3C1", TableName:= _
  5.         "Tableau croisé dynamique5", DefaultVersion:=xlPivotTableVersion10

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed