Taille de police :

×

Lecture de la page :

Lire Test2

A la découverte des tableaux structurés 2/2

0
(0)

Voici la suite de l'article A la découverte des tableaux structurés 1/2.

Syntaxes des références structurées pour les formules de calculs

Par défaut, quand c'est possible, Excel va utiliser un type de référence spécifique pour faire référence à une cellule sur la même ligne, à une ou des colonnes du tableau ou à tout le tableau.

Référence à une cellule sur la même ligne

Pour calculer un montant (Quantité * Prix), au lieu d'avoir le classique :

= E2 * F2

Nous obtiendrons :

Si la formule est dans le tableau structuré :
= [@Qt]*[@Prix]

Si la formule est à lʼextérieur du tableau :
= Tableau5[@Qt]*Tableau5[@Prix]

  • Le "@" indique d'utiliser la valeur correspondante de la ligne du tableau (intersection implicite).
  • "Tableau5" est le nom du tableau.
  • Dans le tableau, cette formule sera automatiquement recopiée dans toute la colonne. On aura donc la même formule pour toutes les cellules du tableau mais renvoyant un résultat différent en fonction de la ligne (grâce au "@").
  • En cas de recopie horizontal (on reste sur la même ligne) de cette formule, Excel décalera les références des colonnes [Qt] et [Prix] comme il le ferait pour la version avec des références standards (par exemple E2 * F2).
Exemple de formule utilisant des références structurées

Référence aux données d'une colonne (sans le titre de colonne)

Pour calculer la somme des montants, au lieu de :

= SOMME(G2:G4)

Nous obtiendrons :

= SOMME(Tableau5[Mt])

  • [Mt] : Nom de la colonne.
  • En cas de recopie horizontal (reste sur la même ligne) de cette formule, Excel décalera la référence de colonne [Mt] comme il le ferait pour la version avec des références standards (G2:G4 devient H2:H4).

Référence aux données de plusieurs colonnes (sans les titres)

Pour compter le nombre de valeurs saisies entre les colonnes "Design" et "Colonne3", au lieu d'avoir :

= NBVAL(B2:D4)

Nous obtiendrons :

= NBVAL(Tableau5[[Desig]:[Colonne3]])

  • [Desig]:[Colonne3] : Toutes les colonnes entre la colonne [Desig] et la colonne [Colonne3].
  • Attention : En cas de recopie horizontal (reste sur la même ligne) de cette formule, Excel NE décalera PAS ces références de colonne.

Remarque :

  • Le fait qu'Excel ne fasse pas de décalage des références dans cas (plage de colonne), nous donne la syntaxe à employer si l'on veut faire référence à une colonne en mode "absolue", c'est à dire sans qu'Excel ne décale cette référence en cas de recopie horizontale (ce que l'on fait en joutant des "$" aux référence standard).
On veut bloquer la référence à la colonne Qt comme on le ferait en ajoutant de $ a la référence pour la passer en absolue (= $E2 * F2) :

 = Tableau5[@[Qt]:[Qt]]*Tableau5[@Prix]

Autres références structurées possibles

Référence à une colonne avec son titre :
 = NBVAL(Tableau5[[#Tout];[Desig]])
 
Référence à plusieurs colonnes avec leurs titres :
 = NBVAL(Tableau5[[#Tout];[Desig]:[Matière]])

Référence à tout le tableau sans les titres :
 = NBVAL(Tableau5)

Référence à tout le tableau avec les titres :
 = NBVAL(Tableau5[#Tout])

Référence à un titre dʼune colonne :
 = NBVAL(Tableau5[[#En-têtes];[Desig2]])

Référence à tous les titres des colonnes du tableau :
 = NBVAL(Tableau5[#En-têtes])

Référence à 2 valeurs de la ligne de synthèse :
 = NBVAL(Tableau1[[#Totaux];[Qt]:[Prix]])

Référence à toutes les valeurs de la ligne de synthèse :
 = NBVAL(Tableau5[#Totaux])

Référence mixte

Il est tout à fait possible d'utiliser une référence pour une plage mélangeant une référence standard et une référence structurée.

Référence mixte générant une plage dynamique ("accordéon")
= NB.SI(B$2:[@Ref];[@Ref])
  • Ici B$2 : [@Ref] représente une plage s'agrandissant d'une ligne à chaque ligne, partant de B2 (début des données de la colonne) jusqu'à la ligne "en cours".

Intérêts de ces nouvelles syntaxes par rapport aux références classiques (type L1C2)

  • Des formules plus lisibles.
  • Dans une colonne du tableau structuré, automatisation de la recopie et de la mise à jour (gain de temps et cohérence assurée)
    • Les formules se recopient automatiquement, peu importe où elle est générée ou modifiée.
    • Les formules prennent en comptes les nouvelles données ajoutées et se limitent strictement à la plage de données réellement utilisée.

Remarque :

  • On peut forcer la personnalisation d'une formule dans une colonne du tableau structuré par rapport aux autres formules de la colonne ainsi :
    1. Modifier la formule, valider => Excel recopie automatiquement la formule (écrase les anciennes formules dans toutes les autres cellules de la colonne).
    2. Utiliser la balise active "Options de correction automatique" pour annuler cette recopie en utilisant "Annuler la colonne calculée" (Arrêter la création automatique de colonnes calculés permet de désactiver cette recopie automatique dans Excel => ré-activable via les options de Correction automatique>Mise en forme automatiques au cours de la frappe).
Menu de la balise active "Options de correction automatique" apparaissant en cas de modification d'une formule d'une des cellules d'une colonne
  • Dans ce cas, Excel affichera un triangle vert en haut à gauche de la cellule indiquant que la formule de cette cellule est incohérente par rapport aux autres formules de la colonne.
    En plaçant le pointeur de souris sur cet indicateur, Excel proposera d'Ignorer l'erreur (faire disparaitre l'indicateur vert) ou de Restaurer la formule (la regénérer pour qu'elle soit cohérente par rapport aux autres formule).
    Fenêtre pop-up quand on pointe la marque d'erreur (triangle vert en haut à gauche)
  • Attention : En personnalisant une formule, la recopie automatique est désactivée pour toute la colonne.
    • Dans ce cas (recopie désactivée pour la colonne) si l'on modifie une formule de la colonne, la balise active "Options de correction automatique" permet de recopier cette formule sur toute la colonne (réactivation de la recopie automatique).
      Menu de la balise active "Options de correction automatique" apparaissant en cas de modification d'une formule d'une des cellules d'une colonne quand la recopie automatique est désactivée pour cette  colonne

Liaison entre classeurs

  • Une formule utilisant une référence structurée pointant vers un autre classeur renverra l'erreur #REF! tant que le classeur cible n'est pas ouvert.

Exemples de mise en œuvre spécifiques

Utilisation dans les listes déroulantes générées par l'outil Validation de données

  • On ne peut pas utiliser une formule utilisant des références structurées comme source pour les valeurs d'une liste (par exemple =TabVentes[Desig]).
  • La formule =INDIRECT("TabVentes[Desig]") est utilisable mais n'est pas dynamique en cas de renommage du tableau ou des colonnes utilisées.
  • La meilleure solution est d'utiliser un nom comme conteneur intermédiaire (via le ruban Formules>Définir un nom).
    • Le nom sera accepté par l'outil Validation (Astuce : utiliser le raccourcis F3 pour afficher la liste des noms générés quand on complète la boîte de dialogue Validation de données).
    • La plage utilisée par le nom sera mise à jour dynamiquement en cas d'ajout/suppression d'éléments dans le tableau structuré et en cascade, la liste affichée par l'outil de validation sera elle aussi mise à jour.

Utilisation dans les graphiques

  • Même si les références structurées ne sont pas conservées mais converties en références classiques (remarquer dans la barre de formule les références de la fonction SERIE correspondante), le graphique sera bien dynamique en cas d'ajout de lignes.

Utilisation avec les compléments PowerPivot et PowerQuery

  • Pour utiliser des données dans PowerPivot ou PowerQuery, lors de l'importation des données, Excel devra convertir la plage en tableau structurée.
  • Quand PowerQuery renvoie des données dans Excel sous forme de tableau, il s'agira de tableau structuré.

Implémentation en VBA

Les tableaux structurés sont des objets appelés ListObjects, voici quelques exemples de syntaxe pouvant être utile :

' Collection Tableaux / Objet Tableau
' ===================================
' Création
    ActiveSheet.ListObjects.Add(xlSrcRange, Range("A1").CurrentRegion, , xlYes).Name = "TabVentes"
' ou
  Dim tbl As ListObject
  Set tbl = ActiveSheet.ListObjects.Add(xlSrcRange, Range("A1").CurrentRegion, , xlYes)
  tbl.Name = "TabVentes"                       ' On renomme le tableau
  tbl.DisplayName = "TabVentes"                ' Par précaution on le modifie aussi
  
' Manipulations diverses
Set tbl = ActiveSheet.ListObjects("TabVentes") ' Accès au tableau
 'tbl.Refresh                                  ' Actualisation
   tbl.Resize Range("A1:G4")                   ' Redimensionnement
   tbl.Resize tbl.Range.Resize(tbl.Range.Rows.Count, tbl.Range.Columns.Count + 2) ' Redimensionnement
   'tbl.Unlist                                 ' Convertion en plage
   'tbl.Delete                                 ' Supprimer le tableau
' Test d'exitance du tableau
   On Error Resume Next
   Set tblA = ActiveSheet.ListObjects("TabVentesA") ' Attention d'avoir bien déclaré tblA
   On Error GoTo 0 ' Réinitialisation gestion d'erreur
   If tblA Is Nothing Then MsgBox "Pas de TabVentesA"

' Manipulations des éléments du tableau
' =====================================
   tbl.ListRows.Add 2 ' Ajoute une ligne apres la 1ère ligne de données (position 2)
   tbl.ListRows.Add   ' Etendre le tableau d'une ligne

' Ecrire en ligne 2 en colonne "Desig" (solutions équivalentes)
   tbl.ListRows(2).Range.Columns(tbl.ListColumns("Desig").Index).Value = "Chaise"
   tbl.ListColumns("Desig").DataBodyRange.Rows(2).Value = "Chaise" ' DataBodyRange=zone des données
   tbl.ListColumns(2).DataBodyRange.Rows(2).Value = "Chaise"
   tbl.ListColumns(2).Range.Rows(3).Value = "Chaise"
   tbl.DataBodyRange.Cells(2, 2).Value = "Chaise"
   tbl.Range(3, 2).Value = "Chaise"
 
' Ajouter une colonne calculée  
   Dim col As ListColumn
   Set col = tbl.ListColumns.Add(Position:=4)   ' Création et position
   col.Name = "Total"                           ' Nommage
   col.DataBodyRange.Formula = "=[@Qt]*[@Prix]" ' Ajout de la formule

' Suppression
   tbl.ListRows(2).Delete            ' Supprimer la 2ème ligne
   tbl.ListColumns(5).Delete         ' Supprimer la 5ème colonne
   tbl.ListColumns("Test").Delete    ' Supprimer la colonne "Test"

' Informations
   Debug.Print tbl.ListColumns.Count ' Nombre de colonnes
   Debug.Print tbl.ListRows.Count    ' Nombre de lignes (sans le titre)

' Divers
   tbl.ShowTotals = True             ' Activation de la ligne de synthèse
   
' Mise en forme
   tbl.HeaderRowRange.Interior.Color = vbGreen         ' Ligne de titre en fond vert
   tbl.DataBodyRange.Interior.Color = RGB(300, 0, 300) ' Lignes de données avec un fond
   tbl.TotalsRowRange.Interior.Color = vbYellow        ' Ligne de synthèse en fond jaune

Merci pour votre attention bienveillante.

Article intéressant ?

Cliquez sur une étoile pour noter cet article !

Note moyenne 0 / 5. Nombre de votes : 0

Aucun vote pour l'instant ! Soyez le premier à noter ce post.

Nous sommes désolés que cet article ne vous ait pas été utile !

Améliorons cet article !

Dites nous comment nous pouvons améliorer cet article ?

Publications similaires

Laisser un commentaire

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