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

mapomme

XLDnaute Barbatruc
Supporter XLD
Re @patricktoulon ;)

Ce n'est pas une histoire d'avoir raison ou pas, juste de se comprendre.

Au fait dans ton code d'insertion, tu utilises la position de colonne n°2.
Si on pousse le bouchon aussi loin que possible avec la notion de tableau structuré, il me semble qu'on devrait n'utiliser que le nom du tableau et le nom de la colonne (Bidule). Le n° "2" fait plutôt appel à une notion de plage que de tableau structuré.

Mais j'ai du mal avec la syntaxe...

Le plus court (pour l'instant) que j'ai trouvé avec une syntaxe (approchée) d'objet structurellement tabulaire, c'est :
VB:
    Range("Tableau1[Bidule]").Insert
    Range("Tableau1[Bidule]")(0, 0) = "Crédit"
 

Pièces jointes

  • mapomme- Ins col ds Tablo- v2.xlsm
    18.1 KB · Affichages: 10
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
ceci est surprenant
Range("Tableau1[Bidule]")(0, 0) = "Crédit"
quelle est la valeur en terme de fonction du "0, 0"

sinon si je reprends ma précédente avec la méthode add mais dans une écriture tout accrochée
Sub test()
With ActiveSheet.ListObjects("tableau1")
.ListColumns.Add(.ListColumns("bidule").Index).Range(1) = "credit"
End With
End Sub


mais j'avoue bien aimer la tienne même si c'est suspect
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re à tous :),

En fait si x est une plage, alors la cellule x(1,1) est la première cellule de la plage x.

Cette notation prend comme base la première cellule de x et lui affecte les coordonnées (1,1)
Ensuite la plage n'intervient plus. On se réfère à cette première cellule.
x(4,7) est la cellule de ligne 4 depuis la ligne de x(1,1) (vers le bas) et de colonne 7 depuis la colonne de x(1,1) (vers la gauche)

On peut dépasser les limites de la plage. Par exemple x(999,999) est valable même si la plage est réduite à une cellule.

Par similarité x(1,0) désigne la cellule de ligne 1 par rapport à x(1,1) et de colonne une colonne à gauche de x(1,1).
x(0,0) est la cellule d'une ligne au-dessus de x(1,1) et d'une colonne à gauche par rapport à la colonne de x(1,1).

Imaginons l'instruction tablo = range("c3:f6")
On désigne les éléments de tablo par t(i,j). Le premier élément est le t(1,1).

C'est comme si la notation plage (i,j) "étendait" la notion d'indice i, j à un tableau de cellules prolongé vers la droite, vers la gauche, vers le haut, vers le bas à partir de t(1,1). les indices augmentent quand on se déplace vers le bas et vers la droite. Les indices diminuent quand on se déplace vers le haut et vers le bas.

On a en fait : x(i,j) correspond à x(1, 1).Offset(i - 1, j - 1) ou plus simplement à x.Cells(i, j).
Et x.Cells(0,0) ou x.Cells(-1,-4) est une écriture qui passe.

Un code peut vite devenir illisible si on emploie à outrance ce type peu intuitif de coordonnées.

C'est un peu à rapprocher de Range("b3:d4").Range("b3") qui désigne la cellule C5
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
pour le positif je le savais mais pour le 0 qui se transforme en quelque sorte en "-1" je l'ignorais

peut être que cette écriture peut être plus lisible avec la méthode insert de range
dans le sens ou on comprends tout de suite le "-1" de l'offset avec le resize (1)
Sub Macro1()
With Range("Tableau1[Bidule]"): .Insert: .Offset(-1, -1).Resize(1) = "Crédit": End With
End Sub
 

cp4

XLDnaute Barbatruc
Bonjour à tous,
tu peux récupérer le libellé, ça auto-commentera le code :
VB:
    With ActiveWorkbook.Worksheets("Feuil1").ListObjects(1)
        MsgBox Intersect(.HeaderRowRange, Target.EntireColumn).Value
    End With
eric
Bonjour:),
Après quelques jours, j'ai repris mon fichier et le bout de code proposé par eriiiic;) plante si je saisis hors du tableau.
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
   Dim dl As Long, Ligne As Long, Col As String, NbCol As Integer
   dl = Range("Tableau1").ListObject.ListRows.Count
   Ligne = IIf(dl = 1, 6, Range("a" & Rows.Count).End(xlUp).Row)

   NbCol = [Tableau1].Columns.Count

  Application.EnableEvents = False
 
With ActiveWorkbook.Worksheets("Feuil1").ListObjects(1)
      If NbCol <= 6 Then
         Col = Intersect(.HeaderRowRange, Target.EntireColumn).Value 'plante ici'
      Else
         Exit Sub
      End If
   End With
'suite code'
 
   Application.EnableEvents = True
End Sub
pour l'instant mon tableau structuré va de la colonne A à F, en ligne 5 les entêtes de colonnes. Je rajouterais peut-être des colonnes.
1591588726107.png

1591588760404.png

Comment remédier à ce plantage. Merci.

Bonne journée.

edit: Résolu avec NoCol=Target.Column
 
Dernière édition:

cp4

XLDnaute Barbatruc
J'ai plutôt dans l'idée que ton nom de tableau n'existait pas.
Bonjour Eric,
Je te rassure mon tableau existait bien et que son nom était bien nommé "Tableau1" .
En effet, il commence à la première colonne et la 5ème ligne.
Ce n'est que par hasard que je me suis rendu compte que la ligne de code que tu m'avais proposé plantée.
J'ai voulu effectué un petit calcul hors du tableau, plus précisément en colonne H et là le code a planté.
Ta résolution ne fonctionne que si le tableau démarre en colonne 1.
Là, je n'ai pas compris. Pourrais-tu être plus clair? En te remerciant par avance.
ps: Si ça peut faciliter pour proposer une solution, ci-joint fichier dont le code est en cours.
 

Pièces jointes

  • Classeur1.xlsm
    54.6 KB · Affichages: 5

eriiic

XLDnaute Barbatruc
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 plutôt comme ça :
Code:
    Dim pl As Range
    With ActiveWorkbook.Worksheets("Feuil1").ListObjects(1)
        Set pl = Intersect(.HeaderRowRange, ActiveCell.EntireColumn)
        If Not pl Is Nothing Then
            Select Case pl.Value
            Case "Date"
            Stop
            Case "crédit" ' respecter la minuscule sur la feuille !
            Stop
            Case "Débit"
            Stop
            End Select
        End If
    End With
J'ai voulu dire que ça fonctionne toujours même si ton tableau démarre en E7.
Toi, ton calcul de colonne mal fait posera des problèmes.
D'ailleurs tu pourrais en profiter pour le nommer clairement et utiliser son nom. Par exemple :
With ActiveWorkbook.Worksheets("Feuil1").ListObjects("Tab_solde")
Ca aussi ça auto-commente le code
eric
 
Dernière édition:

cp4

XLDnaute Barbatruc
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 plutôt comme ça :
Code:
    Dim pl As Range
    With ActiveWorkbook.Worksheets("Feuil1").ListObjects(1)
        Set pl = Intersect(.HeaderRowRange, ActiveCell.EntireColumn)
        If Not pl Is Nothing Then
            Select Case pl.Value
            Case "Date"
            Stop
            Case "crédit" ' respecter la minuscule sur la feuille !
            Stop
            Case "Débit"
            Stop
            End Select
        End If
    End With
J'ai voulu dire que ça fonctionne toujours même si ton tableau démarre en E7.
Toi, ton calcul de colonne mal fait posera des problèmes.
D'ailleurs tu pourrais en profiter pour le nommer clairement et utiliser son nom. Par exemple :
With ActiveWorkbook.Worksheets("Feuil1").ListObjects("Tab_solde")
Ca aussi ça auto-commente le code
eric
Bonjour Eric,

Tous mes remerciements pour tes explications, conseils et critiques.
Pour ce qui est de cette ligne de code Col = Intersect(Target.EntireColumn, .HeaderRowRange)
C'est Jean Maire qui me l'a proposée avant de modifier son post#71. Elle renvoyait bien l’entête de la colonne sélectionnée si et seulement si on était dans la plage du tableau. Mais les 2 lignes plantaient hors du tableau.

Encore merci pour ton dernier code que je testerai ce soir même.

Bonne soirée.
 

Discussions similaires

Statistiques des forums

Discussions
312 243
Messages
2 086 549
Membres
103 244
dernier inscrit
lavitzdecreu