Voyager dans un tableau structré

Bonsoir à tous,

Je travaille en ce moment sur des macros avec tableau structurés. Je n'ai pas de réel soucis pour voyager et utiliser les lignes, colonnes, range, databodyrange dans ces tableaux mais pour les cellules je m'y perds un peu...

Je vois beaucoup de choses différentes en code et j'ai beaucoup de mal à comprendre l’intérêt ou le but de l'un ou de l'autre. Cells / Item / Index / Adress...

En général je voyage avec Cells ou Range sur du VBA normal, mais comment on faire en structuré. Exemple ci-dessous

AB
1ClientNom
2AA11
3BB22
4CC33

En standard pour pointer sur 22 je fais Range ("B3") ou Cells (3,2) mais en tableau structuré en passant par le nom des colonnes comment cela se passe ?

En gros, le but est dans la macro d'ajouter une ligne en fin de tableau et de la compléter, j'essaie de faire évoluer un de mes tout premiers codes.

'Ajout des informations
Range("Table_Utilisateur").ListObject.ListRows.Add
DernièreLigne = Range("Table_SP").ListObject.ListRows.Count
Offre.Range("A" & DernièreLigne & ":R" & DernièreLigne).Interior.ColorIndex = 2
Offre.Cells(DernièreLigne, "S").Interior.Color = RGB(217, 217, 217)
Offre.Range("A" & DernièreLigne & ":S" & DernièreLigne).Borders.LineStyle = 1
Offre.Cells(DernièreLigne, "A") = UT1_TextBox_Numéro_Offre
Offre.Cells(DernièreLigne, "B") = UT1_TextBox_Client

                                 

Merci pour votre aide.

Range("Table_SP").ListObject.ListRows.Add
DernièreLigne = Range("Table_SP").ListObject.ListRows.Count                                    Range("Table_SP").ListObject.DataBodyRange(DernièreLigne, [Numéro d''offre]) = 5

Le but est de remplir les cases de la dernière ligne, colonne par colonne mais via le nom, afin qu'en cas d'ajout de colonne cela suive.

En fait je cherche juste à remplacer la colonne C de ce code:

Offre.Cells(DernièreLigne, "C") = UT1_ComboBox_Catégorie

Par le nom de la colonne de mon tableau: Tableau structuré -> Table_1 / Colonne -> Révision

Le but est de s’affranchir du nom de l'onglet (Offre) et d'avoir des colonnes qui suivent en cas d'insertion d'autre colonnes.

Bonjour,

Pour travailler sur les cellules d'un tableau structuré, le plus parlant et le plus invariant est d'utiliser le nom des colonnes :

With Range("Table_Utilisateur")
  Set ligne = .ListObject.ListRows.Add : i = ligne.index
  .ListColumns("Client").DataBodyRange(i) = UT1_TextBox_Client
End  With 

Voir mon tutoriel sur les instructions du tableau structuré

https://forum.excel-pratique.com/astuces/tableau-structure-instructions-vba-specifiques-a-cet-objet-...

bonjour Heelflip,JExcel2F,

un essai

Sub Test()
     With Range("Table_Utilisateur").ListObject     'votre tableau
          iClient = .ListColumns("Client").Index     'N° de cette colonne
          iNom = .ListColumns("Nom").Index

          With .ListRows.Add.Range           'la plage d'une nouvelle ligne
               .Interior.ColorIndex = 2
               .Cells(1, "S").Interior.Color = RGB(217, 217, 217)
               .Borders.LineStyle = 1
               .Cells(1, iClient).Value = UT1_TextBox_Numéro_Offre     'en 2 fois
               .Cells(1, iNom).Value = UT1_TextBox_Client
               .Cells(1, iClient).Resize(, 2).Value = Array(UT1_TextBox_Numéro_Offre, UT1_TextBox_Client)     'en 1 fois
          End With
     End With
End Sub

EDIT: aussi salut Thev

Bonjour,
Pour le principe.
Adapter pour les TextBox.
Cdlt.

Public Sub InsertRowInTable()
Dim tbl As ListObject, ws As Worksheet, r As Range

    Set tbl = Range("T_").ListObject
    Set ws = tbl.Parent

    With tbl
        If .InsertRowRange Is Nothing Then
            Set r = .HeaderRowRange.Cells(1).Offset(.ListRows.Count + 1)
        Else
            Set r = .InsertRowRange.Cells(1)
        End If

        With r
            .Value = ws.Cells(5, 6).Value
            .Offset(, 1).Value = ws.Cells(5, 7).Value
            .Resize(, tbl.ListColumns.Count).Interior.Color = vbYellow
        End With
    End With

End Sub

OK ça y est je pense avoir compris. Vous utilisez le .Index pour retourner le N°. C'est ce que je ne comprenais pas.

BsAlv, sympa ce code, mais de mémoire le Array ne fonctionnera que si on a toujours le même nombre de colonne, si une s'ajoute cela ne fonctionnera plus.

thev, merci pour ton lien ;) . Je teste ta formule qui est plus adapté pour mon code je pense, mais deux choses:

Le i me renvoie à la dernière ligne remplie donc pas celle créée mais celle juste au dessus, j'avais le même soucis avant j'ajoutais un +1.
le code plante au .ListColumns avec un propriété ou méthode non gérée par cet objet, il manquait le .ListObject au début j'ai donc modifié comme cela:

With [Table_Utilisateur] .ListObject
  Set ligne = .ListRows.Add : i = ligne.index
  .ListColumns("Client").DataBodyRange(i) = UT1_TextBox_Client
End  With 

Ha oui j'ai aussi du mal avec les colonnes avec des caractère spéciaux, j'ai vu dans le tuto Excel Pratique qu'on mettait les apostrophes devant mais cela plante :(

Exemple pour la colonne nommée "Numéro d'offre" -> .ListColumns("Numéro d''offre")

Sub Test()
     Dim LO, i
     Set LO = Range("Tabel1").ListObject     'votre tableau
     With LO
          iClient = .ListColumns("Client").Index     'N° de cette colonne
          iNom = .ListColumns("Nom").Index
          i = .ListRows.Count                'nombre de lignes

          With .ListRows.Add.Range           'la plage d'une nouvelle ligne
               .Interior.ColorIndex = 2
               .Cells(1, 3).Interior.Color = RGB(217, 217, 217)
               .Borders.LineStyle = 1
               .Cells(1, iClient).Value = "teste client"     'avec cet index au début
               .Cells(1, iNom).Value = "teste nom"
               .Cells(1, LO.ListColumns("Numéro d'offre").Index).Value = 123456789     'ici calculer l'index dans les parenthèses
               .Cells(1, 1).Value = i + 1
          End With
     End With
End Sub

le Array ne fonctionnera que si on a toujours le même nombre de colonne

sinon, on le fait un par un

14heelflip.xlsm (17.23 Ko)

Bonjour,

Pour ce qui concerne le nom de colonne :

ListColumns("Numéro d'offre")

cette syntaxe est correcte sauf qu'il faut vérifier qu'il n'existe pas de caractères blanc avant ou après. La bonne instruction pourrait par exemple être :

ListColumns("Numéro d'offre ")

Bonjour à tous
Voici une proposition toute simple d'utilisation avec l'exemple donné par Heelflip, qui est facile à adapter.
Cliquer sur le bouton "Nouvelle saisie" après avoir rempli les cellules H2 et H3.
Pour les modifications: rechercher en J2 le client, puis en colonne K apporter les modifications.
Cdt
Papy Henri

12heelflip-test.xlsm (19.38 Ko)

Salut à tous,

Un grand merci pour toutes vos propositions, j'ai bien compris désormais comment on voyage dans un TS et mon code fonctionne bien avec les nom des colonnes, que ce soit pour l'insertion de données, les recherches etc. Cela permet un code fiable en cas de modification du tableau. C'est top.

J'ai juste une dernière question, lorsque je fais une recherche et que je viens récupérer la ligne, c'est celle de la feuille, quand j'utilise derrière la ligne via databodyrange, je fais -1 pour retirer l'entête, n’y aurait-il pas une solution existante pour transformer le N° de ligne feuilles en N° de ligne tableau ?

re,

ligne de la feuille - ligne du "range" du tableau (listobject.range.row) oubien ligne de l'entête (listobject.headerrowrange.row)

OK donc cela confirme ce que je pensais, on doit faire la soustraction. Merci encore pour votre aide

Il y a une chose que je n'ai pas encore capté, j'essaie de changer la couleur une ligne du tableau.

J'ai tenté un .ListRows(TS_Ligne).Interior.Color = RGB(198, 224, 180) mais sans succès, j'ai loupé quelque chose dans vos explications ?

.ListRows(TS_Ligne).range.Interior.Color = RGB(198, 224, 180)

Évidement. Coder le soir c'est bien parce qu'on est au calme mais la fatigue n'aide pas toujours... Merci BsAlv

Rechercher des sujets similaires à "voyager tableau structre"