Je me lance dans les tableaux structurés

Pounet95

XLDnaute Occasionnel
Bonjour,
A la lecture de nombreux fils sur le forum, je découvre les tableaux structurés.
J'essaie donc d'adapter le code VBA qui me permet à partir de contrôles sur un USF de mettre à jour un tableau.
J'utilise le code joint, mais je trouve que l'utilisation de Cells(lig,1) par exemple n'est pas cohérente avec "l'esprit" du tableau structuré.
Y a-t-il une syntaxe plus appropriée pour le transfert des données USF vers la ligne ajoutée au tableau.

PS : j'ai téléchargé les tutos de P. Fauconnier mais n'ai pas trouvé mon bonheur pour cette adressage de cellules.
Il parle d'un opus 3 mais où est-il ?
Merci de me dire

VB:
Sub Test()
    'Enregistrer
    With Sheets("Feuil1").ListObjects("Tableau1")
        .ListRows.Add
        lig = .ListRows.Count + 1

        Cells(lig, 2) = ComboBox.Value
        Cells(lig, 1) = Label1.Caption
        Tri_Tableau1
    End With
End Sub
 

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
Repose en paix
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
 

Pièces jointes

  • BDClientTDyn.xlsm
    42.4 KB · Affichages: 14
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
Repose en paix
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
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 ?
 

Discussions similaires

Statistiques des forums

Discussions
312 080
Messages
2 085 150
Membres
102 794
dernier inscrit
espinata