A voir également:
- Vba tableau croisé dynamique plage variable
- TCD plage variable avec VBA ✓ - Forum - VB / VBA
- Plage de donnée pour tableau croisé dynamique ✓ - Forum - Excel
- Tableau croisé dynamique plage variable - Forum - Programmation
- VBA : tableau croisé dynamiq plage variable - Forum - VB / VBA
- Vba tableau croisé dynamique filtre ✓ - Forum - VB / VBA
11 réponses
manueHN
J'ai reussssi !!!!
Il ne me reste qu'un soucis de format de TCD mais pour le moment, je vais me contenter de ca :)
Je mets mon code si dessous si ca interesse quelqu'un :
Option Explicit
Sub TCD_recap()
Dim plage As Range
Dim DerLig As Long
Dim NomFeuille As String
NomFeuille = "base valabs"
DerLig = Worksheets(NomFeuille).Range("A" & Rows.Count).End(xlUp).Row
'Selection de la plage source presente sur l'onglet "base valabs"
Set plage = Worksheets(NomFeuille).Range(Cells(1, 1), Cells(DerLig, 14))
Sheets.Add.Name = "recap"
'Creation du TCD
ActiveSheet.PivotTableWizard _
SourceType:=xlDatabase, _
SourceData:=plage, _
TableDestination:=Range("A3"), _
TableName:="TCD_recap"
'Mise en forme
With ActiveSheet.PivotTables("TCD_recap")
'Ajoute un champ de lignes nommé "CZTDCS".
.AddFields RowFields:="CZTDCS"
'Définit l'orientation du champ nommé "CZPN" en tant que Donnée.
.PivotFields("CZPN").Orientation = xlDataField
'Définit l'orientation du champ nommé "VALEURECAR" en tant que Donnée.
.PivotFields("VALEURECAR").Orientation = xlDataField
'Définit l'orientation du champ nommé "VALABS" en tant que Donnée.
.PivotFields("VALABS").Orientation = xlDataField
End With
End Sub
Encore merci a ce forum d'exister !
Manue
Il ne me reste qu'un soucis de format de TCD mais pour le moment, je vais me contenter de ca :)
Je mets mon code si dessous si ca interesse quelqu'un :
Option Explicit
Sub TCD_recap()
Dim plage As Range
Dim DerLig As Long
Dim NomFeuille As String
NomFeuille = "base valabs"
DerLig = Worksheets(NomFeuille).Range("A" & Rows.Count).End(xlUp).Row
'Selection de la plage source presente sur l'onglet "base valabs"
Set plage = Worksheets(NomFeuille).Range(Cells(1, 1), Cells(DerLig, 14))
Sheets.Add.Name = "recap"
'Creation du TCD
ActiveSheet.PivotTableWizard _
SourceType:=xlDatabase, _
SourceData:=plage, _
TableDestination:=Range("A3"), _
TableName:="TCD_recap"
'Mise en forme
With ActiveSheet.PivotTables("TCD_recap")
'Ajoute un champ de lignes nommé "CZTDCS".
.AddFields RowFields:="CZTDCS"
'Définit l'orientation du champ nommé "CZPN" en tant que Donnée.
.PivotFields("CZPN").Orientation = xlDataField
'Définit l'orientation du champ nommé "VALEURECAR" en tant que Donnée.
.PivotFields("VALEURECAR").Orientation = xlDataField
'Définit l'orientation du champ nommé "VALABS" en tant que Donnée.
.PivotFields("VALABS").Orientation = xlDataField
End With
End Sub
Encore merci a ce forum d'exister !
Manue
Heliotte
- Messages postés
- 1491
- Date d'inscription
- vendredi 26 octobre 2012
- Statut
- Membre
- Dernière intervention
- 28 janvier 2013
Bonjour manueHN,
A ajouter au code, après "DerLig = num_ligne - 1":
edit: faute de syntaxe !
A ajouter au code, après "DerLig = num_ligne - 1":
If(DerLig<1) Then MsgBox "Le numéro de la dernière ligne est : " & DerLig & " !!!"
edit: faute de syntaxe !
manueHN
Re,
Je ne comprends pas pourquoi il faut rajouter un message box ? Sur mon onglet ou se situe ma base (base valabs), il y a toujours plus d'une ligne.
En plus, la le message box ce fait sur l'onglet ou doit etre cree le tableau croise dynamyque, mais le TDC ne se cree pas. Toujours un beuggue au niveau de :
Set plage = Worksheets(NomFeuille).Range(Cells(1, 1), Cells(DerLig, 14))
Cordialement
Je ne comprends pas pourquoi il faut rajouter un message box ? Sur mon onglet ou se situe ma base (base valabs), il y a toujours plus d'une ligne.
En plus, la le message box ce fait sur l'onglet ou doit etre cree le tableau croise dynamyque, mais le TDC ne se cree pas. Toujours un beuggue au niveau de :
Set plage = Worksheets(NomFeuille).Range(Cells(1, 1), Cells(DerLig, 14))
Cordialement
Heliotte
- Messages postés
- 1491
- Date d'inscription
- vendredi 26 octobre 2012
- Statut
- Membre
- Dernière intervention
- 28 janvier 2013
Si je te demande d'ajouter TEMPORAIREMENT ce MsgBox, c'est uniquement pour voir le numéro de la dernière ligne que tu récupère avec la variable "DerLig".
C'est tout !
edit: maintenant, il faut voir si tu récupères ..
on pourrait faire autrement :
C'est tout !
edit: maintenant, il faut voir si tu récupères ..
on pourrait faire autrement :
MsgBox "Le numéro de la dernière ligne est : " & DerLig & " !!!"sans le
If(DerLig<1) ThenDe cette façon on connaîtra le numéro de la dernière ligne !!!
Heliotte
- Messages postés
- 1491
- Date d'inscription
- vendredi 26 octobre 2012
- Statut
- Membre
- Dernière intervention
- 28 janvier 2013
A la place de :
Essayez avec :
With Sheets("base valabs").Select Set plage = .Range(.Cells(1, 1), .Cells(DerLig, 14)) End With
Essayez avec :
Dim plage As Range Dim NomFeuille As String NomFeuille = "base valabs" ' Set plage = Worksheets(NomFeuille).Range(Cells(1, 1), Cells(20, 14))
manueHN
Bonjour,
ca fait 3 fois que je reecris ce message ! lol
Merci pour ta reponse rapide. J'ai essaye ta solution ce matin et Excel bloque a l'endroit suivant :
Set plage = Worksheets(NomFeuille).Range(Cells(1, 1), Cells(DerLig, 14))
Je ne sais pas pourquoi. C'est pourtant ce que tu m'avais suggere, sauf que j'ai change Cells(20, 14) par Cells(DerLig, 14) car ma derniere ligme active est variable en fonction des mois.
Vois-tu ou est l'erreur ?
Merci encore pour ton aide.
Je te joins mon code en entier :
Option Explicit
Sub TCD_recap()
Dim plage As Range
Dim num_ligne As Long
Dim DerLig As Long
Dim NomFeuille As String
NomFeuille = "base valabs"
num_ligne = Range("A1").CurrentRegion.Rows.Count
DerLig = num_ligne - 1
'Creation du TCD
Set plage = Worksheets(NomFeuille).Range(Cells(1, 1), Cells(DerLig, 14))
Sheets.Add
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
plage).CreatePivotTable TableDestination:=ActiveSheet.Range("A3"), TableName:="TCD_recap", DefaultVersion:=xlTable4
'Mise en forme
With ActiveSheet.PivotTables("TCD_recap")
'Ajoute un champ de lignes nommé "CZTDCS".
.AddFields RowFields:="CZTDCS"
'Définit l'orientation du champ nommé "CZPN" en tant que Donnée.
.PivotFields("CZPN").Orientation = xlDataField
'Définit l'orientation du champ nommé "VALEURECAR" en tant que Donnée.
.PivotFields("VALEURECAR").Orientation = xlDataField
'Définit l'orientation du champ nommé "VALABS" en tant que Donnée.
.PivotFields("VALABS").Orientation = xlDataField
End With
End Sub
ca fait 3 fois que je reecris ce message ! lol
Merci pour ta reponse rapide. J'ai essaye ta solution ce matin et Excel bloque a l'endroit suivant :
Set plage = Worksheets(NomFeuille).Range(Cells(1, 1), Cells(DerLig, 14))
Je ne sais pas pourquoi. C'est pourtant ce que tu m'avais suggere, sauf que j'ai change Cells(20, 14) par Cells(DerLig, 14) car ma derniere ligme active est variable en fonction des mois.
Vois-tu ou est l'erreur ?
Merci encore pour ton aide.
Je te joins mon code en entier :
Option Explicit
Sub TCD_recap()
Dim plage As Range
Dim num_ligne As Long
Dim DerLig As Long
Dim NomFeuille As String
NomFeuille = "base valabs"
num_ligne = Range("A1").CurrentRegion.Rows.Count
DerLig = num_ligne - 1
'Creation du TCD
Set plage = Worksheets(NomFeuille).Range(Cells(1, 1), Cells(DerLig, 14))
Sheets.Add
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
plage).CreatePivotTable TableDestination:=ActiveSheet.Range("A3"), TableName:="TCD_recap", DefaultVersion:=xlTable4
'Mise en forme
With ActiveSheet.PivotTables("TCD_recap")
'Ajoute un champ de lignes nommé "CZTDCS".
.AddFields RowFields:="CZTDCS"
'Définit l'orientation du champ nommé "CZPN" en tant que Donnée.
.PivotFields("CZPN").Orientation = xlDataField
'Définit l'orientation du champ nommé "VALEURECAR" en tant que Donnée.
.PivotFields("VALEURECAR").Orientation = xlDataField
'Définit l'orientation du champ nommé "VALABS" en tant que Donnée.
.PivotFields("VALABS").Orientation = xlDataField
End With
End Sub
Heliotte
- Messages postés
- 1491
- Date d'inscription
- vendredi 26 octobre 2012
- Statut
- Membre
- Dernière intervention
- 28 janvier 2013
manueHN,
Cela veut dire,
Soit, qu'il n'y a pas de ligne remplie en "A",
Soit que le code que tu utilise pour récupérer la ligne est erroné !!!
Cela veut dire,
Soit, qu'il n'y a pas de ligne remplie en "A",
Soit que le code que tu utilise pour récupérer la ligne est erroné !!!
Heliotte
- Messages postés
- 1491
- Date d'inscription
- vendredi 26 octobre 2012
- Statut
- Membre
- Dernière intervention
- 28 janvier 2013
manueHN,
Essaie ceci:
Essaie ceci:
Dim DerLig As Long DerLig = Range("A" & Rows.Count).End(xlUp).Rowet tiens-moi au courant, merci
Heliotte
- Messages postés
- 1491
- Date d'inscription
- vendredi 26 octobre 2012
- Statut
- Membre
- Dernière intervention
- 28 janvier 2013
manueHN,
J'ai oublié de te précisé ..
le "A" peut être changé .. par exemple tu es certain que toutes les lignes sont "UTILISÉE" dans la colonne "D" mais pas sûr dans la colonne "A" .. alors tu changes cette lettre, tout simplement.
J'ai oublié de te précisé ..
le "A" peut être changé .. par exemple tu es certain que toutes les lignes sont "UTILISÉE" dans la colonne "D" mais pas sûr dans la colonne "A" .. alors tu changes cette lettre, tout simplement.
manueHN
re,
J'ai essayer ta proposition et ca beuggue toujours sur cette ligne. Quand je passe mon curseur sur DerLig ca me met "DerLig=1", hors il devrait me renvoyer 132.
Je te met mon code car j'ai peut etre fait des betises :
Option Explicit
Sub TCD_recap()
Dim plage As Range
Dim DerLig As Long
Dim NomFeuille As String
NomFeuille = "base valabs"
DerLig = Range("A" & Rows.Count).End(xlUp).Row
'Creation du TCD
Set plage = Worksheets(NomFeuille).Range(Cells(1, 1), Cells(DerLig, 14))
Sheets.Add
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
plage).CreatePivotTable TableDestination:=ActiveSheet.Range("A3"), TableName:="TCD_recap", DefaultVersion:=xlTable4
'Mise en forme
With ActiveSheet.PivotTables("TCD_recap")
'Ajoute un champ de lignes nommé "CZTDCS".
.AddFields RowFields:="CZTDCS"
'Définit l'orientation du champ nommé "CZPN" en tant que Donnée.
.PivotFields("CZPN").Orientation = xlDataField
'Définit l'orientation du champ nommé "VALEURECAR" en tant que Donnée.
.PivotFields("VALEURECAR").Orientation = xlDataField
'Définit l'orientation du champ nommé "VALABS" en tant que Donnée.
.PivotFields("VALABS").Orientation = xlDataField
End With
End Sub
Merci :)
J'ai essayer ta proposition et ca beuggue toujours sur cette ligne. Quand je passe mon curseur sur DerLig ca me met "DerLig=1", hors il devrait me renvoyer 132.
Je te met mon code car j'ai peut etre fait des betises :
Option Explicit
Sub TCD_recap()
Dim plage As Range
Dim DerLig As Long
Dim NomFeuille As String
NomFeuille = "base valabs"
DerLig = Range("A" & Rows.Count).End(xlUp).Row
'Creation du TCD
Set plage = Worksheets(NomFeuille).Range(Cells(1, 1), Cells(DerLig, 14))
Sheets.Add
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
plage).CreatePivotTable TableDestination:=ActiveSheet.Range("A3"), TableName:="TCD_recap", DefaultVersion:=xlTable4
'Mise en forme
With ActiveSheet.PivotTables("TCD_recap")
'Ajoute un champ de lignes nommé "CZTDCS".
.AddFields RowFields:="CZTDCS"
'Définit l'orientation du champ nommé "CZPN" en tant que Donnée.
.PivotFields("CZPN").Orientation = xlDataField
'Définit l'orientation du champ nommé "VALEURECAR" en tant que Donnée.
.PivotFields("VALEURECAR").Orientation = xlDataField
'Définit l'orientation du champ nommé "VALABS" en tant que Donnée.
.PivotFields("VALABS").Orientation = xlDataField
End With
End Sub
Merci :)
manueHN
Mais le MsgBox a l'air de ce faire sur l'onglet du TCD qui est vide actuellement puisque je n'arrive pas a le creer et non sur l'onglet ou se situe la base (base valabs).
En fait, pour tout t'expliquer, je suis obligee de passer par la car sur mon onglet de base, la derniere ligne est composee de formule (somme, nbval). Evidemment, je ne veux pas la prendre pour mon TDC.
C'est pourquoi, j'ai pense pouvoir passer par une variable qui me trouve le dernier numero de ligne : num_ligne = Range("A1").CurrentRegion.Rows.Count
Puis, lui demander de prendre le nombre de ligne precedent pour ne pas prendre les totaux : DerLig = num_ligne - 1
Cette variable fonctionnait avec ce code :
Set plage = .Range(.Cells(1, 1), .Cells(DerLig, 14))
DerLig me renvoyait bien ce que je cherchais : ligne 132
Mais plage etait egal a "Nothing"
Je me demande si ce n'est pas plutot un probleme avec :
Dim plage As Range
???
En fait, pour tout t'expliquer, je suis obligee de passer par la car sur mon onglet de base, la derniere ligne est composee de formule (somme, nbval). Evidemment, je ne veux pas la prendre pour mon TDC.
C'est pourquoi, j'ai pense pouvoir passer par une variable qui me trouve le dernier numero de ligne : num_ligne = Range("A1").CurrentRegion.Rows.Count
Puis, lui demander de prendre le nombre de ligne precedent pour ne pas prendre les totaux : DerLig = num_ligne - 1
Cette variable fonctionnait avec ce code :
Set plage = .Range(.Cells(1, 1), .Cells(DerLig, 14))
DerLig me renvoyait bien ce que je cherchais : ligne 132
Mais plage etait egal a "Nothing"
Je me demande si ce n'est pas plutot un probleme avec :
Dim plage As Range
???
Heliotte
- Messages postés
- 1491
- Date d'inscription
- vendredi 26 octobre 2012
- Statut
- Membre
- Dernière intervention
- 28 janvier 2013
A tester :
DerLig = Worksheets(NomFeuille).Range("A" & Rows.Count).End(xlUp).Row
Heliotte
- Messages postés
- 1491
- Date d'inscription
- vendredi 26 octobre 2012
- Statut
- Membre
- Dernière intervention
- 28 janvier 2013
J'ai fait la même chose que toi, sur classeur Excel, version 2003, et ça fonctionne .. bizarre !
Après le "Set ..", peux-tu mettre ce code
Après le "Set ..", peux-tu mettre ce code
MsgBox "plage: " & plage.Addresset me dire ce qu'il y est écrit, merci
manueHN
le MsgBox inscrit : "plage $A$1:$N$132"
Je te remets mon code pour voir si des choses different par rapport a ton code :
Option Explicit
Sub TCD_recap()
Dim plage As Range
Dim DerLig As Long
Dim NomFeuille As String
NomFeuille = "base valabs"
DerLig = Worksheets(NomFeuille).Range("A" & Rows.Count).End(xlUp).Row
'Creation du TCD
Set plage = Worksheets(NomFeuille).Range(Cells(1, 1), Cells(DerLig, 14))
MsgBox "plage: " & plage.Address
Sheets.Add
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
plage).CreatePivotTable TableDestination:=ActiveSheet.Range("A3"), TableName:="TCD_recap", DefaultVersion:=xlTable4
'Mise en forme
With ActiveSheet.PivotTables("TCD_recap")
'Ajoute un champ de lignes nommé "CZTDCS".
.AddFields RowFields:="CZTDCS"
'Définit l'orientation du champ nommé "CZPN" en tant que Donnée.
.PivotFields("CZPN").Orientation = xlDataField
'Définit l'orientation du champ nommé "VALEURECAR" en tant que Donnée.
.PivotFields("VALEURECAR").Orientation = xlDataField
'Définit l'orientation du champ nommé "VALABS" en tant que Donnée.
.PivotFields("VALABS").Orientation = xlDataField
End With
End Sub
NB : Je precise que la je travaille sur Excel 2007 mais qu'il est en mode compatibilite car au travail, je dois pouvoir l'utiliser sur Excel 2003.
Je te remets mon code pour voir si des choses different par rapport a ton code :
Option Explicit
Sub TCD_recap()
Dim plage As Range
Dim DerLig As Long
Dim NomFeuille As String
NomFeuille = "base valabs"
DerLig = Worksheets(NomFeuille).Range("A" & Rows.Count).End(xlUp).Row
'Creation du TCD
Set plage = Worksheets(NomFeuille).Range(Cells(1, 1), Cells(DerLig, 14))
MsgBox "plage: " & plage.Address
Sheets.Add
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
plage).CreatePivotTable TableDestination:=ActiveSheet.Range("A3"), TableName:="TCD_recap", DefaultVersion:=xlTable4
'Mise en forme
With ActiveSheet.PivotTables("TCD_recap")
'Ajoute un champ de lignes nommé "CZTDCS".
.AddFields RowFields:="CZTDCS"
'Définit l'orientation du champ nommé "CZPN" en tant que Donnée.
.PivotFields("CZPN").Orientation = xlDataField
'Définit l'orientation du champ nommé "VALEURECAR" en tant que Donnée.
.PivotFields("VALEURECAR").Orientation = xlDataField
'Définit l'orientation du champ nommé "VALABS" en tant que Donnée.
.PivotFields("VALABS").Orientation = xlDataField
End With
End Sub
NB : Je precise que la je travaille sur Excel 2007 mais qu'il est en mode compatibilite car au travail, je dois pouvoir l'utiliser sur Excel 2003.
Heliotte
- Messages postés
- 1491
- Date d'inscription
- vendredi 26 octobre 2012
- Statut
- Membre
- Dernière intervention
- 28 janvier 2013
manueHN,
Tout ce passe bien jusqu'à la création de la feuille .. il crée une nouvelle feuille qu'il place en première position.
Ensuite, il ne veux pas :
Erreur d'exécution 1004 : Erreur définie par l'application ou par l'objet
Il ne veut pas créer le tableau croisé dynamique .. désolé, mais là, je ne vais pas pouvoir t'être d'une grande utilité.
Tout ce passe bien jusqu'à la création de la feuille .. il crée une nouvelle feuille qu'il place en première position.
Ensuite, il ne veux pas :
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _ plage).CreatePivotTable TableDestination:=ActiveSheet.Range("A3"), TableName:="TCD_recap", DefaultVersion:=xlTable4
Erreur d'exécution 1004 : Erreur définie par l'application ou par l'objet
Il ne veut pas créer le tableau croisé dynamique .. désolé, mais là, je ne vais pas pouvoir t'être d'une grande utilité.
manueHN
Chez moi, le code me fait une erreur a "set...."
et une, au niveau de "ActiveWorkbook..." comme tu l'indiques. Par contre, il ne me met pas de type d'erreur.
Peux-tu me mettre le code que toi tu as essaye chez toi ?
En tout cas merci pour ton aide.
J'espere reussir a debbeugguer le code pour la creation du TCD
Cordialement
et une, au niveau de "ActiveWorkbook..." comme tu l'indiques. Par contre, il ne me met pas de type d'erreur.
Peux-tu me mettre le code que toi tu as essaye chez toi ?
En tout cas merci pour ton aide.
J'espere reussir a debbeugguer le code pour la creation du TCD
Cordialement
Heliotte
- Messages postés
- 1491
- Date d'inscription
- vendredi 26 octobre 2012
- Statut
- Membre
- Dernière intervention
- 28 janvier 2013
Tu m'avais dit que dans le msgbox, le résultat était "plage $A$1:$N$132".
- Donc, si tu es passé ce message, le "Set" devrait être bon ?!?
- Est-ce qu'il te crée une nouvelle feuillé ?
- Et à quelle position te met-il cette nouvelle feuille ?
- Donc, si tu es passé ce message, le "Set" devrait être bon ?!?
- Est-ce qu'il te crée une nouvelle feuillé ?
- Et à quelle position te met-il cette nouvelle feuille ?
Heliotte
- Messages postés
- 1491
- Date d'inscription
- vendredi 26 octobre 2012
- Statut
- Membre
- Dernière intervention
- 28 janvier 2013
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _ plage).CreatePivotTable TableDestination:=ActiveSheet.Range("A3"), TableName:="TCD_recap", DefaultVersion:=xlTable4
As-tu une feuille qui se nomme "TCD_recap" ?
Heliotte
- Messages postés
- 1491
- Date d'inscription
- vendredi 26 octobre 2012
- Statut
- Membre
- Dernière intervention
- 28 janvier 2013
Le soucis est que mes connaissances en ce qui concerne les tableaux croisés dynamique ne sont .. pas au top.
Par contre, je sais que, quand on crée une feuille, Excel lui donne un nom quelconque directement .. et après .. pour aller la rechercher, il faut faire un boucle sur la collection de feuille pour, par exemple, la renommer à sa façon perso.
La question que je me pose : comment peut-on créer une table pivot dans une feuille inconnue ? car, je pense que cette nouvelle feuille crée par le code, dont le nom lui est totalement inconnu ...
Par contre, je sais que, quand on crée une feuille, Excel lui donne un nom quelconque directement .. et après .. pour aller la rechercher, il faut faire un boucle sur la collection de feuille pour, par exemple, la renommer à sa façon perso.
La question que je me pose : comment peut-on créer une table pivot dans une feuille inconnue ? car, je pense que cette nouvelle feuille crée par le code, dont le nom lui est totalement inconnu ...
Heliotte
- Messages postés
- 1491
- Date d'inscription
- vendredi 26 octobre 2012
- Statut
- Membre
- Dernière intervention
- 28 janvier 2013
Il faut penser à renommer la nouvelle feuille, à mémoriser son nom, et l'activer pour pouvoir créer la table pivot, non ?
Félicitation et bonne continuation