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.
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.
- Messages
- 4'064
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
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.
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.
- Messages
- 4'064
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
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
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.
- Messages
- 4'064
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
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
- Messages
- 4'064
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
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
Super ça marche dans le fichier test. Par contre lorsque je le mets dans le fichier de travail j'ai le message :
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.
- Messages
- 4'064
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
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é.
- Messages
- 4'064
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
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
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.