Variabilisation du nom du tableau et ses colonnes

Bonjour à tous

Je fais appel à vous car j’ai encore des problèmes d’écriture de code, et plus exactement de syntaxe.

J’ai développé du code pour créer un graphique, et j’obtiens les résultats désirés.

Cependant dans ce code j’ai mis le nom de la table et des variables en « dur ».

Je voudrais remplacer les noms en « dur » par des noms de variables, mais je ne parviens à trouver la syntaxe adéquate.

Voici ce qui fonctionne en « dur », c’est-à-dire avec le nom de la Table, et avec le nom des colonnes dans la table.

ARF_Graphique001.SetSourceData ARF_FE_Entree_Sht. _                                                      Range("ARF_Excursion_Tab[Activité],ARF_Excursion_Tab[Participants]")

Je voudrais trouver la syntaxe pour écrire l’équivalent de:

ARF_Graphique001.SetSourceData ARF_FE_Entree_Sht. _                                                      Range(VariableNomDuTableau[VariableActivite], VariableNomDuTableau[ [VariableParticipants])

Bien sur, le contenu de VariableNomDuTableau, de VariableActivite, VariableParticipants aura été chargé auparavant.

C’est ça l’idée.

Si quelqu’un pouvait m’aider j’en serais très reconnaissant.

Merci d’avance

Bonsoir,

s'il n'y a qu'un seul tableau sur la feuille alors vous pouvez le sélectionner par ListObjects(1).

Après pour les colonnes il faut soit connaitre leur position, mais du coup le tableau doit être "fixe", soit connaitre leur intitulé qui alors permet de mélanger les colonnes mais pas modifier ces derniers.

@ bientôt

LouReeD

Bonjour,

Ce n'est pas trop possible, du moins dans le sens que vous décrivez.

Au niveau de la programmation, il faut bien comprendre qu’au final ce que vous voulez faire revient à « déplacer en amont » le problème : il faudra bien, à un moment, remplir vos variables. Donc quel intérêt avez-vous à variabiliser un élément trop spécifique ? Toutes les plages nommées ont des noms différents.

Passé cela, il y a quand même de rares cas où l’on peut avoir besoin de nommer une variable comme ce qu’elle représente. Dans ce cas une astuce consiste à créer un dictionnaire : clé = le nom de la variable (string) : valeur = la variable (dans votre cas une Range).

On peut ensuite l’appeler comme cela :

ARF_Graphique001.SetSourceData monDict(« monTableau »)

On ne pourra pas faire beaucoup mieux, et si vous voulez préciser les colonnes, il faudra faire une fonction qui se charge d’aller les chercher. Bref c’est compliqué. Comme indiqué par @LooReed.

Pour initialiser le dictionnaire, vous pouvez utiliser la macro ci-dessous :

' variable globale
Dim mesVars As Object

Sub IniDict()
    Set mesVars = CreateObject("Scripting.Dictionary")
    For Each n In ActiveWorkbook.Names
        Set mesVars(n) = n.RefersToRange
    Next n
End Sub

Cependant encore une fois, dans 90 % des cas vous auriez plutôt intérêt à faire une boucle sur les objets (par exemple pour les tableaux, ListObjects), plutôt que de sur-paramétriser le code, qui au final va vous faire perdre plus de temps que vous ne pensez en gagner.

Après recherche sans avoir essayé :

ARF_Graphique001.SetSourceData ARF_FE_Entree_Sht.Range(VariableNomDuTableau[VariableActivite], VariableNomDuTableau[VariableParticipants])

pourrait s'écrire :
ARF_Graphique001.SetSourceData ARF_FE_Entree_Sht.Union(ListObjects(1).ListColumns("Activité").DataBodyRange, ListObjects(1).ListColumns("Participants").DataBodyRange)
où le nom des colonnes est écrit en dur ce qui fait que ces colonnes peuvent changer de place dans le tableau

ou bien :
ARF_Graphique001.SetSourceData ARF_FE_Entree_Sht.Union(ListObjects(1).ListColumns(2).DataBodyRange, ListObjects(1).ListColumns(5).DataBodyRange)
où la place des colonnes est écrite en dur mais les intitulés peuvent être modifiés sur la feuille.

Je part ici du principe qu'il n'y a qu'un tableau sur la feuille donc dans la collection des tableaux de la feuille c'est le numéro 1.

@ bientôt

LouReeD

Bonjour à tous

Merci pour m'avoir consacré de votre temps.

Je ne réussis pas à écrire la bonne syntaxe.

C'est dommage car je voulais utiliser le même code pour traiter une vingtaine de tables différentes, avec parfois des numéros et des noms de colonnes différents. Je pense que je vais devoir probablement utiliser une table intermédiaire afin de pouvoir automatiser complètement les traitements.

Merci encore.

Zar78

re,

avez-vous un fichier pour tester ?

Sub Tableaux()

     With ActiveSheet.ChartObjects(1).Chart
          i = WorksheetFunction.RandBetween(1, 3)
          Range("W1").Value = i

          Select Case i
               Case 1: .SetSourceData Source:=Union(Range("Tabel45[A]"), Range("Tabel45[C]"))
               Case 2: .SetSourceData Source:=Union(Range("Tabel46[A]"), Range("Tabel46[B]"))
               Case 3: .SetSourceData Source:=Union(Range("Tabel47[B]"), Range("Tabel47[A]"))
          End Select
     End With

End Sub
7zar78.xlsb (23.40 Ko)

Bonjour Bart

Merci pour l’exemple, qui me servira surement dans d’autres circonstances.

Dans l’exemple le nom des tables est écrit en « dur » dans le code. (« Tabel45 » …)

Dans le code que j’écris, je ne connais pas le nom des tables et des colonnes. C’est pour cette raison que j’utilise des variables. Ainsi un seul et unique code servira à traiter une vingtaine de tables.

Et c’est aux programmes appelant le code de fournir le nom de la table et le nom des colonnes à traiter.

En espérant que mon explication apportera un peu plus de clarté.

Merci encore.

Zar78

Bonjour,

Si vous ne connaissez pas le nom des tables, ne vous embetez pas à essayer de les mettre dans des variables. Suivez l'instruction de @LooReed :

Worksheet.ListObjects property (Excel) | Microsoft Learn vous renvoie toutes les tables d'une feuille. C'est une liste. Il suffit de boucler dessus pour les parcourir une à une. Je ne sais pas, si vos tables ont des noms génériques pour les filtrer (par exemple, vous souhaitez traiter seulement les tables dont le nom commence par "VBA_tbl"). On écrit le code comme ça :

Sub mesTables()
  Dim i as Long
  With ActiveSheet.ListObjects
    For i = 1 to .Count - 1
      If Left(.Item(i).Name, Len("VBA_tbl")) = "VBA_tbl" Then FaireQuelqueChose
    Next i
  End With
End Sub

re,

déjà 2 versions dans ce fichier. Vous avez quoi en tête pour vos variables ?

7zar78.xlsb (23.87 Ko)

Bonjour,

comme dit plus haut il y aura au moins une donnée en "dur".
Si vos tableaux sont fait sur le même modèle, alors pas de soucis, avec le fichier de BsAlv, voici mon code sans données "en dur" sauf la position des deux colonnes à prendre en compte.

Ici le code navigue aléatoirement sur les trois tableaux de la feuille quelque soit leur nom, mais si votre fichier en contient qu'un par feuille alors il suffira de mettre 1 au lieu de i et supprimer le tirage au sort de i.

Le code :

Sub Tableaux()
    Dim ColUne As Range, ColDeux As Range
    i = WorksheetFunction.RandBetween(1, 3)
    Set ColUne = ActiveSheet.ListObjects(i).ListColumns(1).DataBodyRange
    Set ColDeux = ActiveSheet.ListObjects(i).ListColumns(3).DataBodyRange
    ActiveSheet.ChartObjects(1).Chart.SetSourceData Source:=Union(ColUne, ColDeux)
End Sub

A la place de ActiveSheet vous pouvez mettre Sheets(J) où J est le numéro d'index de la feuille comme cela 10 feuille de l'index 11 à 20 vous faites une boucle For J=10 to 20, il faut peut-être activer la feuille avant avec un Sheets(J).Activate mais c'est à vérifier.

@ bientôt

LouReeD

Merci pour vos efforts à tous.

Je me suis mal expliqué, et j'ai mal précisé la logique du traitement.

Pour résumer, le code ne connait pas le nom de la table et le nom des colonnes, et il n' a pas à les connaitre , ni à les rechercher, …. on les lui donne en paramètres.

Pour mettre au point le code qui crée un graphique, j’ai mis les noms en « dur », mais maintenant que cela fonctionne, il faut passer à la phase « industrielle ».

Le code reçoit les paramètres :

VariableNomDuTableau

VariableActivite

VariableParticipants

En « dur » le code suivant fonctionne

ARF_Graphique001.SetSourceData ARF_FE_Entree_Sht. _ 
Range("ARF_Excursion_Tab[Activité],ARF_Excursion_Tab[Participants]")

En « industrielle », je veux remplacer les noms en "dur" par les paramètres , et voilà ce que je voudrais , mais la syntaxe ne va pas. J'ai fait des tas d'essais avec des parenthèses, des crochets , des #, des &..... en vain.

ARF_Graphique001.SetSourceData ARF_FE_Entree_Sht. _                                  Range(VariableNomDuTableau[VariableActivite], VariableNomDuTableau[ [VariableParticipants])

C’est juste ça mon souci. Trouver la syntaxe qui va bien.

Merci encore.

Bien cordialement.

Zar78

Mais @zar78, on a bien compris cela. Mais quand vous procédez de manière industrielle, vous utilisez toujours les mêmes noms de colonne non ? sinon je n'imagine pas le code…

Enfin bref, moi je ne vois pas comment vous voulez mettre dans des variables des infos inaccessibles.

Pour info pour concaténer des strings, c'est comme ceci :

ARF_Graphique001.SetSourceData _ 
ARF_FE_Entree_Sht. Range( _ 
  VariableNomDuTableau &"[" _
  & VariableActivite & "]," _
  & VariableNomDuTableau _ 
  & "[" & VariableParticipants & "]")

re, salut tout le monde

la version V3

12zar78.xlsb (26.42 Ko)

PS. cela fonctionne avec "Zar78_V3" dans un module ordinair mais ne fonctionne pas avec "Zar78_V3" dans le module d'une feuille

Merci Saboh12617

Avec votre syntaxe, tout fonctionne parfaitement et j’ai les résultats escomptés.

Bonne soirée à tous.

Bien cordialement.

Zar78

Encore merci à tous.

Je vais tenter de fermer le post.

re,

Avec ma macro paramétrisée, je crois que c'est plus pratique et moins de risques d'erreurs d'écriture + gestion d'erreurs, on donne le nom du tableau structuré (comme çà, le nom de la feuille est aussi connue), on donne les noms des 2 colonnes + le graphique.

Bonjour à tous,

Bien d'accord avec toi @BsAlv, c'est exactement le type de code que j'avais en tête, mais bon l'op est plus que convaincu de sa méthode alors bon… On attendra le prochain post 🤭

Bonne journée

Rechercher des sujets similaires à "variabilisation nom tableau colonnes"