Tableau croisé dynamique sur plage variable [VBA] - VB/VBA/VBS - Programmation
Marsh Posté le 27-12-2005 à 09:23:40
Salut nico-rep, 
Code :
  | 
 
 
Essaye avec ça, ça devrait marcher 
Tu peux faire de mmême pour les colones 
 
 
@+
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 
 
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:= _   | 
 
@+
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:= _   | 
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
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
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. 
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. 
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
Marsh Posté le 14-12-2010 à 11:41:35
Bonjour 
 
Problème également, excel ne veut pas se lancer et se bloque ici :  
 
 
Code :
  | 
Marsh Posté le 26-12-2005 à 17:51:48
Bonjour à tous
  
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):
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:
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
Message édité par Nico-Rep le 26-12-2005 à 17:54:53
---------------
Topic de vente HW - Ancien feed