Insérer automatiquementune ligne en dessous
Résolu
tryexcel
Messages postés
11
Statut
Membre
-
tryexcel Messages postés 11 Statut Membre -
tryexcel Messages postés 11 Statut Membre -
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 :)

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
-
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-
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 ? -
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 -
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 -
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 -
-
-
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
-
-
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 -
-
-
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
-