Insérer automatiquementune ligne en dessous

Résolu
tryexcel Messages postés 11 Date d'inscription   Statut Membre Dernière intervention   -  
tryexcel Messages postés 11 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

J'ai seulement quelques notions en VBA c'est pour cela que j'aurai besoin d'un peu d'aide pour une formule que je souhaite mettre en place.

Je souhaite insérer une ligne de manière automatique à chaque fois que la cellule du dessus est non vide.

En bref je souhaite que :

Si cellule "X" = non vide alors insertion d'une nouvelle ligne en dessous qui prend en compte les formules de la ligne du dessus.

Donc la nouvelle ligne insérée devra comporter les formules de la ligne du dessus

J'espère avoir été claire.. je remercie par avance la personne qui saura m'aider sur le sujet :)

2 réponses

Theo.R Messages postés 575 Date d'inscription   Statut Membre Dernière intervention   31
 
Bjr,

Une piste :
Sub test()

Dim DernLigne As Long
DernLigne = Range("A" & Rows.Count).End(xlUp).Row

For i = DernLigne to 1 Step -1

If Cells(i,1).value <> "" Then

Rows(i).Copy
Rows(i + 1).Insert Shift:=xlDown

End If

Next i

End Sub
0
tryexcel Messages postés 11 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour Théo,

J'ai rajouté une photo pour que tu visualises mieux ce que je cherche. Les cellules vides de la colonne C contiennent des listes déroulantes. Si je sélectionne une donnée, je voudrai qu'une ligne en dessous se rajoute. or il faut que sur la ligne total l'ensemble des données se soient cumulées.

Je débute en VBA, peux tu m'expliquer le code ?
0
Theo.R Messages postés 575 Date d'inscription   Statut Membre Dernière intervention   31
 
Ok, alors pour l'explication de mon 1er code :
Sub test()

'On définit par DernLigne la dernière ligne dont la cellule A est non vide, cela constituera la fin de la boucle qui suit
Dim DernLigne As Long
DernLigne = Range("A" & Rows.Count).End(xlUp).Row

For i = DernLigne to 1 Step -1 'On utilise ici une boucle de type For i = a to b (....) Next i, la particularité est que le pas n'est pas 1 comme par défaut mais -1. En clair on va de DernLigne vers 1 dans l'ordre décroissant (DernLigne>1).
'La boucle décroissante est pratique pour un code qui ajoute/supprime des lignes, sinon la variable peut ne plus correspondre à ce qu'on cherche.

If Cells(i,1).value <> "" Then 'Cells(i,1).value est la valeur de la cellule Ai, la fonction If (=Si) s'active lorsque Ai n'est pas vide (<>"")

Rows(i).Copy 'Lorsque Ai n'est pas vide, on copie la ligne i ...
Rows(i + 1).Insert Shift:=xlDown '... puis on insère une ligne en dessous qui contient le collé de la ligne i. les formules sont décalées automatiquement.

End If

Next i

End Sub
0
Theo.R Messages postés 575 Date d'inscription   Statut Membre Dernière intervention   31
 
Si cela vous semble toujours obscur, notamment pour la Boucle, je vous invite à faire un petit tour sur www.excel-pratique.com -> rubrique cours gratuits VBA

de manière simple, mon code copie-colle la ligne dans une nouvelle ligne insérée en dessous lorsque A est non vide. C'est à vous de l'adapter à vos besoins. Il est possible de ne copier que certaines cellules de la ligne, ou d'ajouter d'autres conditions que "Ai non vide".

bref tout est possible, n'hésitez pas à demander si vous avez encore besoin d'aide
0
tryexcel Messages postés 11 Date d'inscription   Statut Membre Dernière intervention  
 
Ok j'ai compris le déroulé mais je pense que ca ne fonctionne pas car la cellule "C vide" est fusionnée avec 3 lignes.. Ce qui veut dire qu'il faut rajouter 3 lignes dont une partie est fusionnée.. Je sais pas si tu me comprends ..
De B à P les cellules sont fusionnées mais sur la colonne Q j'ai besoin d'avoir les 3 lignes
0
Theo.R Messages postés 575 Date d'inscription   Statut Membre Dernière intervention   31
 
Les fusions de cellules sont prédictibles ?

Si oui, alors vous pouvez adapter le code en modifiant le pas de la boucle par exemple (-3 au lieu de -1).

Pouvez-vous joindre un document via www.cjoint.com pour avoir plus de détails sur les formules, etc. ?
0
Theo.R Messages postés 575 Date d'inscription   Statut Membre Dernière intervention   31
 
Essayez la méthode qui suit. En fait cela activera l'ajout de ligne quand vous modifiez la cellule en C:C. Pour accéder aux feuilles/modules, Alt+F11 après avoir activé les macros :

1) Le premier code est à mettre dans le code de la feuille sur laquelle vous travaillez ("homme " pour votre cas) :

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Count > 1 Or Target.Column <> 3 Then Exit Sub
If Target.Value = "" Then Exit Sub
'If Target.Count > 1 Then Exit Sub

If Flag = True Then Exit Sub
Flag = True

Dim LgneNext As Long
LgneNext = Target.Row + 1

Do Until Cells(LgneNext, 2).Value <> ""

LgneNext = LgneNext + 1

Loop

Rows(Target.Row & ":" & LgneNext - 1).Copy
Rows(LgneNext).Insert Shift:=xlDown

Flag = False

End Sub


2) le 2nd est à mettre dans un Module VBA :

Public Flag As Boolean
0
tryexcel Messages postés 11 Date d'inscription   Statut Membre Dernière intervention  
 
Ah super ca fonctionne !!!!!

Juste est il possible que la nouvelle cellule C soit vide en s'ajoutant ? et que le titre de la colonne B exemple ( OP LES GRATUITS 1CF - 1CG - 1CH) ne se répète pas ?

En tout cas merci beaucoup ! :)
0
Theo.R Messages postés 575 Date d'inscription   Statut Membre Dernière intervention   31
 
Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Count > 1 Or Target.Column <> 3 Then Exit Sub
If Target.Value = "" Then Exit Sub
'If Target.Count > 1 Then Exit Sub

If Flag = True Then Exit Sub
Flag = True

Dim LgneNext As Long
LgneNext = Target.Row + 1

Do Until Cells(LgneNext, 2).Value <> ""

LgneNext = LgneNext + 1

Loop

Rows(Target.Row & ":" & LgneNext - 1).Copy
Rows(LgneNext).Insert Shift:=xlDown

Cells(LgneNext, 3).Value = ""
Cells(LgneNext, 2).Value = ""

Flag = False

End Sub
0
Theo.R Messages postés 575 Date d'inscription   Statut Membre Dernière intervention   31
 
Comme cela ?
0
tryexcel Messages postés 11 Date d'inscription   Statut Membre Dernière intervention  
 
exactement ! tout est parfait sauf que la somme de la ligne TOTAL ne prend pas en compte les nouvelles lignes..
0
Theo.R Messages postés 575 Date d'inscription   Statut Membre Dernière intervention   31 > tryexcel Messages postés 11 Date d'inscription   Statut Membre Dernière intervention  
 
Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Count > 1 Or Target.Column <> 3 Then Exit Sub
If Target.Value = "" Then Exit Sub
'If Target.Count > 1 Then Exit Sub

If Flag = True Then Exit Sub
Flag = True

Dim LgneNext As Long
LgneNext = Target.Row + 1

Do Until Cells(LgneNext, 2).Value <> ""

LgneNext = LgneNext + 1

Loop

Rows(Target.Row & ":" & LgneNext - 1).Copy
Rows(LgneNext).Insert Shift:=xlDown

Cells(LgneNext, 3).Value = ""
Cells(LgneNext, 2).Value = ""
Cells(2 * LgneNext - Target.Row, 16).FormulaLocal = "=SOMME(P" & Target.Row & ":P" & 2 * LgneNext - Target.Row - 1 & ")"

Flag = False

End Sub
0