Trouver l'index d'une colonne

TCHIS

XLDnaute Occasionnel
Bonjour à tus et à toutes
Excusez moi vous saurez comment trouvé l'index d'une colonne ?
En l'occurrence il s'agit de la dernière colonne du tableau dans le fichier joint si dessous
 

Pièces jointes

  • Test.xlsm
    125.2 KB · Affichages: 4

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Tchis, Flam,
En VBA on peut faire :
VB:
DerCol = Cells(1, Columns.Count).End(xlToLeft).Column
Mais s'agissant d'un tableau structuré, il vaut mieux faire :
Code:
NbCol = [Tbl_Datas].ListObject.ListColumns.Count
qui permet de s'affranchir des numéros de colonnes.
( Quel que soit l'emplacement du tableau, NbCol sera toujours le même puisque référencé au tableau lui même )
Ensuite les manipulations sont plus simples :
Code:
Lire cellule:
ValCell = [Tbl_Datas].Item(x,NbCol)
Ecrire cellule :
[Tbl_Datas].Item(Ligne,Colonne) = Valeur
x étant le numéro de ligne à lire.
Ou encore mieux, on ne s'occupe pas de savoir où est la colonne :
VB:
Lire:
ValCell = [Tbl_Datas[Commentaires22]].Item(x)
Ecrire:
[Tbl_Datas[Commentaires22]].Item(x) = Valeur
tout est référencé par rapport au nom de la colonne où qu'elle soit sans le tableau. Si une colonne est ajouté, ou le tableau déplacé, il est inutile de reprendre le code. De plus celui ci est plus visible.
 
Dernière édition:

TooFatBoy

XLDnaute Barbatruc
En VBA on peut faire :
VB:
DerCol = Cells(1, Columns.Count).End(xlToLeft).Column
Mais s'agissant d'un tableau structuré, il vaut mieux faire :
Code:
NbCol = [Tbl_Datas].ListObject.ListColumns.Count
qui permet de s'affranchir des numéros de colonnes.
( Quel que soit l'emplacement du tableau, NbCol sera toujours le même puisque référencé au tableau lui même )
Pardon camarade, mais je crois que ça donne le nombre de colonnes du tableau structuré, et non "l'index", dans la feuille, de sa dernière colonne. 🤔
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re,
@TCHIS, pour approfondir le traitement sur tableaux structurés, essayez cette macro dans un module classique :
VB:
Sub Essai()
DernièreColonne = [Tbl_Datas].ListObject.ListColumns.Count
DernièreLigne = [Tbl_Datas].ListObject.ListRows.Count
' Lire la 4eme valeur de la colonne Etat
ValCell = [Tbl_Datas[Etat]].Item(4)
' Ecrire première cellule de la colonne Commentaires22
[Tbl_Datas[Commentaires22]].Item(1) = "Commentaire"
' Ecrire cellule dernière ligne, dernière colonne
[Tbl_Datas].Item(DernièreLigne, DernièreColonne) = "FIN"
' Relire même cellule
ValCellFin = [Tbl_Datas].Item(DernièreLigne, DernièreColonne)
End Sub
Vous obtiendrez :
1677334083487.png
 

patricktoulon

XLDnaute Barbatruc
re
non ce n'est pas une histoire de crochet
en fait c'est très simple
supposons que j'ai 2 feuilles
je suis sur la feuille2
mon tableau structuré est sur la feuille1
je ne peux pas faire msgbox ListObjects("tbl_data").listcolumns.count
je suis obligé de préciser le parent devant "ListObjects"
car la collection listobjects est membre de worksheet ou sheets

tandis qu'avec range comme c'est un name et qu'il ne peut y en avoir qu'un
vba ne peut pas se tromper ou que l'on soit dans le classeur car les names ont pour parent l'application

c'est tout bête
et si malgré tout je veux travailler en lisobject ben c'est simple
with range("tbl_data").listobject
msgbox .listcolumns.count
end with


et oui ce qui est drole c'est que le membre "ListObject"(au singulier) est membre de range
ho oui c'est drole non

voila voila
au revoir au revoir
 
Dernière édition:

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re,
je suis obligé de préciser le parent devant "ListObjects"
Oui, mais vous n'avez pas à la préciser après, ce qui revient au même.
Donc on a le choix entre :
ListObjects("tbl_data").listcolumns.count
[Tbl_Datas].ListObject.ListColumns.Count

Perso, je trouve la seconde plus "lisible" car elle conserve la même syntaxe de "poupées russes" que les autres formules, par ex : [Tbl_Datas[Etat]].Item(4)
 

Discussions similaires

Réponses
12
Affichages
562
Réponses
15
Affichages
362

Statistiques des forums

Discussions
312 209
Messages
2 086 267
Membres
103 168
dernier inscrit
isidore33