Insérer une ligne apres avoir sélectionné une cellule
Bonjour à tous,
Ultra méga novice en VBA, je me permets de vous solliciter pour avoir un code me permettant de faire ceci :
Sur une feuille de calcul excel, j'ai 3 tableaux séparés, avec des données distinctes.
le premier tableau A12:FXX
le second tableau H12:OXX
le troisieme tableau Q12:VXX
J'aimerai pouvoir créer un bouton de commande par tableau pour insérer une ligne apres la selection d'une cellule.
Par exemple, je sélectionne la cellule D41, et la macro vient ajouter une ligne 42 entre les colonnes A et F (au pire, il faut peut être dire qu'on doit absolument sélectionner la cellule en colonne A pour le 1er tableau, en colonne H pour le second et en colonne Q pour le dernier)
et si possible faire en sorte que les cellules de la ligne nouvellement crée soient vides de couleur.
J'espere être assez clair,
merci
julien
Bonjour,
Quel genre de tableau utilises tu ? C'est toi qui à "dessiner" le tableau ou tu utilises les tableaux structurés ?
Si c'est des tableaux structurés, utilise le code ci-dessous. (si tu ne sais pas comment faire je t'expliquerais, de plus un fichier aurais été le bienvenue ;) )
Sub AjoutLigne()
Dim NomTBL As String
Dim TBL As ListObject
Dim Entete As Long, Lig As Long, Diff As Long
On Error GoTo Err
If Not ActiveCell.ListObject Is Nothing Then 'Si la cellule active se trouve dans le scop d'un tableau alors :
NomTBL = ActiveCell.ListObject.Name 'La variable NomTBL prend pour valeur le nom du tableau
Set TBL = ActiveSheet.ListObjects(NomTBL) 'La variable TBL représente un object de type "Tableau"
Entete = TBL.Range.Row 'La variable EnTete prend pour valeur la première ligne du tableau
'(afin de psoition le tableau dans l'espace de la feuille)
Lig = ActiveCell.Row 'La variable Lig prend pour valeur la ligne de la cellule active
Diff = Lig - Entete 'La variable diff représente donc la position dans le tableau de là où une ligne doit-être insérée
TBL.ListRows.Add (Diff + 1) 'Ajout d'une ligne
End If
Exit Sub
Err: MsgBox "Impossible d'ajouter une ligne", vbCritical, "Erreur"
End SubBonjour Gautier,
c'est parfait, j'ai modifié le code que tu m'as envoyé et j'ai intégré les noms des tableaux (qui n'en étaient pas au départ, mais du coup ça marche nickel maintenant)
merci beaucoup
julien
Je comprend pas pourquoi tu as fait cette modif, (normalement) le code fonctionne pour n'importe quel tableau quel que soit le nom qu'il porte !
PS: je remet le code avec une petite sécurité en plus ;)
Sub AjoutLigne()
Dim NomTBL As String
Dim TBL As ListObject
Dim Entete As Long, Lig As Long, Diff As Long
On Error GoTo Err
If Not ActiveCell.ListObject Is Nothing Then 'Si la cellule active se trouve dans le scop d'un tableau alors :
NomTBL = ActiveCell.ListObject.Name 'La variable NomTBL prend pour valeur le nom du tableau
Set TBL = ActiveSheet.ListObjects(NomTBL) 'La variable TBL représente un object de type "Tableau"
Entete = TBL.Range.Row 'La variable EnTete prend pour valeur la première ligne du tableau
'(afin de psoition le tableau dans l'espace de la feuille)
Lig = ActiveCell.Row 'La variable Lig prend pour valeur la ligne de la cellule active
Diff = Lig - Entete + 1 'La variable diff représente donc la position dans le tableau de là où une ligne doit-être insérée
If TBL.ListRows.Count = 0 Then
MsgBox "Pour executer le code, il faut au minimum une donnée dans " & Chr(10) & _
"l'une des colonnes de la première ligne du tableau """ & TBL.Name & """.", vbExclamation, "Ajout impossible"
Exit Sub
End If
TBL.ListRows.Add (Diff) 'Ajout d'une ligne
End If
Exit Sub
Err: MsgBox "Impossible d'ajouter une ligne", vbCritical, "Erreur"
End SubL'avantage de ce code est que tu peux te passer de trois boutons différents, tu as juste besoin de lié la macro à un raccourci clavier ;)
et si tu préfères, je peux rajouter une ligne de contrôle des tableaux sur lesquels tu à le droit d'ajouter les lignes. (Tu peux ajouter autant de tableau que tu veux, ce qui est pénible c'est que tu seras obligé de venir modifier le code si tu ajoutes des tableaux "autorisés").
L'avantage, c'est que tu as un seul code pour gérer plusieurs tableaux ;)
Sub AjoutLigne()
Dim NomTBL As String
Dim TBL As ListObject
Dim Entete As Long, Lig As Long, Diff As Long, i As Long
Dim AllowTBL()
Dim CtrlTBL As Boolean
On Error GoTo Err
AllowTBL = Array("Tableau1", "Tableau2", "Tableau3") 'Liste des tableaux autorisés
If Not ActiveCell.ListObject Is Nothing Then 'Si la cellule active se trouve dans le scop d'un tableau alors :
NomTBL = ActiveCell.ListObject.Name 'La variable NomTBL prend pour valeur le nom du tableau
CtrlTBL = False 'La variable CtrlTBL nous assurera que le tableau sélectionné fait partie de la liste
For i = LBound(AllowTBL) To UBound(AllowTBL) 'Bouvle sur tous les noms de tableaux autorisés
If AllowTBL(i) = NomTBL Then 'si le tableau sélectionné correspond à un nom de tableau de la liste alors :
CtrlTBL = True 'La variable CtrlTBL passe à l'état "VRAI"
Exit For 'On sort de la boucle
End If
Next i
If CtrlTBL = False Then 'Si la variable CTRL est restée à l'état "FAUX" (le tableau n'appartient donc pas à la liste) alors :
MsgBox "Vous n'êtes pas autorisé à faire cette action sur """ & NomTBL & """.", vbExclamation, "Tableau non-autorisé" 'Message d'erreur pour l'utilisateur
Exit Sub 'On sort du programme
End If
Set TBL = ActiveSheet.ListObjects(NomTBL) 'La variable TBL représente un object de type "Tableau"
Entete = TBL.Range.Row 'La variable EnTete prend pour valeur la première ligne du tableau (afin de psoition le tableau dans l'espace de la feuille)
Lig = ActiveCell.Row 'La variable Lig prend pour valeur la ligne de la cellule active
Diff = Lig - Entete + 1 'La variable diff représente donc la position dans le tableau de là où une ligne doit-être insérée
If TBL.ListRows.Count = 0 Then
MsgBox "Pour executer le code, il faut au minimum une donnée dans " & Chr(10) & _
"l'une des colonnes de la première ligne du tableau """ & TBL.Name & """.", vbExclamation, "Ajout impossible"
Exit Sub
End If
TBL.ListRows.Add (Diff) 'Ajout d'une ligne
End If
Exit Sub
Err: MsgBox "Impossible d'ajouter une ligne", vbCritical, "Erreur"
End SubBonjour à tous les 2,
@GGautier : A mon grand étonnement, récemment, j'ai créé un tableau (via VBA en fonction d'un nom de feuille) et son nom était forcé avec un underscore indésirable. Impossible d'agir sur le tableau avec le nom normalement car le nom était bien celui que je lui avais attribué.
En fait, la propriété Name valait NOMTAB alors que la propriété DisplayName valait _NOMTAB.
Mais en utilisant la propriété DisplayName je n'ai pas eu de problème pour agir sur le tableau...
Cdlt,
Bonjour 3GB ,
Iintéressant comme situation 🤔 En tout cas je ne connaissais pas "DisplayName", je garde ça sous le coude ! Merci 😉