VBA et tableaux (ListObjects)

Bonjour,

Y a t'il quelque part ici un cours sur l'utilisation des références structurées (tableaux - ListObjects) en VBA ? avec notamment :

  • ajouter une ligne en fin de tableau
  • rechercher un élément dans une colonne
etc.

Merci d'avance !

Michel

Bonjour,

Un exemple d'ajout de ligne en fin de tableau avec recherche de la première ligne vide et remplissage de la première colonne du tableau en supposant qu'elle se nomme "colonne1"

       With Sheets("Tableau de suivi").ListObjects("tableau1")
            'ajout d'une ligne vierge à la fin du tableau
           .ListRows.Add
            'indice dans la feuille, de la ligne correspondant à la première cellule vide du premier champ du tableau
           i = .ListColumns("Colonne1").Range.Find("", SearchDirection:=xlNext).Row
            'indice relatif dans l'objet tableau1, de la ligne correspondant à la première cellule vide du premier champ du tableau
           i = i - .HeaderRowRange.Row
            'remplissage ligne
           .ListColumns("Colonne1").DataBodyRange.Rows(i).Value = 1
       End With
     

A noter que la méthode ListRows.Add est paramétrable au niveau de la position d'insertion de la ligne. Par défaut, c'est la dernière.

Bonjour Steelson, bonjour à tous,

Je trouve deux aspects positifs aux Tableaux Excel, c'est que Excel insère un nom automatiquement dans le gestionnaire de noms, nom qui correspond au .DataBodyRange de l'objet ListObject constitué par le Tableau, mais utilisable en VBA dans les mêmes conditions qu'un nom de plage (et dynamique de surcroît). Et d'autre part, toute affectation sur la première ligne qui suit le Tableau sera intégrée au Tableau.

Ainsi :

    With [Tableau1]
        n = .Rows.Count + 1
        For k = 1 To .Columns.Count
            .Cells(n, k) = .....
        Next k
    End With

permet d'affecter les valeurs d'une nouvelle ligne au Tableau sans aucune référence autre que le nom !

Cordialement.

Bonjour à toutes et tous,

Bon, je vais résumer : Je suis au Menetou-Salon (blanc), ce soir c'est Champagne et Moulin-à-Vent, et plus (un Armagnac serait apprécié !) ...

Alors si on doit parler Listobjects (avec VBA), je suis preneur, mais on patiente un peu.

Bon réveillon à toutes et tous.

Cdlt.

Salut Jean-Eric !

Saches que je regarde toujours avec un peu d'attention ton code relatif aux ListObjects quand je tombe dessus, domaine qui m'était quelque peu étranger il y a guère...

Mais tes raisons sont on ne peut plus louables ! Bonne fin d'année...

Merci pour vos premiers conseils.

@thev, merci pour avoir répondu à mes 2 questions avec addet find(mais pourquoi systématiquement ajouter une nouvelle ligne vierge ?), j'ai pu adapter comme ceci :

        With Sheets("BdD").ListObjects("Evts")

            Set ici = .ListColumns("date_evts").Range.Find(cel.Offset(-2, 0), SearchDirection:=xlNext)
            If ici Is Nothing Then
                .ListRows.Add
                i = .ListColumns("date_evts").Range.Find("", SearchDirection:=xlNext).Row
            Else
                i = ici.Row
            End If
            i = i - .HeaderRowRange.Row
            .ListColumns("date_evts").DataBodyRange.Rows(i).Value = cel.Offset(-2, 0)
            .ListColumns("motif").DataBodyRange.Rows(i).Value = Left(bouton.Caption, InStr(bouton.Caption, " : "))

        End With

J'avais déjà utilisé ActiveSheet.ListObjects(1).DataBodyRange , mais ce que je recherche toujours c'est avoir une écriture VBA plus propre. Et je pense que les excelistes ont toujours peur des tableaux (comme des TCD) ! Donc merci pour les inputs futurs ... je vais laisser ouvert le post.

                        If ActiveSheet.ListObjects(1).ListRows.Count > 0 Then
                            ' copie de l'original
                            ActiveSheet.ListObjects(1).DataBodyRange.Copy
                            ' collage dans destinataire
                            Destinataire.Activate
                            Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
                        End If

bonsoir,

Steelson a écrit :

(mais pourquoi systématiquement ajouter une nouvelle ligne vierge ?),

En fait, j'avais appliqué ce code à un tableau dont la première ligne était systématiquement remplie. Pour un tableau dont la première ligne est vierge, il est mieux effectivement de recourir à ton adaptation, ce qui évite de laisser à chaque fois une ligne vierge dans le tableau

A noter que la propriété DataBodyRange ne correspond qu'aux données du tableau, c'est à dire qu'elle ne comprend ni la ligne d'entête, ni la ligne total éventuelle.

Bonjour et bonne année,

Comme souhaité j'envoie un exemple pour :

1 - rechercher une valeur dans un tableau

2 - insérer une ligne en bas d'un tableau

Si tu as d'autres questions, n'hésite pas.

Cdlt.

Merciiii Jean-Eric c'est parfait (il y a juste une erreur de colonne dans la recherche mais je vais corriger ...)


hum ... je veux bien mettre +2 mais cela ne serait pas logique !!

Set loCol = .ListColumns(rCell.Column - (.HeaderRowRange.Cells(1).Column) + 1)

ton avis d'expert ?

Re,

Il n'y a pas d'erreur dans la recherche !?

Ou alors, j'ai pas récupéré du week-end...

Cdlt.

Non, mais j'ai trouvé l'erreur : indice 0 au lieu de 1

Set loCol = .ListColumns(rCell.Column - (.HeaderRowRange.Cells(0).Column) + 1)

un effet induit du we sans doute !

Re,

Nous ne parlons peut-être pas de la même chose.

Dans ce fichier, identique au premier, j'ai mis en évidence le résultat.

Si tu recherches la valeur 118, le message retourne bien le mois de juil et sa ligne dans le tableau, soit 2.

Cdlt.

Ah yaissse, ouais, en effet, j'ai la berlue,

j'ai centré les valeurs sur les colonnes pour y voir clair

Merci bcp

Rechercher des sujets similaires à "vba tableaux listobjects"