Insérer automatiquementune ligne en dessous

Résolu
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 :)

2 réponses

  1. Theo.R Messages postés 585 Statut Membre 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
    1. tryexcel Messages postés 11 Statut Membre
       
      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
    2. Theo.R Messages postés 585 Statut Membre 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
    3. Theo.R Messages postés 585 Statut Membre 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
    4. tryexcel Messages postés 11 Statut Membre
       
      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
    5. Theo.R Messages postés 585 Statut Membre 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
  2. Theo.R Messages postés 585 Statut Membre 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
    1. tryexcel Messages postés 11 Statut Membre
       
      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
    2. Theo.R Messages postés 585 Statut Membre 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
    3. Theo.R Messages postés 585 Statut Membre 31
       
      Comme cela ?
      0
    4. tryexcel Messages postés 11 Statut Membre
       
      exactement ! tout est parfait sauf que la somme de la ligne TOTAL ne prend pas en compte les nouvelles lignes..
      0
    5. Theo.R Messages postés 585 Statut Membre 31 > tryexcel Messages postés 11 Statut Membre
       
      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