Macro complexe pour traitement de données importées
honnêtement, là je me sens impuissant. Pour diverses raisons (maladie et départ de collègues), je suis surbooké.
Pour gagner un peu de temps, je voudrais créér un outil qui me faciliterait le travaiL
En deux mots, juqu'à présent, après importation de données d'un autre programme, j'en faisais de façon empirique et manuellement un traitement multiple dans excel qui me donnait un "tableau de bord des sommes dépensées".
Je cheche une solution pour remplacer ces diverses procédures manuelles par un outil automatique.
Vous trouverez dans le fichier le début de mes besoins (en bleu). Je reste bien entendu à votre entière disposition pour tout éclaircissement.
D'avance merci pour le coup de main, d'autant plus que je sais à peu près le résultat voulu mais je n'arrive pas à trouver par quel bout commencer.
A bientôt, et d'avance, merci milles fois,
amcalement,
Elfi
Bonjour,
voici un début de solution, il me reste qu'a rafraichir le tableau principal. Au lieu d'ajouter les données qui n'était pas présentent dans les feuilles "Ligne", je me suis dit que ça serait plus rapide de tout effacer et de tout ajouter à chaque fois. Dis moi si c'est dans la bonne voie.
La procedure
Public Sub MajTableau(MaZone As Range)
Dim MaLigne As Range
Dim Ws As Worksheet
'On vide les tableaux
For Each Ws In Worksheets
If Left(Ws.Name, 5) = "Ligne" Then
Ws.Range("B3:E65536").ClearContents
End If
Next Ws
For Each MaLigne In MaZone.Rows
With Sheets(MaLigne.Cells(1, 3).Value)
Dim DernLign As Integer
DernLign = .Range("B65536").End(xlUp).Offset(1, 0).Row
.Range("B" & DernLign).Value = MaLigne.Cells(1, 1).Value
.Range("C" & DernLign).Value = MaLigne.Cells(1, 2).Value
.Range("D" & DernLign).Value = MaLigne.Cells(1, 4).Value
.Range("E" & DernLign).Value = MaLigne.Cells(1, 5).Value
End With
Next MaLigne
'On rafraichis les TCD
For Each Ws In Worksheets
If Left(Ws.Name, 5) = "Ligne" Then
Ws.PivotTables(1).PivotCache.Refresh
End If
Next Ws
End Sub
d'ors et déjà, merci car tu t'es appoché trés vite de ce qu'il me faut.
J'ai testé ton travail et la mise à jour est super. Pour aller plus loin, deux soucis:
a) Les TCD de "ligne 2" et "ligne 3" font référence au tableau de "ligne 1".
b) Après le rafraichissement, la base du TCD intègre des cellules vides ce qui fait que je ne peux plus grouper les dates par mois et trimestre dans le TCD.
Peut-être as-tu prévu tout cela par la suite en travaillant sur le tableau principal. J'avoue que je suis assez impuissant mais j'ai confiance!
Encore une fois, merci d'avance,
A te relire,
Amicalement,
Elfi
Voici une deuxième version, je ne suis pas sur de la façon dont tu veux que les TCD foncitonnent.
J'ai essayé de cette façon, à toi de voir. Durant la mise-a-jour des données j'ai ajouté deux colonnes Mois et Trimestre qui sont calculé automatiquement.
Regarde ça et revient moi.
Mes excuses pour le retard de ma réponse. Une angine en été, c'est pas de bol. J'ai regardé la deuxième mouture. Ca a l'air d'être exactement ce que je désirais.
Je teste avec le vrai fichier aujourd'hui ou demain et te tiens au courant.
En tout cas, chapeau d'avance et merci mille fois.
A +,
amicalement,
Elfi
-- Mar Aoû 17, 2010 1:24 pm --
Bonjour Math.
J'ai testé et ça fonctionne avec le fichier "théorique".
Avec le fichier pratique, mon problème est le suivant: mon import contient des N° et non des noms. exemple:
Colonne C de la feuille Fichier import(N° de ligne): 1459, 1448, etc.
Mon classeur lui, possède une feuille par n°, exemple feuille "1459", "1448", etc.
Comment adapter ton code sans la mention "ligne ..."?
En cas de problème, je te ferai passer le fichier original vide, peut-être cela sera-t-il plus parlant.
D'avance merci,
amicalement,
Elfi
-- Mar Aoû 17, 2010 2:32 pm --
et encore merci à Math pour sa patience.
le mieux est de faire passer le fichier original.
J'ai "collé" le travail de Math mais la mise à jour (feuille "fichier import") ne fonctionne plus. Peut-être n'est-ce pas trop grave, enfin, j'espère.
Amicalement,
Elfi
hello Math,
Coucou Claude,
Voila, grâce à Claude
If Ws.Name <> "évolution des sommes payées." And Ws.Name <> "Fichier import" Then
Mon problème maintenant est que la ligne
"With Sheets(MaLigne.Cells(1, 3).Value)"
m'envoie une erreur d'exécution '9': <<l'indice n'appartient pas à la sélection.>>
Là, je me sens tout petit et je ne comprend pas pourquoi.
Merci de bien vouloir éclairer ma lanterne.
Bien cordialement,
Elfi
Bonjour Elfi, content de voir que ça marche.
Pour ton problème, remplace par la ligne suivante
With Sheets(CStr(MaLigne.Cells(1, 3).Value))tes noms de cellules sont des nombres et il semble que Excel aie de la misère à interpreter. Alors on convertit le nombre en texte et ça fonctionne.
Bonne journée
PS Claude ça serait bien que tu répondes dans le post, pour que tout le monde puisse suivre le fil.
super génial, ça marche!!!!
J'essaie demain avec un véritable import et je te tiens au courant.
Pour ton PS, Claude n'est pas à incriminer. C'est moi qui avais fait un autre post (<<Langage VBA:choisir des feuilles bien particulières>>) afin de ne pas surcherger celui-ci. Méa-Culpa!
A te relire et encore milles fois merci,
Amicalement,
Elfi
-- Mer Aoû 18, 2010 3:53 pm --
Décidément, j'ai décidé de t'embêter.
Voila, je t'explique: normalement, il n'y aurait pas besoin de créer une colonne mois et trimestre. En effet, avec le TCD, on peux grouper les dates en mois et en trimestre (option grouper). Le problème est que pour cela, la base du TCD ne doit pas faire référence à des lignes vides.
Y a -t-il une solution dans le code pour ne donner en référence que les lignes remplies des tableaux après de la mise à jour et lors du raffraichissement des TCD? Sinon, pas grave, je conserverai les colonnes mois et trimestre.
A te relire,
avec toute ma reconnaissance à toi et à tous les forumeurs.
Amicalement,
Elfi
Une solution serait de définir des noms pour tes plages de données et d'y faire référence dans tes TCD. Quand on lance la mise à jour, on n'a qu'à redimensionner la liste de nom avant de mettre le TCD à jour. J'ai modifié la dernière partie du code:
For Each Ws In Worksheets
If Ws.Name <> "évolution des sommes payées." And Ws.Name <> "Fichier import" Then
'Redimension des plages de données
Dim Lgn As Integer
Lgn = Ws.Range("B65536").End(xlUp).Offset(1, 0).Row - 1
ActiveWorkbook.Names.Add Name:="Data" & Ws.Name, RefersTo:="=" & Ws.Name & "!$B$2:$E$" & Lgn
Ws.PivotTables(1).PivotCache.Refresh
End If
Next WsRoule le code une première fois. Ensuite modifie tes TCD pour qu'ils aient le noms de la plages EX: Data1475 au lieu de '1475'!$B$2:$E$34.
Pour nommer les plages j'ai utilisé Data + le nom de la feuille. Pour l'option grouper, je ne la connaissais pas, j'utilise rarement les TCD. Essaie le nouveau code pour voir si ça fonctionne et donne moi des nouvelles. C'est ok si tu veux des esplications plus détaillé en privé.
Pour mon message à Claude, ce n'était nullement une attaque envers lui.
Bonjour Math.
Message bien reçu, la définition des noms est intéressante. Je m'y plonge et te tiens au courant.
Amicalement,
Elfi
-- Jeu Aoû 19, 2010 9:53 am --
Math, Yaouh, c'est génial.
J'ai fait tout ce que tu m'as dit avec un exemple de trois lignes (feuilles, nom, etc). On arrive exactement à ce que je voulais. Mon tableau global se met à jour, mes TCD se modifient automatiquement, enfin bref, c'est fantastique.
Je te joins l'exemple pour que tu vois.
Vraiment, bravo pour ton panache et tes capacités!
Bravo aussi à ce forum génial.
Milles mercis une nouvelle fois.
Math, je reste en contact pour les explications. A bientôt,
Amicalement,
Elfi