Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2010 [RESOLU]Numero colonne entete tableau structuré

cp4

XLDnaute Barbatruc
Bonjour,

J'ai ce type de tableau structuré, je voudrais mettre dans une variable le numéro de colonne des entêtes.
Afin de pouvoir le réutiliser dans une procédure car le tableau pourrait évoluer (ajout de colonnes à l'intérieur du tableau).


En vous remerciant par avance.

ps: initialement, il n'y avait pas de colonne Monnaie

Bonne soirée à vous.

Edit: Je me suis noyé dans un verre d'eau. Finalement, j'ai trouvé
VB:
Range("tableau1" & "[crédit]").Column
 
Dernière édition:
Solution
Comme tu remplaçais nbCol je pensais que c'était la ligne NbCol = [Tableau1].Columns.Count qui plantait.

Par ailleurs quelle différence fais-tu entre ces 2 lignes :
Code:
'                  Col = Intersect(.HeaderRowRange, Target.EntireColumn).Value
         Col = Intersect(Target.EntireColumn, .HeaderRowRange)
???
Si ce n'est que tu inverses, et enleves le .Value qui donne explicitement la propriété voulue.
Celle d'origine fonctionne et ôte toute ambiguïté...

Ma proposition faisait 3 lignes :
VB:
    With ActiveWorkbook.Worksheets("Feuil1").ListObjects(1)
        Debug.Print Intersect(.HeaderRowRange, ActiveCell.EntireColumn).Value
    End With
Et oui, il faut la compléter en t'assurant être dans le tableau.
Je ferais...

cp4

XLDnaute Barbatruc
Eh, non! c'est de la triche. Tu passes le tableau structuré à un Array. Ce n'est pas mon objectif.
 

laurent950

XLDnaute Accro
Eh, non! c'est de la triche. Tu passes le tableau structuré à un Array. Ce n'est pas mon objectif.
Je pense pas ! c'est bien le tableau structuré que j'ai récupéré cp4
c'est le tableau structuré :
Dim Tableau1 As ListObject
est pas un array



Dans le cas ou il y a plusieurs tableau structuré sur une même feuille excel :
ActiveWorksheets("Feuil1").ListObjects(1) = c'est qu'elle tableau si il y en a 3 par exemple ?
La variable tableau1 n'est pas un array mais bien une variable ListObject

Explication :
VB:
Sub tableSheetForEach()
    Dim sh As Worksheet
        Set sh = ThisWorkbook.Worksheets("Feuil1")
    ' Pour 1 Tableau structuré sur une Feuille Excel/
        Dim TabTyp As ListObjects
            Set TabTyp = sh.ListObjects
        Dim Tableau1 As ListObject
            Set Tableau1 = TabTyp.Item("Tableau1")
            MsgBox Tableau1.Range.Address & " Adresse"
            MsgBox Tableau1.Name
            MsgBox Tableau1.ListColumns.Count & " Colonnes"
            MsgBox TabTyp.Count & " Nb de tableaux structurer sur la Feuille"
            MsgBox Tableau1.ListRows.Count & " Lignes"
            MsgBox Tableau1.Range(1, 3) & " En-tête = Credit"
            MsgBox Tableau1.HeaderRowRange(3) & " En-tête = Credit"
            Tableau1.Range.Select
            Tableau1.Range.Rows(1).Select
            Tableau1.Range.Rows(2).Select
            Tableau1.Range.Rows(3).Select
            Tableau1.Range(1, 3).Select
    ' Ou ..................................................................................
End sub
VB:
    Dim sh As Worksheet
        Set sh = ThisWorkbook.Worksheets("Feuil1")
    ' Pour 1 Tableau structuré sur une Feuille Excel/
        Dim Tableau1 As ListObject
            ' Set Tableau1 = sh.ListObjects("Tableau1")
            ' Ou
            '  Set Tableau1 = sh.ListObjects(1)
    ' Mais si plusieurs tableau
        Dim Tabl As ListObject
            ' Set Tabl = sh.ListObjects("Tableau1")
            '   Ou
                    Set Tabl = sh.ListObjects(1)
            ' Set Tabl = sh.ListObjects("Tableau3")
            '   Ou
                    Set Tabl = sh.ListObjects(2)
VB:
    ' Boucle sur le tableau choisi : tbl ou tableau1
        Dim cel As Range
            ' Au choix Tableau1.Range ou Tabl.Range
            'For Each cel In Tableau1.Range
            ' en fonction de la variable
            'For Each cel In Tabl.Range
               ' Exemple "***Valeur a trouvé !***"
                If cel = "***Valeur a trouvé !***" Then
                    MsgBox cel.Value
                    MsgBox cel.Address
                    MsgBox cel.Column
                    MsgBox cel.Row
                    Exit For
                End If
            Next
 
Dernière édition:

ChTi160

XLDnaute Barbatruc
Bonsoir cp4
Bonsoir le Fil ,le Forum

je crois que tu n'as pas bien lu le Code de Laurent
il n'y a pas de Tableau(Array)
mais un ListObject "Tableau1"
Edit : Ouppps on s'est Croisés Lol
jean marie
 

cp4

XLDnaute Barbatruc

laurent950

XLDnaute Accro
Re Cp4,
Si je fait un schéma pour t'expliquer simplement :
* Un utilisateur va créer un tableau structuré sur une feuille.
C'est ni plus ni moins qu'une plage comme un range :

* C'est comme si tu écris en VBA dans ton module de classe avec une variable Objet
dim tableau1 as range
set tableau1 = Range("$A$4:$F$6)

La différence c'est que l'utilisateur ne sais pas faire puisqu'il ne connais pas VBA donc:
Il passe par l'icone de la feuille excel Tableau : est il créer sont tableau structuré.

Alors dans le classeur excel qui a plusieurs feuilles comment récupérer les tableaux structuré ?
* faire une boucle sur toutes les feuilles
* sur chacune des feuilles boucler sur tous les tableaux structurer
* la condition du nom du tableau structuré qui est celui recherché
* ensuite le récupérer dans une variable Objet et travailler avec
* est connaitre l'ensemble des variables de cette plage du "Tableau structuré"
 

cp4

XLDnaute Barbatruc
Bonjour Laurent ,

Je te remercie infiniment pour ton aide. J'apprécie beaucoup ta gentillesse.
Je manipule assez bien ces tableaux structurés sur excel. Par contre en VBA, c'est plus compliqué pour moi de trouver les bonnes syntaxes. J'ai trouvé quelques unes sur le site de Boisgontier.

Exemple les syntaxes que vous m'avez proposées donnent le bon résultat:
Range("tableau1" & "[crédit]").Column celle que j'ai trouvé comme un grand

celles de Jacky67
MsgBox [Tableau1[crédit]].Column
'OU
MsgBox Range("tableau1[crédit]").Column

celles d'Eriiiic
With ActiveWorkbook.Worksheets("Feuil1").ListObjects(1)
MsgBox Intersect(.HeaderRowRange, Target.EntireColumn).Value
End With

Et ton code du post15.

Ces tableaux facilitent les choses, cependant il faut que j'apprenne à les manipuler en vba.

Merci beaucoup.

Bonne journée.
 

patricktoulon

XLDnaute Barbatruc
bonjour cp4
quelque exemples pour te familiariser avec listobject/range("xxx"[yyy]")
VB:
Sub test()

'adresse du tableau complet
MsgBox Sheets(1).ListObjects(1).Range.Address 'adresse  complete y compris le header
MsgBox Sheets(1).Range("tableau1[#All]").Address 'adresse complete y compris le header
MsgBox Sheets(1).ListObjects("tableau1").Range.Address 'adresse  complete y compris le header

'adresse de l'entete"header"
MsgBox Sheets(1).Range("tableau1[#headers]").Address 'adresse complete du  header
MsgBox Sheets(1).ListObjects(1).ListRows(0).Range.Address 'adresse complete de la ligne 1  du tableau(pas le header)

'adresse du tableau sans l'entete
MsgBox Sheets(1).Range("tableau1").Address 'adresse  sans le header( la ligne d'entete)

'adresse d'une colonne d'un tableau structuré
MsgBox Sheets(1).ListObjects(1).ListColumns(1).Range.Address 'adresse complete de la colonne 1  du tableau
MsgBox Sheets(1).Range("tableau1[colonne1]").Address 'adresse complete de la colonne 1  du tableau


MsgBox Sheets(1).ListObjects(1).ListRows(1).Range.Address 'adresse complete de la ligne 1  du tableau(pas le header)


End Sub
 

cp4

XLDnaute Barbatruc
Bonjour PatrickToulon ,

Avec tous mes remerciements.
Bonne journée.

Edit: je reviens plantage l'indice n'appartient pas à la selection pour la 1ère ligne et erreur définie par l'application ou l'objet
VB:
MsgBox Sheets(1).ListObjects(1).ListRows(0).Range.Address 'adresse complete de la ligne 1  du tableau(pas le header)

MsgBox Sheets(1).Range("tableau1[colonne1]").Address 'adresse complete de la colonne 1  du tableau
 
Dernière édition:

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…