Problème Marco Excel pour (TCD+Graphique 3D) en fonction d'une table variable

Signaler
Messages postés
336
Date d'inscription
dimanche 3 avril 2011
Statut
Membre
Dernière intervention
12 juin 2012
-
Messages postés
336
Date d'inscription
dimanche 3 avril 2011
Statut
Membre
Dernière intervention
12 juin 2012
-
Bonsoir tout le monde,

J'ai un petit problème de programmation en vba pour une macro sous Excel.

Voila mon souci :

Je dispose d'un code qui me permet de créer une table dont le nombre de colonnes est toujours le même (3 colonnes) et dont le nombre de lignes est variable en fonction de ce que l'utilisateur importe comme données (de une ligne à plusieurs milliers).

J'aimerais poursuivre le développement de ce code en appliquant un tableau croisé dynamique à la table puis afficher un graphe de surface 3D en fonction des données de la table.

En utilisant le mode enregistrement de macro pas à pas, je parviens à extraire une séquence de code qui me conviens. Le souci étant que le code ne fonctionne qu'avec une seule table et n'est pas dynamique. Donc si l'utilisateur entre une table (3 colonnes; 10 lignes) sa fonctionne mais dès lors que l'utilisateur ferme le fichier Excel et relance la macro avec une table (3 colonnes ; 300 lignes) sa ne fonctionne plus.

L'erreur est la suivante :

Erreur d'exécution '1004':
Le nom du champ dynamique n'est pas valide. Pour créer un tableau croisé dynamique, vous devez utiliser des données sous forme de liste avec étiquettes de colonnes. Si vous changez le nom d'un champ dynamique, il vous faut taper un nouveau nom pour le champ.

La ligne défectueuse est la suivante :

ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatab ase, SourceData:= _
"Feuil2!R1C1:R5191C3").CreatePivotTable TableDestination:="", TableName:= _
"Tableau croisé dynamique2"

Le problème viens de "Feuil2!R1C1:R5191C3" je pense. Mais je ne sais pas comment lui forcer à prendre toujours la même référence de feuille ou ma table se créer.


Pour rappel, voila ce que la marco permet de faire sur deux fichiers .dat :

Ce code permet d'importer les données contenues dans un fichier .dat et de les coller sur une feuille Excel. On peut ouvrir plusieurs Fichiers .dat et les données sont collées les unes à la suite des autres (fonction concaténer) sur la même feuille Excel.
De plus la marco permet à l'utilisateur de remplir une colonne par une valeur particulière et ce pour chaque fichier importé. Pour conclure, lors de l'import des données, on supprime un certains de nombre de lignes et de colones qui sont jugées inutiles. C'est la mise en forme de la table.

L'opération qu'il me reste à effectuer une fois tous les fichiers importés et ma table bien mise en forme, est un tableau croisé dynamique puis un graphe 3D (de surface) qui fonctionne pour chaque table que l'utilisateur créer (3 colonnes fixes et un nombre de lignes variable)



Merci à tous ceux qui pourront m'éclairer sur ce problème.

Cordialement,

André

Ps : je poste le code dans le prochain message

1 réponse

Messages postés
336
Date d'inscription
dimanche 3 avril 2011
Statut
Membre
Dernière intervention
12 juin 2012
1
Voila le code qui fonctionne bien pour l'instant :

Sub Test2()
Cells.Clear ' Vide la feuille
Dim Chemin As String, Valeur As Integer, N As Integer
Dim I As Long, Import As String, Tableau As Double
Application.ScreenUpdating = False ' Désactive l'affichage
I = 1 ' Initialise la première ligne
Chemin = "TEST" ' Pour que la boucle ne s'arrête pas tout de suite
While Chemin <> "" ' Tant que Chemin n'est pas vide
Chemin = Application.GetOpenFilename("Texte, *.dat") ' Boite de dialogue
If InStr(Chemin, "") = 0 Then ' Si Chemin n'a pas de \ donc que l'opérateur a fait annuler
GoTo Fin ' Va à l'étiquette Fin:
End If ' Fin du test
Valeur = Application.InputBox("Valeur à reporter :", "3ème colonne", , , , , , 1) 'Boite de dialogue
Open Chemin For Input As #1 ' Ouvre un fichier en lecture
Do While Not EOF(1) ' Tant qu'on est pas à la dernière ligne
Line Input #1, Import ' Lit la ligne et la stocke dans Import
Range("A" & I & ":E" & I).Value = Split(Replace(Import, ",", "."), Chr(9))
' Copie dans la ligne I colonnes A à E la ligne importée où les "," sont remplacées par des "."
' et Split crée un tableau en fonction des tabulations (Chr(9))
' C'est là qu'on pourrait faire appel aux 2 dernières valeurs du tableau, mais ce serait plus lourd
Range("F" & I).Value = Valeur
I = I + 1 ' On augmente le N° de la ligne
Loop ' On boucle dans le fichier
Close #1 ' On ferme le fichier
Wend ' On boucle sur l'ouverture de fichier
Fin: ' Etiquette pour quand on sort de la boucle
If I = 1 Then Exit Sub ' Si on a pas importer de fichier, on quitte la Sub
' Le problème, c'est que le Split envoie des nombres au format texte, d'où le traitement complémentaire
Range("F1") = 1 ' Met 1 en F1
Range("F1").Copy ' Copie F1
Range("A1:E" & I - 1).PasteSpecial Paste:=xlPasteAll, Operation:=xlMultiply, _
SkipBlanks:=False, Transpose:=False
' Collage spécial en multiplication par 1 qui transforme les valeurs textes en nombres
Application.CutCopyMode = False ' Désactive la sélection du copier
Range("F1").Clear ' Ote le 1 en F1
Range("A:C").Delete ' Supprime les 3 colonnes
N = Range("A65536").End(xlUp).Row 'Récupère le nombre total de lignes
For I = N To 1 Step -1
If Cells(I, 1) > 300 Or Cells(I, 1) < 50 Or Cells(I, 2) = 0 Then Rows(I).Delete 'Permet d'encadrer la table et de nétoyer les celulles nules
Next I
Range("A1").Select
ActiveCell.FormulaR1C1 = "a"
Range("B1").Select
ActiveCell.FormulaR1C1 = "b"
Range("C1").Select
ActiveCell.FormulaR1C1 = "c"
Application.ScreenUpdating = True ' Rétablit l'affichage

End Sub