Insertion automatique de lignes en fonction d'une valeur de cellule
Bonjour,
Je souhaite insérer des lignes de façon automatique en fonction de la valeur d'une cellule prédéfinie. En outre, je souhaiterai que le contenu d'une cellule de ces lignes insérées soit défini par avance. Exemple dans le fichier joint, si j'inscris la valeur "oui" en B3 et le résultat est la création de 4 lignes dont le contenu de la cellule A4, A5, A6 et A7 est respectivement "Enfant 1", "Enfant 2", "Enfant 3", "Enfant 4".
Je vous remercie de votre aide.
A bientôt
Bonjour ThomasHL et bienvenue,
Une proposition avec une procédure évènementielle.
Cordialement.
Bonjour Gyrus,
Merci pour ce retour qui répond à mon besoin. Néanmoins, existe il une solution pour obtenir la réversibilité de l'action d'insertion. EN bref, si j'indique "oui" les lignes s'insèrent, si j'indique "non", elles disparaissent ?
Merci à vous et bonne journée.
Bonjour,
Dans cette solution .. il ne s'agit pas d'insertion ...
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub
If Target.Address <> "$B$3" Then Exit Sub
Application.EnableEvents = False
If UCase(Target.Value) = "OUI" Then
Target.Offset(1, -1) = "Enfant 1"
Target.Offset(2, -1) = "Enfant 2"
Target.Offset(3, -1) = "Enfant 3"
Target.Offset(4, -1) = "Enfant 4"
Else
Range(Target.Offset(1, -1), Target.Offset(4, -1)).ClearContents
End If
Application.EnableEvents = True
End Sub
En espèrant que cela t'aide
Bonjour à tous,
Essaye comme cela
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Integer
If Target.Count > 1 Then Exit Sub
If Not Application.Intersect(Target, Range("B1:B1000")) Is Nothing Then
Application.EnableEvents = False
If UCase(Target.Value) = "OUI" And Target.Offset(0, -1) = "Mariés" Then
Target.Offset(1).Resize(4).EntireRow.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
Target.Offset(1, -1) = "Enfant 1"
Target.Offset(2, -1) = "Enfant 2"
Target.Offset(3, -1) = "Enfant 3"
Target.Offset(4, -1) = "Enfant 4"
ElseIf (UCase(Target.Value) = "NON" Or Target.Value = "") And Target.Offset(0, -1) = "Mariés" Then
For i = 4 To 1 Step -1
If Left(Target.Offset(i, -1), 6) = "Enfant" Then Target.Offset(i, -1).EntireRow.Delete
Next i
End If
Application.EnableEvents = True
End If
End Sub
Cordialement.
Bonjour,
@ James007,
Ta proposition revisitée !...
Bon je vais prendre un café.
Bonne journée.
Cdlt.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim tbl As Variant
If Target.Address = "$B$3" And Target.CountLarge = 1 Then
If LCase$(Target.Value) = "oui" Then
tbl = Application.Transpose(Array("Enfant 1", "Enfant 2", "Enfant 3", "Enfant 4"))
Me.Cells(4, 1).Resize(4).Value = tbl
Else
Me.Cells(4, 1).Resize(4).Value = vbNullString
End If
End If
End Sub
Merci à Gyrus, James007 et Jean-Eric, je teste tout cela au plus vite et vous fais mon feedback
Merci encore de votre aide.
Bonjour,
@ James007,
Ta proposition revisitée !...
Bon je vais prendre un café.
Bonne journée.
Cdlt.
Private Sub Worksheet_Change(ByVal Target As Range) Dim tbl As Variant If Target.Address = "$B$3" And Target.CountLarge = 1 Then If LCase$(Target.Value) = "oui" Then tbl = Application.Transpose(Array("Enfant 1", "Enfant 2", "Enfant 3", "Enfant 4")) Me.Cells(4, 1).Resize(4).Value = tbl Else Me.Cells(4, 1).Resize(4).Value = vbNullString End If End If End Sub
Bonjour Jean Eric,
Je vous remercie pour cette macro qui répond à mon besoin.
En complément, si je souhaite que les lignes et cellules créés, ici Enfant 1, Enfant 2, etc... soient des listes déroulantes, que faudrait il faire ?
Pourrait-on imaginer qu'en cellule A3, on définisse une question et qu'en B3 la réponse soit un nombre (dans une liste déroulante de 1 à 10. En fonction du chiffre choisit, autant de lignes se créent à partir de A4 comportant chacune une liste déroulante dont le contenu serait prédéfini.
Merci pour votre aide précieuse qui me permet d'avancer dans mon projet de tableur automatisé.
Bien à vous.
Bonjour,
Dans cette solution .. il ne s'agit pas d'insertion ...
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Count > 1 Then Exit Sub If Target.Address <> "$B$3" Then Exit Sub Application.EnableEvents = False If UCase(Target.Value) = "OUI" Then Target.Offset(1, -1) = "Enfant 1" Target.Offset(2, -1) = "Enfant 2" Target.Offset(3, -1) = "Enfant 3" Target.Offset(4, -1) = "Enfant 4" Else Range(Target.Offset(1, -1), Target.Offset(4, -1)).ClearContents End If Application.EnableEvents = True End Sub
En espèrant que cela t'aide
Merci James007, cela répond à mes attentes. J'ai posté un autre problème dans mes remerciements à Jean Eric, si vous avez un moment pour y répondre
Bonjour,
Pourrait-on imaginer qu'en cellule A3, on définisse une question et qu'en B3 la réponse soit un nombre (dans une liste déroulante de 1 à 10. En fonction du chiffre choisit, autant de lignes se créent à partir de A4 comportant chacune une liste déroulante dont le contenu serait prédéfini.
On peut tout imaginer ...!!!
Et avec Excel ... on peut tout réaliser ...
Encore faudrait-il que tu connaisses tes propres besoins ...
Dans le cas précis ... il suffit de tout recommencer à zèro ...
Bonjour,
Pourrait-on imaginer qu'en cellule A3, on définisse une question et qu'en B3 la réponse soit un nombre (dans une liste déroulante de 1 à 10. En fonction du chiffre choisit, autant de lignes se créent à partir de A4 comportant chacune une liste déroulante dont le contenu serait prédéfini.
On peut tout imaginer ...!!!
Et avec Excel ... on peut tout réaliser ...
Encore faudrait-il que tu connaisses tes propres besoins ...
Dans le cas précis ... il suffit de tout recommencer à zèro ...
Bonjour,
Je souhaiterai qu'à la réponse "Oui" en B2, la ligne 3 s'incrémente et propose une liste déroulante des actions de maintenance connues dans la base de données (onglet BD). A chaque saisie d'une nouvelle action, une ligne s"incrément en dessous et propose une nouvelle liste déroulante construite à partie de la même base de données. Ainsi de suite...
Merci de votre aide.
Bonjour,
Sans doute ... au risque de me répéter ...
Il suffit ... dans le cas précis ... de tout recommencer à zèro ...
Bonjour,
J'avais bien compris, donc pouvez vous m'aider ?
Merci.
Bonjour,
Un exemple basé sur le post précédent avec le nombre d'enfants !...
A adapter.
Cdlt.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim lastRow As Long, lRow As Long, i As Long
If Target.Address = "$B$3" And Target.CountLarge = 1 Then
With Me
lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
If lastRow > 3 Then .Cells(4, 1).Resize(lastRow - 3, 2).ClearContents
lRow = 4
If Not IsEmpty(Target) Then
For i = 1 To Target.Value
.Cells(lRow, 1) = "Enfant " & i
lRow = lRow + 1
Next i
End If
End With
End If
End Sub
Bonjour,
Un exemple basé sur le post précédent avec le nombre d'enfants !...
A adapter.
Cdlt.
exemple.xlsm
Private Sub Worksheet_Change(ByVal Target As Range) Dim lastRow As Long, lRow As Long, i As Long If Target.Address = "$B$3" And Target.CountLarge = 1 Then With Me lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row If lastRow > 3 Then .Cells(4, 1).Resize(lastRow - 3, 2).ClearContents lRow = 4 If Not IsEmpty(Target) Then For i = 1 To Target.Value .Cells(lRow, 1) = "Enfant " & i lRow = lRow + 1 Next i End If End With End If End Sub
Bonjour, c'est extactement ce que je recherche.
Pourrait on imaginer la création d'une liste déroulante, dont le contenu serait défini par ailleurs (exemple age), en face (en B4, B5, etc...) de chaque cellule "Enfant" nouvellement incrémenté ?
Je vous remercie pour votre aide.
Bonjour, c'est extactement ce que je recherche.
Pourrait on imaginer la création d'une liste déroulante, dont le contenu serait défini par ailleurs (exemple age), en face (en B4, B5, etc...) de chaque cellule "Enfant" nouvellement incrémenté ?
Je vous remercie pour votre aide.
Bonjour,
Plus de doute possible ... après 17 messages ...
On peut tout imaginer ...!!!
Et avec Excel ... on peut tout réaliser ...
Encore faudrait-il que tu connaisses tes propres besoins ...
Bonjour,
Un exemple basé sur le post précédent avec le nombre d'enfants !...
A adapter.
Cdlt.
exemple.xlsm
Private Sub Worksheet_Change(ByVal Target As Range) Dim lastRow As Long, lRow As Long, i As Long If Target.Address = "$B$3" And Target.CountLarge = 1 Then With Me lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row If lastRow > 3 Then .Cells(4, 1).Resize(lastRow - 3, 2).ClearContents lRow = 4 If Not IsEmpty(Target) Then For i = 1 To Target.Value .Cells(lRow, 1) = "Enfant " & i lRow = lRow + 1 Next i End If End With End If End Sub
Bonjour Jean Eric,
Si je souhaite que le choic du nombre d'enfants se fasse en B70 et que la liste des Enfants apparaissent en A71, quels sont les paramètres à modifier ?
Je vous remercie pour votre aide.
Bonjour,
Ton fichier en retour.
Cdlt.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim lastRow As Long, lRow As Long, i As Long
Const RW As Long = 70
If Target.Address = "$B$70" And Target.CountLarge = 1 Then
With Me
lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
If lastRow > RW Then .Cells(RW, 1).CurrentRegion.Offset(1).ClearContents
lRow = RW + 1
If Not IsEmpty(Target) Then
For i = 1 To Target.Value
.Cells(lRow, 1) = "Enfant " & i
lRow = lRow + 1
Next i
End If
End With
End If
End Sub
Bonjour,
Ton fichier en retour.
Cdlt.
exemple.xlsm
Private Sub Worksheet_Change(ByVal Target As Range) Dim lastRow As Long, lRow As Long, i As Long Const RW As Long = 70 If Target.Address = "$B$70" And Target.CountLarge = 1 Then With Me lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row If lastRow > RW Then .Cells(RW, 1).CurrentRegion.Offset(1).ClearContents lRow = RW + 1 If Not IsEmpty(Target) Then For i = 1 To Target.Value .Cells(lRow, 1) = "Enfant " & i lRow = lRow + 1 Next i End If End With End If End Sub
Bonjour,
Merci pour la réponse.
Savez vous comment introduire des listes déroulantes en B71, B72, etc... en face des cellules A71, A72, etc... générées ?
Un grand merci encore.