VBA.EXCEL – Gérer dynamiquement les sources de données des graphiques

Problématique

Supposons que vous ayez une série de données quotidiennes : par définition, elle s’allonge tous les jours. Vous gérez un ou des graphiques sur ces données. Faut-il vraiment reparamétrer chaque jour la sélection des données de ces graphiques pour prendre en compte ce jour qui vient de poindre à) cette aurore nouvelle ? Oui si vous êtes un peu ballot comme je le fus pendant des lustres. Non si vous faites ce que je vous dis. A vous de voir.

Solution

Supposons que votre classeur s’appelle monclasseur.xlsm. Tiens ! comme c’est original ! Au lieu de persifler, regarder bien l’extension .xlsm. Ben oui ! Première chose, on va faire une macro pour résoudre le problème et si on ne met pas l’extension .xlsm, votre macro …

Vous avez une feuille dans ce classeur nommée SOURCE. Pour plus de facilités, nommez-la SOURCE sur l’onglet mais aussi dans l’espace macro accessible par ALT+F11. Pour ce faire, sélectionnez la feuille dans le pavé VBA.PROJECT puis dans le pavé Propriétés, donnez à la propriété Name la valeur SOURCE. Vous allez voir comme ça simplifie la vie.

Dans ce même classeur vous avez n graphiques que vous appellerez pour l’exemple COURBE1, COUBE2, …, COURBEn (le premier qui me redit que ce n’est pas original, je l’envoie dans le bureau du proviseur). Bien entendu, pour plus de facilités vous les renommez aussi dans les propriétés du VBA.PROJET comme la feuille de données SOURCE.

Par programme, vous avez réussi à isoler la dernière date lastDay et sa ligne de données lastLig. Pour y arriver, je vous fais une totale confiance.

A partir de ces préalables plus rapides qu’il n’y paraît voilà un exemple de code qui vous permettra de gérer dynamiquement et automatiquement la modification quotidienne des données source.

 With Workbooks(« monclasseur.xlsm »)

Dim ch As Chart

For Each ch In .Charts

ch.Axes(xlCategory).MaximumScale = lastDay

Select Case ch.Name

Case « COURBE1 »

ch.SetSourceData SOURCE.Range(« A2:B » & lastLig), xlColumns
ch.SeriesCollection(1).Name = « COURBE1 »

Case « COURBE2 »

ch.SetSourceData Union(SOURCE.Range(« A2:A » & lastLig),  _

SOURCE.Range(« L2:L » & lastLig)), xlColumns

ch.SeriesCollection(1).Name = « COURBE2 »

Case « COURBE1 »

ch.SetSourceData Union(SOURCE.Range(« A2:A » & lastLig), _

SOURCE.Range(« C2:C » & lastLig)), xlColumns

ch.SeriesCollection(1).Name = « COURBE1 »

End Select

Next

End With

Vous me direz « que vient faire ici ce select case » ? C’est juste pour vous montrer une autre ruse.

Si vos données sont contigües dans le tableau SOURCE, pas de problème un Range unique suffit comme pour COURBE1. Mais si elles sont dans des colonnes séparées, il faut avoir recours à la fonction Union de Range comme pour COURBE2 et 3 dont vous avez donc un exemple de syntaxe.

ET LE TOUR EST JOUÉ ! ALORS ON DIT MERCI QUI ?

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *