Insérer des lignes automatiquent

joelpelle

XLDnaute Junior
Bonjour à toutes et tous,

Je me suis inscrit sur ce forum, car on y retrouve des membres super calés, et ça m'impressionne !
Un peu aussi en désespoir de cause, car totalement néophyte en VBA, je vous explique :
J'ai créé un tableau excel cf document joint, dans lequel je souhaite rajouter automatiquement une ligne quand la dernière cellule d'un endroit précis est remplie, et ce à plusieurs endroits précis du tableau.

Ca fait deux jours que je cherche, :mad: j'ai avancé, je sais insérer une ligne, mais pas trouvé la bonne solution à mon problème (Néophyte je vous dis !).:confused:

Merci pour votre aide précieuse. :)

Cordialement
 

Pièces jointes

  • matrice.xls
    43 KB · Affichages: 73
  • matrice.xls
    43 KB · Affichages: 68
  • matrice.xls
    43 KB · Affichages: 66

Excel-lent

XLDnaute Barbatruc
Re : Insérer des lignes automatiquent

Bonjour et bienvenu sur le forum Joelpelle,

joelpelle à dit:
j'ai avancé, je sais insérer une ligne

Où est ton début de macro? Qu'on puisse le corriger, te conseiller?

N'ayant aucun début de macro, je suis partie d'une feuille blanche et laissé libre court à mon imagination!

Au faite, regarde le fichier ci-joint, j'ai rajouté des commentaires en rouge, à mon avis, tu t'es trompé dans l'adresse des cellules! Pour la macro, j'ai pris celles en rouge.

PS. : La macro dans le fichier ci-joint fait exactement ce que tu as demandé, mais je doute que c'est ce que tu veux vraiment! Tiens nous au courant.

Bonne après midi
 

Pièces jointes

  • matrice complété.zip
    21.8 KB · Affichages: 62
G

Guest

Guest
Re : Insérer des lignes automatiquent

Bonjour et bienvenue pour ce premier post.

Dans le fichier joint, tu trouveras un macro qui ajoute une ligne à une plage nommée en copiant le format de la ligne du dessus.

Tu verras dans le module de la feuille (click-droit sur l'onglet de la feuille puis 'visualiser le code') comment la procédure évènementielle Change appelle la macro.

Je l'ai fait pour la première plage de cellules que j'ai nommée 'ENTREES'. A toi de compléter. Si tu as du mal, reviens nous voir avec ce que tu auras fait.


A+

[Edit] t'avions point vu Exce-Lent, bonjour à toi!
 

joelpelle

XLDnaute Junior
Re : Insérer des lignes automatiquent

Bonjour Excel Lent et Hasco,

Mille mercis pour vos réponses si rapides, un dimanche en plus,

Pour Excel Lent, ta solution décale les autres cellules, donc les codes si on rajoute des lignes à chaque groupe de cellule, ça ne fonctionne plus.

Hasco, c'est exactement ce dont j'ai besoin, un ajout si l'ensemble des lignes est rempli, mais ou dois-je mettre mon code pour le deuxième groupe de cellules "DEPART" ?
Dur dur d'être un néophyte !!!
 
G

Guest

Guest
Re : Insérer des lignes automatiquent

Re bonjour Joel,

Pas pressé de répondre le coco aujourd'hui.;)

Essaye de comprendre comment est appelé la macro 'AjouterLigne' pour la plage 'ENTREES' en sachant que:

1 - la procédure évènementielle 'Private Sub Worksheet_Change(ByVal Target As Range)' est appelée automatiquement lorsqu'une le contenu d'une cellule est changée. Cette dernière est représentée par le paramètre 'Target' passé à la procédure par Excel

2 - qu'il faut comparer l'adresse de Target aux adresse des dernières cellules des plages nommées (Range("ENTREES"), Range("DEPART") etc...

3 - la fonction split(Chaine, séparateur) explose dans un tableau de base 0 (zéro) la 'Chaine' délimitée par le 'séparateur' Les plages ont pour adresse par exemple Feuil1!$D$11:$K$13.

Code:
Split("Feuil1!$D$11:$K$13",":")
donnera un tableau dont l'entrée (0) sera "Feuil1!$D$11" et l'entrée(1) sera "$K$13" (l'adresse de la dernière cellule de la plage)

4 - Il te faudra des If .....Else If ....Else IF ....End IF ou des Select CASE Target.Addresse ....CASE.....CASE....End CASE.

Fait des tests avec ce que tu auras compris et si tu n'y arrives pas joint le fichier avec tes essais.

A+
 

joelpelle

XLDnaute Junior
Re : Insérer des lignes automatiquent

RE bonjour,

je sèche ...

J'ai ajouté la plage "départure" au code de la feuille et ajouté une macro2 qui ne fonctionne pas ! ou qui est décalée lorsque je rajoute des lignes dans ENTREE !

Suis une vraie buse néophyte !!!

Merci pour le temps que vous me consacrez.

Bien cordialement
 

Pièces jointes

  • matrice.zip
    16.4 KB · Affichages: 20
  • matrice.zip
    16.4 KB · Affichages: 23
  • matrice.zip
    16.4 KB · Affichages: 21

Excel-lent

XLDnaute Barbatruc
Re : Insérer des lignes automatiquent

Bonjour Hasco,

Chapeau bas pour tes deux macro! Mais je doute que Joelpelle soit à même d'en comprendre toutes les subtilitées et de pouvoir les modifier!

Surtout qu'il y avait un piège!!!

Dans la zone "DEPART", les cellules des deux dernières colonnes sont fusionnées. Donc si Joelpelle se borne à compléter ta macro comme indiqué, elle ne fonctionnera pas dans ce cas précis!

Car la zone "DEPART" finira colonne K, mais la saisie s'effectue colonne J ;)

Bonjour Joelpelle,

joelpelle à dit:
ta solution décale les autres cellules, donc les codes si on rajoute des lignes à chaque groupe de cellule, ça ne fonctionne plus

En effet, comme demandé (et précisé dans mon post), la macro que j'ai proposé insére une ligne si tu saisie quelque-chose en K13, K17 et I21!

Alors forcément, si la macro rajoute une ligne, les cellules K13 ou K17 ou I21 ne représenterons plus les dernières lignes de chaque zone!

Content d'avoir vu que tu avais compris où je voulais en venir!

JoelPelle, voici ci-joint le fichier de Hasco complété.

Normalement, cette fois-ci cela devrait correspondre à tes attentes ;)

Bonne soirée à tous

Edition : je t'ai encore battu sur la ligne Hasco :) Content de voir que même si ma solution est loin d'être à la hauteur de la tienne, elle résous le piège quand même!

Au lieu de modifier le code en rajoutant Offset(, -1), j'ai modifié la plage de cellule portant le nom DEPARTURE (dans ta version et DEPART dans la mienne)!
 

Pièces jointes

  • Ligne de référence qui bouge.xls
    47 KB · Affichages: 51
Dernière édition:
G

Guest

Guest
Re : Insérer des lignes automatiquent

RE,

Il y avait un petit piège.

Ta dernière cellule de la plage "DEPARTURE" est fusionnée avec la cellule de la colonne précédente. Donc celle qui change de valeur est Jx (x=numéro de ligne).

Remède:

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
    'Comparer l'adresse de la cellule changée (Target)
    'avec l'adresse de la dernière cellule de la plage
    'Nomméee 'ENTREES'
    If Target.Address = Split(Range("ENTREES").Address, ":")(1) Then
        If Target <> "" Then AjouterLigne "ENTREES"
    ElseIf Target.Address = Split([SIZE=3][COLOR=red]Range("DEPARTURE").[U]Offset(, -1)[/U][/COLOR][/SIZE].Address, ":")(1) Then
        If Target <> "" Then AjouterLigne "DEPARTURE"
    End If
End Sub
On décale (offset) la plage d'une cellule vers la gauche pour trouver l'adresse de la cellule changée.

Lorsqu'on dit que les cellules fusionnées sont cause d'erreurs!!!!:D

J'ai également rajouté quelques lignes dans la macros "AjouterLigne":

Code:
Sub AjouterLigne(NomPlage As String)
    On Error Resume Next
    Dim plage As Range
    Set plage = Range(NomPlage)
    If Err.Number > 0 Then
        MsgBox "Vérifiez le nom de la plage '" & NomPlage & "' et re-définissez le", vbInformation, "AjouterLigne"
        Exit Sub
    End If
 
    Err.Clear
   [COLOR=red] On Error GoTo FinAjoutLigne[/COLOR]
[COLOR=red] [/COLOR]
[COLOR=red]    'Désactiver la gestion évènementielle pour éviter les appels récursif[/COLOR]
[COLOR=red]    Application.EnableEvents = False[/COLOR]
[COLOR=red] [/COLOR]
    'Insert une ligne entière
    plage.Rows(plage.Rows.Count + 1).EntireRow.Insert xlShiftDown
 
    'Copy le format de la ligne du dessus (comme CTRL+B)
    plage.Rows(plage.Rows.Count).AutoFill plage.Rows(plage.Rows.Count).Resize(2), xlFillFormats
 
    'redéfinition de la nouvelle plage
    Set plage = plage.Resize(plage.Rows.Count + 1)
 
    'Redéfinition du nom
    Application.Names(NomPlage).RefersTo = "='" & plage.Parent.Name & "'!" & plage.Address
 
[COLOR=red]FinAjoutLigne:[/COLOR]
[COLOR=red]  'Rétablir la gestion évènementielle[/COLOR]
[COLOR=red]  Application.EnableEvents = True[/COLOR]
 
[COLOR=red]  'Signaler si une erreur s'est produite[/COLOR]
[COLOR=red]  If Err.Number > 0 Then[/COLOR]
[COLOR=red]      MsgBox "Une erreur s'est produite lors de l'ajout de la ligne:" & vbCrLf & vbCrLf & _[/COLOR]
[COLOR=red]          Err.Number & ": " & Err.Description, vbExclamation, "AjouterLigne"[/COLOR]
[COLOR=red]  End If[/COLOR]
End Sub

A+
 
G

Guest

Guest
Re : Insérer des lignes automatiquent

re,

C'est vrai que t'es pas une buse. Ou alors nous le sommes tous, moi le premier qui me comporte souvent comme tel. Mais ceci n'est pas bien grave quand on a envie d'avancer.

A++
 

joelpelle

XLDnaute Junior
Re : Insérer des lignes automatiquent

Bon je ne vais pas arrêter de faire des "Re"

Un petit break, et j'ai trouvé la solution, qui en fait était trés facile à trouver.

J'ai été trompé par les macro 1 et 2 qui trainaient par là et non utilisées, puis par un truc tout bête. :D

La macro ne fonctionne pas sur deux cellules fusionnées, d'où ma question ;
Comment faire si je veux que cela fonctionne avec 2 cellules fusionnées. :confused:

Et pour finir, comment rendre le dernier champ obligatoire afin de faire fonctionner la macro systématiquement, ou bien alors s'il y a au moins une entrée sur cette même ligne.

Merci à vous qui m'avez bien aidé. :)

Cordialement
 

Pièces jointes

  • matrice(2).zip
    17.3 KB · Affichages: 37

joelpelle

XLDnaute Junior
Re : Insérer des lignes automatiquent

Super les gars,

Bravo à vous deux, ça donne envie de progresser !

Juste une petite remarque HASCO, la macro ajouterligne doit avoir un petit bug, car pas d'action (Oups !!!)

Sinon c'est super.

Une petite question (je sais que j'exagère ! ) mais si je veux qu'un nouvelle ligne se crée dessous dès qu'il y a une entrée dans la ligne, au cas où un utilisateur ne renseigne pas le dernier champ, quel serait le code du Worksheet_Change ? :eek:

Un grand merci à vous, ça m'aide beaucoup, et heureux de constater qu'il y a des gars comme vous qui donnent de leur temps pour aider les autres.

Merci merci,

Bien cordialement :)
 
G

Guest

Guest
Re : Insérer des lignes automatiquent

re,

Juste une petite remarque HASCO, la macro ajouterligne doit avoir un petit bug, car pas d'action (Oups !!!)

Précise ' car pas d'action ' parce chez moi cela fonctionne!

mais si je veux qu'un nouvelle ligne se crée dessous dès qu'il y a une entrée dans la ligne, au cas où un utilisateur ne renseigne pas le dernier champ, quel serait le code du Worksheet_Change ? :eek:

cela pourrait-être quelque chose comme ceci:
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
 
    'Si la cellule est vide->sortir
    If IsEmpty(Target) Then Exit Sub
 
    'Vérifier si on est dans la dernière ligne d'une plage
    If Union(Target, Range("ENTREES").Rows(Range("ENTREES").Rows.Count)).Address = Range("ENTREES").Rows(Range("ENTREES").Rows.Count).Address Then
        AjouterLigne "ENTREES"
    End If
End Sub

Mais tu risques comme dans la solution précédente, de te retrouver avec beaucoup de lignes vides si l'utilisateur se trompe et décide d'effacer les données qu'il a rentrées.

A mon avis, il serait préférable d'ajouter un bouton de commande "Ajouter une ligne" en face de chaque dernière ligne qui obligerait l'utilisateur à une action plus réfléchie.

A+
 
Dernière modification par un modérateur:

joelpelle

XLDnaute Junior
Re : Insérer des lignes automatiquent

Merci HASCO,

Je vais essayer de répondre :

J'ai fait un copier/coller du code Ajouterligne, et lorsque j'entre une donnée dans la dernière cellule, une ligne ne se crée pas dessous.

Par contre, le nouveau code que tu m'as fourni pour ajouter une ligne marche nickel :rolleyes:

Mais tu risques comme dans la solution précédente, de te retrouver avec beaucoup de lignes vides si l'utilisateur se trompe et décide d'effacer les données qu'il a rentrées.

Un petit code pour effacer les lignes vides alors ??? ( oui j'abuse ) ou alors comment insérer un bouton "Ajouter ligne" pour qu'il soit toujours en regard de la dernière ligne (plus dur non ? ) :D

Un grand merci à toi.

Trés cordialement

Joël
 

Membres actuellement en ligne

Statistiques des forums

Discussions
312 520
Messages
2 089 298
Membres
104 092
dernier inscrit
karbone57