Creation d'une ligne d'un onglet à l'autre

Bonjour,
Je suis vraiment très embêté car j'ai bossé toute la journée en m'appuyant sur les cours VBA proposés pour essayer de le faire tout seul mais j'arrive à mes limites et je dois avoir finaliser pour ..demain ...
Voici à quoi je dois arriver : Il y a trois onglets et les uns doivent enrichir les autres.
Si dans la colonne I - Actions à mettre en œuvre ?(orange) des onglets état des lieux 1 ou état des lieux 2, est écrit : OUI alors il faut qu'automatiquement une ligne soit crée dans l'onglet Suivi des actions en reprenant les éléments des colonnes J (description action) et K (PA). La création automatique de cette ligne doit générer automatiquement un numéro à trois chiffres dans la colonne A (N° action) de l'onglet Suivi des actions. Ce même numéro devra être reporté automatiquement dans la colonne L (N° action) de l'onglet état des lieux concerné. Si quelqu'un peut m'aider, vous me sauvez!!!

9modele.xlsx (27.48 Ko)

Bonjour,

Je dirais dans le module ThisWorkbook :

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim LR%, REF%
Application.EnableEvents = False
With Sh
    LR = .Cells(.Rows.Count, 9).End(xlUp).Row
    If Target.Count > 1 Then Exit Sub
    If Not Application.Intersect(Target, .Range("I2:I" & LR)) Is Nothing And Target.Offset(0, 3) = "" And Sh.Name Like "*Etat des lieux*" Then
        If Target = "OUI" Then
            With Worksheets("Suivi des actions ")
                REF = .Cells(.Cells(.Rows.Count, 1).End(xlUp).Row, 1) + 1
                .Cells(.Cells(.Rows.Count, 1).End(xlUp).Row, 1).Offset(1) = REF
            End With
            Target.Offset(0, 3) = REF
        End If
    End If
End With
Application.EnableEvents = True
End Sub

Cdlt,

Merci mais je suis un peu perdu… je mets cette macro VBA où car cela n'a pas l'air de marcher quand j'essaye de la coller sur "Visual Basic"...

Bonjour,

image

Lorsque vous rentrez une valeur en colonne I d'une des deux feuilles Etat des lieux, un numéro est automatiquement incrémenté sur la feuille récap et est repris sur votre feuilles Etat des lieux.

Il me semble que c'est le besoin que vous avez exprimé. Sinon merci de détailler plus précisément.

Cdlt,

Bonjour tout le monde, une proposition (la macro est lancée par le bouton "EXE" (cellule A1) :

38modele.xlsm (29.28 Ko)

Effectivement,en le mettant dans ThisWorkbook, cela marche. Merci beaucoup !!! Il manque juste à ce que les éléments des colonnes J (description action) et K (PA) soient également repris dans l'onglet suivi des actions quand une nouvelle ligne est crée (la macro incrémente juste une ligne avec un numéro avec votre macro).

D'avance merci

Bonjour,

Une seconde proposition :

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim LR%, REF%
Application.EnableEvents = False
With Sh
    LR = .Cells(.Rows.Count, 9).End(xlUp).Row
    If Target.Count > 1 Then Application.EnableEvents = True: Exit Sub
    If Not Application.Intersect(Target, .Range("I2:I" & LR)) Is Nothing And Target.Offset(0, 3) = "" And Sh.Name Like "*Etat des lieux*" Then
        If Target.Offset(, 1) = "" Or Target.Offset(, 2) = "" Then MsgBox "Merci de renseigner les colonnes J et K avant de renseigner cette cellule", vbInformation: Application.Undo
        If Target = "OUI" Then
            With Worksheets("Suivi des actions ")
                REF = .Cells(.Cells(.Rows.Count, 1).End(xlUp).Row, 1) + 1
                .Cells(.Cells(.Rows.Count, 1).End(xlUp).Row, 2) = Target.Offset(, 1)
                .Cells(.Cells(.Rows.Count, 1).End(xlUp).Row, 3) = Target.Offset(, 2)
                .Cells(.Cells(.Rows.Count, 1).End(xlUp).Row, 1).Offset(1) = REF
            End With
            Target.Offset(, 3) = REF
        End If
    End If
End With
Application.EnableEvents = True
End Sub

Comme je ne connais pas l'ordre de remplissage des cellules sur vos feuilles Etat des lieux, j'ai rajouté un contrôle sur le fait que les actions en J et K ai bien été remplies avant d'inscrire OUI dans les actions à mettre en suivi. Dans le cas contraire, un message d'erreur apparaît et annule la saisie de "OUI".

Je vous laisse tester et passer le sujet en résolu ou donner plus de détail sur votre besoin si nécessaire.

Cdlt,

L'ordre de remplissage est :

1- I- Actions à mettre en œuvre ?

2- J Description action

3- K PA

Du coup, si vous pouviez changer le message d'erreur. L'incrémentation de l'onglet suivi des actions des éléments J et K semble fonctionner pour l'onglet état des lieux 1 mais pas pour l'état des lieux 2 (pour cet onglet, il y a effectivement une ligne rajoutée mais pas les champs correspondants à description action et PA).

Merci beaucoup

Bonjour,

Le code fonctionne sur les deux feuilles de la même façon :
- Vous renseignez J et K puis indiquez en I si l'action doit être dans le suivi
- Si J et K sont remplis alors le code s’exécute, sinon, un message d'erreur apparaît et OUI est effacé
- Si J et K sont remplis et que "NON" est renseigné en I alors rien ne se passe
- Si J et K sont remplis et que "NON" passe a "OUI" mais qu'un numéro de suivi est déjà renseigné, rien ne se passe
- Si J et K sont remplis et que "OUI" est renseigné, alors un export des colonnes J et K se met en dernière ligne, colonne B et C du suivi, un numéro d'incrémentation est initialisé sur la base du numéro précédent (je n'ai pas géré le cas où la base de suivi est vide) et reporté en colonne L de l'état des lieux

Il n'y a pas de rétroactivité des références du suivi d'action sur les états des lieux si c'est ce que vous entendez par "L'incrémentation de l'onglet suivi des actions des éléments J et K semble fonctionner pour l'onglet état des lieux 1 mais pas pour l'état des lieux 2 (pour cet onglet, il y a effectivement une ligne rajoutée mais pas les champs correspondants à description action et PA).". C'est à dire que le numéro de suivi enregistré dans le suivi n'est pas reporté dans l'état des lieux car la macro est initialisé à partir du moment où l'on rentre "OUI" en colonne I.

Je me suis rendu compte d'une petite coquille dans le code :

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim LR%, REF%
Application.EnableEvents = False
With Sh
    LR = .Cells(.Rows.Count, 9).End(xlUp).Row
    If Target.Count > 1 Then Application.EnableEvents = True: Exit Sub
    If Not Application.Intersect(Target, .Range("I2:I" & LR)) Is Nothing And Target.Offset(0, 3) = "" And Sh.Name Like "*Etat des lieux*" Then
        If Target.Offset(, 1) = "" Or Target.Offset(, 2) = "" Then MsgBox "Merci de renseigner les colonnes J et K avant de renseigner cette cellule", vbInformation: Application.Undo
        If Target = "OUI" Then
            With Worksheets("Suivi des actions ")
                REF = .Cells(.Cells(.Rows.Count, 1).End(xlUp).Row, 1) + 1
                .Cells(.Cells(.Rows.Count, 1).End(xlUp).Row, 2).Offset(1) = Target.Offset(, 1)
                .Cells(.Cells(.Rows.Count, 1).End(xlUp).Row, 3).Offset(1) = Target.Offset(, 2)
                .Cells(.Cells(.Rows.Count, 1).End(xlUp).Row, 1).Offset(1) = REF
            End With
            Target.Offset(, 3) = REF
        End If
    End If
End With
Application.EnableEvents = True
End Sub

PS : Si jamais la macro plante à un moment, insérez un module au niveau de ma capture d'écran via clic droit sur le menu de gauche > Insertion > Module et collez y le code suivant puis exécutez le :

Sub RESET()
Application.EnableEvents = True
End Sub

En effet si la macro plante en milieu de feuille, alors Application.EnableEvents sera déjà passé à False (2ème ligne de la macro ThisWorkbook) ce qui a pour effet d'empêcher d'autres procédures événementielles afin d'éviter des boucles infinies. Il sera alors nécessaire de le repasser à True via la macro RESET.

Cdlt,

Je vous réponds en rouge dans le texte :

Bonjour,

Le code fonctionne sur les deux feuilles de la même façon :
- Vous renseignez J et K puis indiquez en I si l'action doit être dans le suivi La consigne c'est d'abord renseigner I . Si c'est oui (il y a une action à mettre en place), renseigner J et K. Si c'est non, cela s'arrête là.
- Si J et K sont remplis alors le code s’exécute, sinon, un message d'erreur apparaît et OUI est effacé . Le message d'erreur n'est pas adapté au consigne ci dessus
- Si J et K sont remplis et que "NON" est renseigné en I alors rien ne se passe
- Si J et K sont remplis et que "NON" passe a "OUI" mais qu'un numéro de suivi est déjà renseigné, rien ne se passe
- Si J et K sont remplis et que "OUI" est renseigné, alors un export des colonnes J et K se met en dernière ligne, colonne B et C du suivi, un numéro d'incrémentation est initialisé sur la base du numéro précédent (je n'ai pas géré le cas où la base de suivi est vide) et reporté en colonne L de l'état des lieux

Il n'y a pas de rétroactivité des références du suivi d'action sur les états des lieux si c'est ce que vous entendez par "L'incrémentation de l'onglet suivi des actions des éléments J et K semble fonctionner pour l'onglet état des lieux 1 mais pas pour l'état des lieux 2 (pour cet onglet, il y a effectivement une ligne rajoutée mais pas les champs correspondants à description action et PA).". C'est à dire que le numéro de suivi enregistré dans le suivi n'est pas reporté dans l'état des lieux car la macro est initialisé à partir du moment où l'on rentre "OUI" en colonne I. OK merci

Je me suis rendu compte d'une petite coquille dans le code :

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim LR%, REF%
Application.EnableEvents = False
With Sh
    LR = .Cells(.Rows.Count, 9).End(xlUp).Row
    If Target.Count > 1 Then Application.EnableEvents = True: Exit Sub
    If Not Application.Intersect(Target, .Range("I2:I" & LR)) Is Nothing And Target.Offset(0, 3) = "" And Sh.Name Like "*Etat des lieux*" Then
        If Target.Offset(, 1) = "" Or Target.Offset(, 2) = "" Then MsgBox "Merci de renseigner les colonnes J et K avant de renseigner cette cellule", vbInformation: Application.Undo
        If Target = "OUI" Then
            With Worksheets("Suivi des actions ")
                REF = .Cells(.Cells(.Rows.Count, 1).End(xlUp).Row, 1) + 1
                .Cells(.Cells(.Rows.Count, 1).End(xlUp).Row, 2).Offset(1) = Target.Offset(, 1)
                .Cells(.Cells(.Rows.Count, 1).End(xlUp).Row, 3).Offset(1) = Target.Offset(, 2)
                .Cells(.Cells(.Rows.Count, 1).End(xlUp).Row, 1).Offset(1) = REF
            End With
            Target.Offset(, 3) = REF
        End If
    End If
End With
Application.EnableEvents = True
End Sub

PS : Si jamais la macro plante à un moment, insérez un module au niveau de ma capture d'écran via clic droit sur le menu de gauche > Insertion > Module et collez y le code suivant puis exécutez le :

Sub RESET()
Application.EnableEvents = True
End Sub

En effet si la macro plante en milieu de feuille, alors Application.EnableEvents sera déjà passé à False (2ème ligne de la macro ThisWorkbook) ce qui a pour effet d'empêcher d'autres procédures événementielles afin d'éviter des boucles infinies. Il sera alors nécessaire de le repasser à True via la macro RESET. J'espère pas car je ne suis pas encore très doué sur excel… mais j'apprends grâce à vous

Cdlt, Merci pour tout

Merci pour le retour.

Signé : l'homme invisible.

Bonjour à tous,

Dans ce cas je déclenche l'évènement sur la colonne K > je vérifie que I, J et K sont remplis. Si c'est le cas je vérifie la colonne I pour statuer sur la nécessité de suivre ou non l'action.

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim LR%, REF%
Application.EnableEvents = False
With Sh
    LR = .Cells(.Rows.Count, 9).End(xlUp).Row
    If Target.Count > 1 Then Application.EnableEvents = True: Exit Sub
    If Not Application.Intersect(Target, .Range("K2:K" & LR)) Is Nothing And Target.Offset(0, 1) = "" And Sh.Name Like "*Etat des lieux*" Then
        If Target = "" Or Target.Offset(, -1) = "" Or Target.Offset(, -2) = "" Then
            MsgBox "Merci de renseigner les colonnes I, J et K", vbInformation
            Application.Undo
            Else
            If Target.Offset(, -2) = "OUI" Then
                With Worksheets("Suivi des actions ")
                    REF = .Cells(.Cells(.Rows.Count, 1).End(xlUp).Row, 1) + 1
                    .Cells(.Cells(.Rows.Count, 1).End(xlUp).Row, 2).Offset(1) = Target.Offset(, -1)
                    .Cells(.Cells(.Rows.Count, 1).End(xlUp).Row, 3).Offset(1) = Target
                    .Cells(.Cells(.Rows.Count, 1).End(xlUp).Row, 1).Offset(1) = REF
                End With
                Target.Offset(, 1) = REF
            End If
        End If
    End If
End With
Application.EnableEvents = True
End Sub

Cdlt,

Merci pour tout aux deux contributeurs (désolée pour l'homme invisible, je n'avais pas vu la réponse en amont ) ! les deux solutions sont différentes mais vraiment tops toutes les deux. Je ne sais pas trop laquelle choisir car je vais être amené à rajouter des onglets états des lieux et je ne sais pas laquelle sera la plus facile à modifier sans me planter. Vous en pensez quoi?

Rechercher des sujets similaires à "creation ligne onglet"