[Excel 2013] VBA et tableaux structurés

13 réponses
Avatar
ThierryP
Bonjour le forum,

Est-il possible de cr=C3=A9er un tableau structur=C3=A9 par VBA ?

Apr=C3=A8s quelques recherches, je n'ai pas r=C3=A9ussi =C3=A0 trouver d'ex=
emple de cr=C3=A9ation de tableau =C3=A0 partir d'une plage s=C3=A9lectionn=
=C3=A9e...

Merci d'avance pour vos lumi=C3=A8res !!

ThierryP

10 réponses

1 2
Avatar
MichD
Bonjour,
Voici un petit exemple réalisé il y a déjà un moment en réponse à une
question posée sur ce forum...Gestion d'un petit tableau de données à
partir d'un formulaire en VBA.
https://www.cjoint.com/c/ILkkxkPJj8j
Note que dans Excel, feuille de calcul, on peut insérer un "Tableau" à
partir d'une plage de cellules. Cette structure offre beaucoup
d’avantages, à explorer, c'est plus rapide et facile à élaborer!
MichD
Avatar
ThierryP
Bonjour Denis,
Décidément, il semble que soit devenu ton forum, tu es quasiment le seul à répondre !!!
Merci pour ton retour, je vais regarder.
Entre-temps, j'ai trouvé la syntaxe pour créer ce tableau structu ré !
ThierryP
Avatar
ThierryP
Re-bonjour !
Toujours dans mes soucis de tableaux structurés !!
Est-il possible, dans un Worksheet_Change, de détecter l'ajout d'un li gne et/ou d'interdire l'ajout d'une colonne ??
Merci d'avance !!!
ThierryP
Avatar
MichD
Si tu fais référence à la notion de tableau dans une formule, il faut
être explicite.
Pour ceux qui ont la virgule comme séparateur décimale.
un exemple : =SOMME({1;2;10}) Tableau vertical
ou ceci : =SOMME({1.2.1}) : Tableau horizontal
MichD
Le 10/12/19 à 07:55, ThierryP a écrit :
Bonjour Denis,
Décidément, il semble que soit devenu ton forum, tu es quasiment le seul à répondre !!!
Merci pour ton retour, je vais regarder.
Entre-temps, j'ai trouvé la syntaxe pour créer ce tableau structuré !
ThierryP
Avatar
MichD
Bonjour,
Copie le code suivant dans le module de la feuille.
3 actions que tu peux faire lorsqu'une ligne complète est sélectionnée :
A) Déplacer, B)Supprimer, C)Insérer
La procédure suivante n'identifie pas l'action dès qu'une de ces 3
actions s'est produite.
Dim Lig As String 'Dans le haut du module.
'-----------------
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Cells.Count = Columns.Count Then
MsgBox Lig
End If
End Sub
'-----------------
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Cells.Count = Columns.Count Then
Lig = Target.Address
End If
End Sub
'-----------------
Si tu veux quelque chose de plus élaborer, il faut modifier l'action des
commandes du menu. Tu dois utiliser ceci : "Custom UI Editor For
Microsoft Office" que tu peux télécharger du site de Microsoft. Moi, je
ne touche pas à cela dans le cadre d'un forum.
MichD
Avatar
ThierryP
Re-bonjour Denis,
Je crois que je me suis mal exprimé....
Je parle de tableau structuré créé via l'onglet "Outil de ta bleau" qui crée un ListObject("Tableau1").
Si on supprime une ligne (clic droit -> Supprimer -> Lignes de tableau), le code me donne :
Range("E18").Select
Selection.ListObject.ListRows(13).Delete
mais comment intercepter, puisque je ne sélectionne pas une ligne comp lète ?
ThierryP
Avatar
MichD
Tu pourrais faire un effort et être plus explicite dans ta demande!
Essaie ceci. Cela fonctionne seulement tu ajoutes ou tu supprimes une
ligne complète dans le tableau.
Dans mon exemple, j'ai utilisé l'index 1 pour désigner le tableau. À toi
d'adapter en remplaçant le 1 par l'index ou le nom de ton tableau dans
les 2 procédures.
Dim NbRows As Long
Dim Adr As String
'--------------------------------
Private Sub Worksheet_Change(ByVal Target As Range)
With Me.ListObjects(1).DataBodyRange
If Target.Cells.Count =
Me.ListObjects(1).DataBodyRange.Columns.Count Then
If .Rows.Count < NbRows Then
MsgBox NbRows - .Rows.Count & " ligne(s) """ & Adr & """
supprimée(s) du tableau."
Else
MsgBox .Rows.Count - NbRows & " ligne(s) """ & Adr & """
ajoutée(s) du tableau."
End If
End If
End With
End Sub
'--------------------------------
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
With Me.ListObjects(1).DataBodyRange
If Target.Cells.Count = .Columns.Count Then
NbRows = .Rows.Count
Adr = Target.Address
End If
End With
End Sub
'--------------------------------
MichD
Avatar
Jacquouille
Bonjour Thierry
Nous sommes sur le vieux continent.
Ici,nous en sommes toujours à XL2003, malgré les menaces de boycot de Bilou.
Nous sommes un peuple galant qui laisse aux jeunes le soin de s'exprimer, de
s'épanouir. -))
PS: Nous aimons aussi l'humour.
Jacques
" Le vin est au repas ce que le parfum est à la femme."
.
"ThierryP" a écrit dans le message de groupe de discussion :
Bonjour Denis,
Décidément, il semble que soit devenu ton forum, tu es quasiment le seul à
répondre !!!
Merci pour ton retour, je vais regarder.
Entre-temps, j'ai trouvé la syntaxe pour créer ce tableau structuré !
ThierryP
Avatar
MichD
Même principe que la procédure du message précédent, mais ceci gère
aussi l'ajout ou la suppression d'une ou de plusieurs lignes du tableau.
La suppression ou l'ajout de lignes de toute la largeur de la feuille de
calcul n'est pas traité dans ce qui suit.
Dim NbRows As Long
Dim Adr As String
'----------------------------------------------
Private Sub Worksheet_Change(ByVal Target As Range)
With Me.ListObjects(1).DataBodyRange
If Adr = "" Then Exit Sub
If NbRows = 1 Then
If Target.Cells.Count = .Columns.Count Then
If .Rows.Count <= NbRows Then
MsgBox NbRows - .Rows.Count & " ligne(s) """ & Adr &
""" supprimée(s) du tableau."
Else
MsgBox .Rows.Count - NbRows & " ligne(s) """ & Adr &
""" ajoutée(s) du tableau."
End If
End If
Else
If Target.Count / Target.Rows.Count = .Columns.Count Then
If .Rows.Count <= NbRows Then
MsgBox NbRows - .Rows.Count & " ligne(s) """ & Adr &
""" supprimée(s) du tableau."
Else
MsgBox .Rows.Count - NbRows & " ligne(s) """ & Adr &
""" ajoutée(s) du tableau."
End If
End If
End If
Target(1, 1).Select
End With
End Sub
'----------------------------------------------
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
With Me.ListObjects(1).DataBodyRange
If .Rows.Count = 1 Then
If Target.Cells.Count = .Columns.Count Then
NbRows = .Rows.Count
Adr = Target.Address
End If
Else
If Target.Cells.Count / Target.Rows.Count = .Columns.Count Then
NbRows = .Rows.Count
Adr = Target.Address
Else
Adr = ""
End If
End If
End With
End Sub
'----------------------------------------------
MichD
Avatar
ThierryP
Bonsoir Jacques,
Tu as raison, mais je ne voudrais pas mourir idiot.... et je lis sur tous l es forums que cette notion de tableau structuré est le top de la manip ulation de données, donc j'essaie d'apprendre à maîtriser la bête !
Quant à l'humour, pour avoir fréquenté le MPFE des grandes a nnées, je confirme que humour et Excel peuvent faire bon ménage ! !!
Bonne soirée,
ThierryP
1 2