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).
1589732164385.png


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
Re,
J'ai fait un test par rapport à ton fichier :

VB:
Sub tableSheetForEach()

    Dim sh As Worksheet
        Set sh = ThisWorkbook.Worksheets("Feuil1")
    Dim tbl As ListObject

    ' Boucle à travers toutes les tables de la "Feuil1"
        For Each tbl In sh.ListObjects
            If tbl.Name = "Tableau1" Then
                ' Mise en mémoire
                    Dim Tableau1 As ListObject
                    Debug.Print tbl.Name
                    Set Tableau1 = tbl
                Exit For
            End If
        Next tbl
    ' Boucle sur tbl = tableau1
        Dim cel As Range
            For Each cel In Tableau1.Range
               ' Exemple "Crédit"
                If cel = "Crédit" Then
                    MsgBox cel.Value
                    MsgBox cel.Address
                    MsgBox cel.Column
                    MsgBox cel.Row
                    Exit For
                End If
            Next
End Sub
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
1589739693857.png

1589739924794.png


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
1589740745624.png

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:

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 :
1589742400863.png

* 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
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 :
Regarde la pièce jointe 1067465
* 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é"
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:oops:

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 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
Bonjour PatrickToulon ;),

Avec tous mes remerciements.:cool:
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

Statistiques des forums

Discussions
312 164
Messages
2 085 869
Membres
103 007
dernier inscrit
salma_hayek