Création d'un tableau avec nombre de lignes variables
Bonjour à tous !
Je viens ici vous demander un peu d'aide car mes compétences en VBA trouvent leur limites avec un projet que je mène pour le travail.
En effet, j'ai pour projet de créer un tableur à destination de mes clients dans lequel il vont devoir renseigner une liste de lieux.
Afin de faciliter au maximum la saisie de leur données et éviter les erreurs, je souhaite rendre mon tableau dynamique.
L'idée serait de leur permettre de saisir dans une cellule le nombre de lieux à renseigner, ce qui entraînerait la création du bon nombre de lignes dans le tableau juste en dessous.
J'ai donc fait quelques recherches sur ce merveilleux forum et je pense avoir une piste solide concernant mon souhait.
Cependant j'éprouve des difficultés à adapter le code à mon fichier.
Voici le code que j'ai trouvé :
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim lo As ListObject
Dim Indx As Long
Dim Message As String, Style As VbMsgBoxStyle, Answer As VbMsgBoxResult, Title As String
If Target.Address = "$D$8" Then
Set lo = Me.ListObjects(1)
With lo
If .InsertRowRange Is Nothing Then
Message = "Vous allez supprimer les données de la table." & vbCrLf
Message = Message & "Veuillez confirmer votre souhait."
Style = vbYesNo + vbQuestion
Title = "Réinitialisation table ?"
Answer = MsgBox(Message, Style, Title)
If Answer = vbYes Then .DataBodyRange.Delete
End If
If Not IsEmpty(Target) Then
If Target.Value = 1 Then
.InsertRowRange.Cells(1).Value = 1
Else
.Resize lo.Range.Resize(Target.Value + 1)
For Indx = 1 To .ListRows.Count
.ListRows(Indx).Range.Cells(1) = Indx
Next Indx
End If
End If
End With
End If
End SubC'est vraiment du super boulot (je suis désolé, je n'ai plus le nom de l'auteur mais peut-être se reconnaîtra t'il ^^)
Et voilà, en fait le fichier dans lequel ce code était inscrit fonctionne super bien et le tableau "exemple" marche pile poil comme j'aimerai. Seulement, impossible de l'adapter à mon fichier.
Sachant que dans ma feuille j'aurais 2 tableaux distincts et que je ne souhaite utiliser ce code que pour l'un des deux.
Quelqu'un aurait-il donc une solution pour m'aider à reprendre ce code et m'indiquer comment l'adapter à un tableau en particulier ? Ou au moins cibler un endroit où insérer les lignes supplémentaires ?
D'avance merci pour votre aide
A plus !
Sam.
Bonjour,
Le tableau fait référence à un tableau structuré, désigné dans VBA par l'objet ListObjects.
Dans ton code, on fait référence à son index, en l’occurrence le 1er tableau structuré : ListObjects(1)
On peut aussi utiliser le nom du tableau : ListObjects("MonTableau")
Une version commentée du code (avec peut être quelques approximations à certains passages) :
Option Explicit 'Oblige la déclaration de toutes les variables utilisées
Private Sub Worksheet_Change(ByVal Target As Range) 'Macro qui se déclenche lors d'un changement sur la feuille en question
Dim lo As ListObject 'Variable de type tableau structuré
Dim Indx As Long 'Variable de type nombre entier
Dim Message As String, Style As VbMsgBoxStyle, Answer As VbMsgBoxResult, Title As String 'Variables texte (String) utilisées pour l'affichage du message
If Target.Address = "$D$8" Then 'Si la cellule modifiée est D8, alors...
Set lo = Me.ListObjects(1) 'On affecte le 1er tableau structuré à la variable Io
With lo 'Avec ce tableau
If .InsertRowRange Is Nothing Then 'Si le tableau comporte des données
Message = "Vous allez supprimer les données de la table." & vbCrLf 'Ajout du texte du message
Message = Message & "Veuillez confirmer votre souhait."
Style = vbYesNo + vbQuestion 'Ajout des boutons/picto affichés
Title = "Réinitialisation table ?" 'Ajout du titre
Answer = MsgBox(Message, Style, Title) 'Affichage du message
If Answer = vbYes Then .DataBodyRange.Delete 'Si oui, on supprime les données existantes
End If
If Not IsEmpty(Target) Then 'Si la cellule D8 n'est pas vide
If Target.Value = 1 Then 'Si la cellule D8 = 1
.InsertRowRange.Cells(1).Value = 1 'On ajoute une ligne
Else
.Resize lo.Range.Resize(Target.Value + 1)
For Indx = 1 To .ListRows.Count 'Sinon on ajoute autant de lignes que nécessaires
.ListRows(Indx).Range.Cells(1) = Indx
Next Indx
End If
End If
End With
End If
End SubWhaouuu... Ca c'est de la réponse ! Merci beaucoup Pedro !
Effectivement c'est beaucoup plus clair avec tes commentaires ^^
Et le fait de savoir comment "attribuer" un tableau à cette commande réponds parfaitement à ma question.
Encore un grand merci d'avoir pris le temps !
A plus
Bonjour,
Je connais cette procédure (ou du moins je reconnais mon écriture !...).
Il suffit de remplacer :
Set lo = Me.ListObjects(1)par :
Set lo = Range("NomTableau").ListobjectNomTableau est le nom de ton tableau dans la feuille de calcul.
Sinon, InserRowRange = nothing si le tableau comporte des données.
Cdlt.
Salut Jean-Eric !
Oui effectivement j'ai retrouvé ton post ^^
Merci pour l'astuce en tout cas, je suis ravi de pouvoir bénéficier de votre aide si précieuse !