Insertion automatique de lignes en fonction d'une valeur de cellule

Y compris Power BI, Power Query et toute autre question en lien avec Excel
T
ThomasHL
Jeune membre
Jeune membre
Messages : 17
Inscrit le : 24 mai 2019
Version d'Excel : 2016

Message par ThomasHL » 24 mai 2019, 09:58

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
exemple.xlsx
(8.02 Kio) Téléchargé 6 fois
g
gyrus
Membre fidèle
Membre fidèle
Messages : 286
Appréciations reçues : 40
Inscrit le : 8 avril 2019
Version d'Excel : 2013 FR

Message par gyrus » 24 mai 2019, 10:57

Bonjour ThomasHL et bienvenue,

Une proposition avec une procédure évènementielle.

Cordialement.
EXEMPLE.xlsm
(14.26 Kio) Téléchargé 7 fois
T
ThomasHL
Jeune membre
Jeune membre
Messages : 17
Inscrit le : 24 mai 2019
Version d'Excel : 2016

Message par ThomasHL » 27 mai 2019, 07:08

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.
Avatar du membre
James007
Fanatique d'Excel
Fanatique d'Excel
Messages : 12'007
Appréciations reçues : 413
Inscrit le : 30 août 2014
Version d'Excel : 2007 EN

Message par James007 » 27 mai 2019, 07:17

Bonjour,

Dans cette solution .. il ne s'agit pas d'insertion ... :wink:
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
A+

:)

Quand on n’a qu’un marteau, tous les problèmes deviennent des clous…
g
gyrus
Membre fidèle
Membre fidèle
Messages : 286
Appréciations reçues : 40
Inscrit le : 8 avril 2019
Version d'Excel : 2013 FR

Message par gyrus » 27 mai 2019, 08:05

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.
Avatar du membre
Jean-Eric
Fanatique d'Excel
Fanatique d'Excel
Messages : 15'445
Appréciations reçues : 546
Inscrit le : 27 août 2012
Version d'Excel : 365 Insider

Message par Jean-Eric » 27 mai 2019, 08:20

Bonjour,
@ James007,
Ta proposition revisitée !... ::D
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
Jean-Eric

Je ne réponds pas aux M.P. non sollicités.
T
ThomasHL
Jeune membre
Jeune membre
Messages : 17
Inscrit le : 24 mai 2019
Version d'Excel : 2016

Message par ThomasHL » 3 juin 2019, 20:46

Merci à Gyrus, James007 et Jean-Eric, je teste tout cela au plus vite et vous fais mon feedback ;-)
Merci encore de votre aide.
T
ThomasHL
Jeune membre
Jeune membre
Messages : 17
Inscrit le : 24 mai 2019
Version d'Excel : 2016

Message par ThomasHL » 26 juin 2019, 21:24

Jean-Eric a écrit :
27 mai 2019, 08:20
Bonjour,
@ James007,
Ta proposition revisitée !... ::D
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.
T
ThomasHL
Jeune membre
Jeune membre
Messages : 17
Inscrit le : 24 mai 2019
Version d'Excel : 2016

Message par ThomasHL » 26 juin 2019, 21:31

James007 a écrit :
27 mai 2019, 07:17
Bonjour,

Dans cette solution .. il ne s'agit pas d'insertion ... :wink:
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 ;-). Merci à vous.
Avatar du membre
James007
Fanatique d'Excel
Fanatique d'Excel
Messages : 12'007
Appréciations reçues : 413
Inscrit le : 30 août 2014
Version d'Excel : 2007 EN

Message par James007 » 27 juin 2019, 09:01

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 ... ::o ::o ::o
A+

:)

Quand on n’a qu’un marteau, tous les problèmes deviennent des clous…
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message