Ajout de lignes dans un tableau par rapport à la valeur d'une colonne

Salut le forum,

Je voudrais savoir s’il est possible d’insérer des lignes lorsque j’augmente le chiffres de la colonne I de façon à ce que je retrouve dans ces nouvelles lignes les mêmes infos que dans les colonnes A à I et en ajoutant dans la colonne J les nouveaux numéros des nouvelles lignes. Les colonnes suivantes doivent être vides d’information. Actuellement je procède manuellement en faisant un copier et « coller insérer » le nombre de fois que je dois ajouter des lignes. Ma méthode marche mais elle est fastidieuse et si je pouvais avoir le même résultat d’une manière automatique ça serait mieux.

Pour expliquer ma demande je prends un exemple par rapport aux infos mises dans le fichier joins. Par défaut le chiffre en colonne B et en colonne I sont identiques au départ. La colonne B est le nombre réel de place et celui de la colonne I est le nombre de candidatures. Il arrive souvent que j’ai plus de candidats que de place donc le chiffre de la colonne I change. Supposons que pour la "formation 2" code WY24 (code unique pour cette formation) où j’ai 3 places au départ je me retrouve avec 4 candidatures. A ce moment-là le chiffre de la colonne I passe de 3 à 4 et je dois créer une nouvelle ligne comportant les mêmes infos des colonnes A à I et en mettant « N°4 » en colonne J. Le reste des colonnes des lignes ajoutées sont vides d’information et seront complétées avec les informations du 4 e candidat manuellement.

J’espère que j’ai été pas trop brouillon dans mes explications.

Cordialement et merci par avance à ceux qui prendront du temps à étudier cette demande.

18tableau-test.xlsm (27.55 Ko)

En complément à ma demande la macro "Sub FusionsEtClassement()" du fichier que j'ai joins me fait presque le travail mais ce qui ne va pas c'est quand j'augmente le chiffre de la colonne I, la macro m'ajoute bien la ou les lignes supplémentaires mais me décale les numéros de candidature de la colonne J ce qui rend la lecture de mon tableau incompréhensible.

Bonjour,

ci-jointe une proposition via code associé à Feuil1.

Le changement du chiffre en colonne I insère automatiquement les lignes.

Le chiffre s'ajuste automatiquement si l'on supprime des lignes.

24tableau-test1.xlsm (40.25 Ko)

Salut thev

Super ta macro mais il ne faut pas que la valeur de la colonne B change quand je modifie celle de la colonne I. La colonne B est le nombre de place initial qui bouge rarement contrairement à la valeur de I qui elle correspond au nombre de candidature.

Est-ce qu'on peut "corriger" ce petit détail et est-ce qu'on peut faire fonctionner la macro plutôt par un bouton que par "Private Sub Worksheet_Change(ByVal Target As Range)" ?

En effet j'ai déjà un "Private Sub Worksheet_Change(ByVal Target As Range)" dans mon fichier original et j'ai peur d'éventuel conflit. Pour info je te mets mon "Private Sub Worksheet_Change(ByVal Target As Range)" :

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim r As Range, d, t, i&, derln&
    derln = Range("A" & Rows.Count).End(xlUp).Row

   Application.ScreenUpdating = False

    If Not Intersect(Target, Range("G3:H" & derln)) Is Nothing Then
        For i = 3 To derln
            If Range("G" & i) <> "" Then
                If Not IsDate(Range("G" & i)) Or Not IsDate(Range("H" & i) + 1) Then
                    MsgBox "Date incorrecte à la ligne " & i, 16
                    Range("G" & i & ":H" & i).Select
                    Exit Sub
                ElseIf Year(Range("G" & i)) < 1900 Or Year(Range("H" & i)) < 1900 Then
                    MsgBox "Saisie de date incorrecte à la ligne " & i, 16
                    Range("G" & i & ":H" & i).Select
                    Exit Sub
                ElseIf Range("G" & i) > Range("H" & i) Then
                    MsgBox "Erreur de saisie à la ligne " & i & Chr(13) & _
                        "La date de début ne peut pas être postérieure à celle de fin.", 16
                    Range("G" & i & ":H" & i).Select
                    Exit Sub
                End If
            End If
        Next i
    End If

'Saisie du numéro  automatiquement si souhaitez

 If Target.Row < 3 Then Exit Sub
    If Target.Column <> 18 Then GoTo suite 'Exit Sub
    If Target.Count > 1 Then GoTo suite 'Exit Sub

    If Target.Value = "En cours" Or Target.Value = "En cours (ANFE)" Then

        If MsgBox("Voulez-vous copier le numéro de FUD", vbYesNo) = vbNo Then Exit Sub

        Application.EnableEvents = False

            If Target.Value = "En cours" Then

            Cells(Target.Row, 24).Value = InputBox("Saisir le numéro")
            Else
            Cells(Target.Row, 25).Value = InputBox("Saisir le numéro ANFE")
            End If

        End If

    Application.EnableEvents = True

suite:

    If Target.Row < 3 Or Target.Column < 11 Or (Target.Column > 14 And Target.Column < 19) Or Target.Column > 19 Then Exit Sub

        d = Date: t = Time
        For Each r In Target.Rows
               If Me.Cells(r.Row, 12) <> "" Or Me.Cells(r.Row, 13) <> "" Or Me.Cells(r.Row, 14) <> "" Or Me.Cells(r.Row, 19) <> "" Then
                Me.Cells(r.Row, 33).Value = d
                Me.Cells(r.Row, 34).Value = t
                Me.Cells(r.Row, 40).ClearContents
            Else
                Me.Cells(r.Row, 33).Resize(, 2).ClearContents
            End If
        Next r

   Application.ScreenUpdating = True

End Sub

Sinon super ta macro.

Cordialement.

Bonsoir,

.

La colonne B est le nombre de place initial qui bouge rarement contrairement à la valeur de I qui elle correspond au nombre de candidature.

Il suffit de remplacer la formule par une valeur fixe.

En effet j'ai déjà un "Private Sub Worksheet_Change(ByVal Target As Range)" dans mon fichier original et j'ai peur d'éventuel conflit. Pour info je te mets mon "Private Sub Worksheet_Change(ByVal Target As Range)" :

Je ne pense pas qu'il y ait conflit car :

1- tout est enclosé par un IF

2- la seule variable commune est i mais elle est initialisée dans les 2 codes

Est-ce qu'on peut "corriger" ce petit détail et est-ce qu'on peut faire fonctionner la macro plutôt par un bouton que par "Private Sub Worksheet_Change(ByVal Target As Range)" ?

ci-jointe proposition de fonctionnement avec double-clic sur la cellule sélectionnée

8tableau-test2.xlsm (38.02 Ko)

Salut thev,

Suite à ta réponse

Je ne pense pas qu'il y ait conflit car :

1- tout est enclosé par un IF

2- la seule variable commune est i mais elle est initialisée dans les 2 codes

j'ai intégré tes lignes de codes dans la macro "Private Sub Worksheet_Change(ByVal Target As Range)" que j'ai mis dans le ficher en PJ mais ce que je ne comprends pas c'est que l'action de la macro se fait très bien qu'une seule fois ensuite rien se passe. Il faut que je referme le fichier puis je l'ouvre de nouveau pour que ça remarche une fois seulement. Est-ce que tu peux me dire ce qui ne va pas car la macro "Private Sub Worksheet_Change(ByVal Target As Range)" doit exécuter plusieurs actions.

Cordialement.

mais ce que je ne comprends pas c'est que l'action de la macro se fait très bien qu'une seule fois ensuite rien se passe.

C'est dû à une instruction mal placée de désactivation des événements. Je l'ai donc remise à sa place.

Il manquait aussi la variable définie au niveau du module: I_adresse.

Attention à l'indentation du code que j'ai actualisée pour une bonne lecture.

ci-jointe donc nouvelle version

6tableau-test3.xlsm (40.64 Ko)

Merci pour la correction mais la macro bug cf image ci-dessous et excel tourne en rond au point que je ne peux même pas fermer le fichier :

msg erreur

Qu'est-ce que tu veux dire par :

Attention à l'indentation du code que j'ai actualisée pour une bonne lecture.

Cordialement.

Merci pour la correction mais la macro bug cf image ci-dessous et excel tourne en rond au point que je ne peux même pas fermer le fichier

Forcément car je n'avais pas vu que les instructions concernant la désactivation et activation des événements avaient été mis en commentaire.

Qu'est-ce que tu veux dire par :

Attention à l'indentation du code que j'ai actualisée pour une bonne lecture.

Alignement correct des if .. elseif .. end if et des for … next

ci-jointe correction

4tableau-test4.xlsm (40.49 Ko)

Super ça marche dans le fichier test. Par contre lorsque je le mets dans le fichier de travail j'ai le message :

msg erreur bis

lorsque je change la valeur de la colonne I et je dois cliquer autant de fois qu'il y a de ligne déjà renseignées pour la formation concernée avant que la ou les nouvelles lignes s'insèrent. En conclusion la macro marche bien lorsque j'augmente le chiffre dans la colonne I mais j'ai un message d'avertissement. Je ne comprends pas pourquoi.

Merci pour l'explication de "l'indentation".

Cordialement.

Salut thev

La nuit portant conseil, j'ai trouvé la parade pour le message en mettant :

Application.DisplayAlerts = False

Par contre maintenant pour l'ajout de ligne c'est OK mais avant d'ajouter "Application.DisplayAlerts = False" lorsque je supprimé la ou les ligne le chiffre d ela colonne "I3 s'ajuster automatiquement ce qui été pas mal. Maintenant il ne s'ajuste plus.

Je ne comprends pas. Je te mets le nouveau fichier test avec la modif "Application.DisplayAlerts = False" que j'ai mise.

Cordialement.

Bonjour,

Essayer cette nouvelle version

5tableau-test5.xlsm (41.17 Ko)

Salut thev,

Ta macro marche mais seulement si je la mets au début de toutes les macro de la feuille comme dans le fichier ""Tableau test6bis" joint . Si je la mets à la fin comme dans le fichier "Tableau test6" en PJ, je suis obligé de rajouter la variable I et lorsque je supprime une ligne la valeur dans la colonne I ne change pas.

Conclusion je mets le sujet en résolu mais ce qui serait intéresant de comprendre c'est pourquoi le positionnement de la macro entraine ces "bug".

Merci thev pour le temps que tu m'as consacré.

5tableau-test6.xlsm (42.06 Ko)

Si je la mets à la fin comme dans le fichier "Tableau test6" en PJ, je suis obligé de rajouter la variable I

Il ne faut pas rajouter la variable I_adresse dans les procédures car elle doit être définie comme variable de module (cad avant toutes les procédures) pour que sa valeur soit conservée au terme de chaque procédure.

ci-jointe version corrigée

10tableau-test7.xlsm (44.32 Ko)

OK j'ai compris. Merci.

Salut Thev,

J’ai inséré ta macro dans mon fichier de travail et là pas de problème (merci encore). Tes macros font leur travail cependant je rencontre un petit soucis surement dû à une interaction entre les deux procédures « Private Sub Worksheet_SelectionChange(ByVal Target As Range) » et « Private Sub Worksheet_Change(ByVal Target As Range) » et la macro « Sub FusionsEtClassement() » dans le module1.

Je m’explique.

Lorsque je lance la macro « Sub FusionsEtClassement() » dans mon fichier de travail qui comporte actuellement plus de 5000 lignes elle met 1’50'' » pour s’exécuter or que si je désactive (manuellement en mettant une apostrophe devant le nom) les procédures « Private Sub Worksheet_SelectionChange(ByVal Target As Range) » et « Private Sub Worksheet_Change(ByVal Target As Range) », la macro s’exécute en 50’’ ». En conclusion je perds presque 50 secondes à chaque fois que je lance la macro.

La question c’est à quoi est dû ce problème de ralentissement et pour y remédier est-il possible de désactiver les procédures « Private Sub Worksheet_SelectionChange(ByVal Target As Range) » et « Private Sub Worksheet_Change(ByVal Target As Range) » au lancement de la macro « Sub FusionsEtClassement() » ce qui règlerait le problème ?

Cordialement.

PS. Dans le dernier fichier que tu m’as envoyé tu as dans le module la macro « Sub FusionsEtClassement() »

C'est bon j'ai trouvé une solution à mon problème. Je ne sais pas si c'est la meilleur mais je n'ai plus le problème d'une exécution de 50 secondes supplémentaires.

J'ai ajouté dans le module1 la macro :

Sub Init_fusionEtClassement()
Application.EnableEvents = False
   FusionsEtClassement
Application.EnableEvents = True
End Sub

que j'exécute à la place de lancer directement la macro "Sub Init_fusionEtClassement()"

Je ne serai pas pourquoi j'avais cette perdre de temps mais le principal c'est q'y avoir remédié.

Cordialement.

Bonjour le forum,

Je reviens sur ce sujet juste pour un complément d’information. Est-il possible que la macro « Private Sub Worksheet_Change(ByVal Target As Range) » qui fait très bien son travail pour insérer une ou des nouvelles lignes lorsque la valeur de la colonne I change puisse en même temps que cette insertion copier les valeurs des colonnes T et U et les formules des colonnes AA à AD dans la ou les nouvelles lignes insérer ?

Où d'une manière différente est-ce qu'elle peut insérer la ou les nouvelles lignes en copiant les valeurs de la dernière ligne sauf celles des colonnes K à S quand il y en a ?

Cordialement.

Bonjour,

Je clôture cette question pour laquelle je pose une nouvelle question.

Cordialement.

Rechercher des sujets similaires à "ajout lignes tableau rapport valeur colonne"