Résolu Je me lance dans les tableaux structurés

mapomme

XLDnaute Barbatruc
Supporter XLD
Mais en relisant le message de JB (qui a été edité), il s'agit bien d'un ListObject, non ?
En fait, j'ai l'impression que la méthode JB utilise le process d'insertion de ligne par affectation.
Se placer sur la ligne qui suit le tableau structuré, dans une cellule, tapez une valeur. Le tableau structuré s'agrandit automatiquement d'une ligne...

D’ailleurs,
VB:
[tableau1].Rows([tableau1].Rows.Count + 2) = Array("Martin", "Lyon", #3/30/2020#, 4000)
ajoute les données deux lignes sous le tableau sans modifier le tableau structuré.

J'abonde donc dans le sens de job75 que je salue au passage.

Pour preuve, la fenêtre espion ci-dessous.
1586021500110.png
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re, Bonjour mapomme

Cette syntaxe indique bien la présence d'un ListObject, non ?
C'est ce que je voulais dire.
Mais OK [Tableau1] est un Range du ListObject Tableau1.
enreg = [tableau1].Rows.Count + 1
[tableau1[nom]].Rows(enreg) = "Martin" '
[tableau1[ville]].Rows(enreg) = "Lyon"

[tableau1[date]].Rows(enreg) = #3/30/2020#
[tableau1[salaire]].Rows(enreg) = 4000
 

BOISGONTIER

XLDnaute Barbatruc
Bonsoir,


Opérations courantes sur les tableaux structurés

Sans titre.png


VB:
Sub SuppressionLigneTableau()
  n = 1
  If [tableau1].Item(n, 1) <> "" Then [tableau1].Rows(n).delete
End Sub


Sub InsèreLigneTableau()
  [tableau1].Rows(1).Insert
End Sub

Sub AjoutFinTableau()
  If [tableau1].Item(1, 1) <> "" Then n = [tableau1].Rows.Count + 1 Else n = 1
  [tableau1[nom]].Item(n, 1) = "xxxx"
End Sub

Sub VideTableau()
   If [tableau1].Item(1, 1) <> "" Then [tableau1].delete
End Sub

Boisgontier
 

Fichiers joints

mapomme

XLDnaute Barbatruc
Supporter XLD
Mais OK [Tableau1] est un Range du ListObject Tableau1.
Pour moi, [Tableau1] est l'évaluation du nom défini "Tableau1" (Menu Formules / Gestionnaire de noms), défini par une référence (dynamique) qui représente la plage des données sans la ligne d'en-tête.

Il y a au moins un problème à utiliser les en-têtes dans une proc. Modifier l'en-tête sur la feuille, le code coince...

Et de toute manière, je n'utilise pas [...]
 
Dernière édition:

BOISGONTIER

XLDnaute Barbatruc
Programme de création/modif/suppression sur un tableau structuré dynamique


Sans titre.png

VB:
Option Compare Text
Dim nomtableau
Private Sub UserForm_Initialize()
  nomtableau = "Client"
  If Range(nomtableau).Item(1, 1) <> "" Then n = Range(nomtableau).Rows.Count + 1 Else n = 1
  Me.enreg = n
  Me.Id = Application.Max(Range(nomtableau & "[id]")) + 1
  Tbl = Range(nomtableau).Value
  Tri Tbl, LBound(Tbl), UBound(Tbl), 2
  Me.Recherche.List = Tbl
End Sub

Private Sub Recherche_Change()
  Me.enreg = Application.Match(Val(Me.Recherche), Range(nomtableau & "[id]"), 0)
  Me.Id = Me.Recherche
  Me.Nom = Range(nomtableau & "[nom]").Item(enreg, 1)
  Me.Rue = Range(nomtableau & "[rue]").Item(enreg, 1)
  Me.Ville = Range(nomtableau & "[ville]").Item(enreg, 1)
  Me.CodePostal = Range(nomtableau & "[codepostal]").Item(enreg, 1)
  Me.Tph = Range(nomtableau & "[tph]").Item(enreg, 1)
  Me.Portable = Range(nomtableau & "[portable]").Item(enreg, 1)
  Me.Email = Range(nomtableau & "[email]").Item(enreg, 1)
  Me.Remarques = Range(nomtableau & "[remarques]").Item(enreg, 1)
End Sub

Private Sub B_valid_Click()
  enreg = Me.enreg
  Range(nomtableau & "[id]").Item(enreg, 1) = Val(Me.Id)
  Range(nomtableau & "[nom]").Item(enreg, 1) = Me.Nom
  Range(nomtableau & "[rue]").Item(enreg, 1) = Me.Rue
  Range(nomtableau & "[ville]").Item(enreg, 1) = Me.Ville
  Range(nomtableau & "[codepostal]").Item(enreg, 1) = Me.CodePostal
  Range(nomtableau & "[tph]").Item(enreg, 1) = Me.Tph
  Range(nomtableau & "[portable]").Item(enreg, 1) = Me.Portable
  Range(nomtableau & "[email]").Item(enreg, 1) = Me.Email
  Range(nomtableau & "[remarques]").Item(enreg, 1) = Me.Remarques
End Sub

Sub raz()
  Me.Nom = ""
  Me.Rue = ""
  Me.Ville = ""
  Me.CodePostal = ""
  Me.Tph = ""
  Me.Portable = ""
  Me.Email = ""
  Me.Remarques = ""
End Sub




Boisgontier
 

Fichiers joints

Dernière édition:

Staple1600

XLDnaute Barbatruc
Re

Merci mapomme ;)
Pour moi la lecture (ou la seule visualisation de la copie d'écran du message#45) me confirme la présence "physique" d'un ListObject sur la feuille.
C'est ce qui me postait question.
;)

NB: Et merci à JB pour ces exemples qui ont mis fin à mon questionnement d'un soir.
 

chris

XLDnaute Barbatruc
Re
Il y a au moins un problème à utiliser les en-têtes dans une proc. Modifier l'en-tête sur la feuille, le code coince...
On change moins souvent les titres que le la position des tableaux voire des colonnes dans le tableau...
Ce problème se pose pour tout code VBA qui se réfère à la colonne x ou à la ligne y... parce c'était comme cà quand on a écrit le code...
 

Pounet95

XLDnaute Occasionnel
Bonsoir,
Merci à tous.
Je ne pensais pas que ma question fasse l'objet d'autant d'échanges.
Vraiment content et satisfait des réponses que je tenterais de mettre en oeuvre.
J'aurais sûrement l'occasion de demander des tuyaux sur Power Query ( je viens de retirer Power Pivot des menus ) et l'utilisation de requêtes SQL comme je crois en avoir vu en cherchant sur les différents forum.
 

BOISGONTIER

XLDnaute Barbatruc
Les syntaxes souvent utilisées dans les TSD:

VB:
NbCol = [Tableau1].Columns.Count                    ' Nombre colonnes de la BD
TblBD = [Tableau1].Resize(, NbCol + 1).Value     ' BD dans Array
Me.ComboTri.List = Application.Transpose([Tableau1].Offset(-1).Resize(1)) ' Titres BD
[Tableau1].Rows(ligne).Delete                            ' Suppression ligne
[Tableau1].Item(ligne, Colonne) = tmp                ' Ecriture dans la BD en ligne,colonne
n = [Tableau1].Rows.Count                                ' Nombre de lignes de la BD
TitreColonne2 = [Tableau1].Offset(-1).Item(1,2)  ' Entête de la colonne 2
TblNoms = [Tableau1[nom]]                               ' Colonne des noms dans TblNoms(,)
NomTableau = "Client": TblNom = Range(NomTableau & "[Nom]") ' Colonne des noms dans TblNoms(,)
temp=[Tableau1[nom]].Item(1)                          ' Premier nom dans temp
Tbl = [tableau1[nom]]                                        ' Colonne nom dans Array Tbl()
Tbl = [tableau1].Columns(2)                               ' Colonne 2 dans Array Tbl()
TblTout = Range("Tableau1[#all]")                      ' Tableau avec entete
TblTout = [Tableau1[#all]]                                  ' Tableau avec entete
TblEntete = Range("Tableau1[#all]").Rows(1)       ' en-tête tableau
MsgBox TblEntete(1, 2)                                       ' Entête 2e colonne
TblEntete = [client[#headers]]                            ' Tableau en têtes
temp = TblEntete(1, 2)
temp = [client[#headers]].Item(2)
TblEntete = Range("Tableau1").ListObject.HeaderRowRange
MsgBox TblEntete(1, 2)
Tbl3col = Range("Tableau1[[nom]:Tableau1[ville]]")   ' 3 Colonnes adjacentes
NomFeuille = Range("Tableau1").Parent.Name            ' nom de la feuille hôte
Set Rng = Range("Tableau1[nom], Tableau1[ville]")    ' champs discontinus
MsgBox Rng.Areas(2)(1)                                           ' 1ere ville
LigneTableur = Range("client").Rows(LigneTableau).Row ' No ligne tableur
[liste].Sort key1:=[liste], Header:=xlYes                 ' tri simple liste
[liste2].Sort key1:=[liste2[salaire]], Header:=xlYes ' tri par salaire'
NomTableau = "Client"
Range(NomTableau).Sort key1:=Range(NomTableau & "[nom]"), Header:=xlYes ' Tri
[tableau1].Rows([tableau1].Rows.Count + 1) = Array("Martin", "Lyon", 4000) ' ajout enregistrement
Range(nomtableau).Rows(n) = Array("Durand", "Lyon", #3/30/2020#, 4000) ' ajout enregistrement
Range(nomtableau & "[nom]").Item(enreg, 1) = "Durand"
Me.Nom = Range(nomtableau & "[nom]").Item(enreg, 1)

Cette syntaxe est plus simple que la syntaxe ListObject et n'oblige pas à déclarer la feuille.

Pour modifier Martin, on aura:

VB:
Sub ModifEnreg()
 nomtableau = "tableau1"
 Set result = Range(nomtableau & "[nom]").Find(what:="Martin")
 If Not result Is Nothing Then
   enreg = result.Row - Range(nomtableau).Row + 1
   Range(nomtableau & "[salaire]").Item(enreg, 1) = 4100
  End If
End Sub
Boisgontier
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
Bonjour a tous
Personne mais alors personne n'a eu l'idée d'ajouté une colonne dans le combo pour in mettre les index et éviter de cette manière tout ce pédalage pour chopper un item ou une colonne ou une ligne
sérieux!!???
à quoi ca sert de se faire un interface (form) avec une liste si c'est pour pédaler pour rechercher l'item sélectionné de la combo dans le tableau structuré
:rolleyes:
 

patricktoulon

XLDnaute Barbatruc
bonjour job75
je sais pas je vois"Me.ComboTri.List.." je suppose qu'il s'agit d'un interface avec une combo pour travailler sur son TS
 

patricktoulon

XLDnaute Barbatruc
re
oui mais il a posé d'autre questions ensuite visiblement
la réponse lui ayant été donnée depuis un moment déjà et vu que l'on en est a 3 pages je pense que le sujet est plus large qu'un simple ajout de ligne maintenant ;)
oserais-je dire que trier son TS a chaque ajout avec sort
serait beaucoup moins compliqué que de trier un tableaiu etc..... etc.....
 

Pounet95

XLDnaute Occasionnel
Bonjour PatrickToulon
Je n'ai jamais fait état de combobox. PAr contre, c'est vrai que dans la liste de JB il y a une ligne qui contient le terme, mais ce ne sont que des exemples de syntaxes utilisées !
PS : j'ai proposé de fermer le fil. Je le fais ou c'est à un des administrateurs de le faire ?
 

Créez un compte ou connectez vous pour répondre

Vous devez être membre afin de pouvoir répondre ici

Créer un compte

Créez un compte Excel Downloads. C'est simple!

Connexion

Vous avez déjà un compte? Connectez vous ici.

Haut Bas