Recopier une ligne avec ses formules - MACRO

Résolu
nathan01983 Messages postés 30 Date d'inscription   Statut Membre Dernière intervention   -  
nathan01983 Messages postés 30 Date d'inscription   Statut Membre Dernière intervention   -

Bonjour

J'aimerai en cliquant sur un bouton créer une macro qui recopie une ligne en conservant toutes les formules présentes dans la ligne "modèle"

J'ai ma macro, elle recopier bien la ligne avec ses mise en forme, mais celle ci ne recopie pas les formules présente dans les cellules.
Sauriez vous comment faire ?

Sub Ajouterligne()
Dim CurrentSheet As Object
For Each CurrentSheet In ActiveWindow.SelectedSheets
CurrentSheet.Range("B11:B11").EntireRow.Insert
Next CurrentSheet
End Sub

Merci pour votre futur aide. 


Windows / Edge 119.0.0.0

5 réponses

Résumé de la discussion

Le souci posé est qu’une macro qui insère une ligne ne recopie pas les formules présentes sur la ligne modèle. Une solution efficace consiste à insérer la ligne puis copier les formules depuis la ligne précédente vers la nouvelle pour les colonnes concernées, en déterminant la ligne cible (par exemple la dernière ligne d’un même critère dans la colonne B) et en dupliquant les formules au-delà de cette ligne. Concrètement, le processus consiste à insérer la nouvelle ligne, à initialiser B et C avec les valeurs du modèle, puis à copier les formules de la ligne précédente vers la nouvelle sur les colonnes B à T. En alternative plus simple, il est possible d’utiliser AutoFill après l’insertion de la ligne, par exemple pour reproduire les formules d’un modèle (comme B4 vers B5 ou A2:C2 vers A2:C3).

Bobot (l'IA à votre service)
  1. nathan01983 Messages postés 30 Date d'inscription   Statut Membre Dernière intervention   10
     

    Bonjour à tous. 

    J'ai trouvé sur un autre forum la réponse à ma solution encore mieux que ce que j'espérais.

    Ce code permet d'insérer une ligne en dessous de la dernière ligne avec les même critères en conservant les formules et les mises en formes qui sont dans la ligne voulu. 

    Sub insérer_ligne()
        Dim cell As Range, cell1 As Range
        Dim i As Integer, j As Integer
        
        With ActiveSheet
            ' recherche dans tableau de suivi de la dernière cellule correspondant à la catégorie produit sélectionnée
            Set cell = .Columns("B").Find(.Range("$B$8"), SearchDirection:=xlPrevious)
            If Not cell Is Nothing Then
                'recherche dans tableau de suivi de la dernière ligne correspondant à la catégorie produit et type produit sélectionné
                Set cell1 = cell
                Do
                    i = cell.Row   'numéro de ligne du tableau
                    If .Cells(i, "C") = .Range("$C$8") Then Exit Do
                    Set cell = .Columns("B").FindPrevious(cell)
                Loop Until cell.Address = cell1.Address
                
                'ajout nouvelle ligne tableau derrière  la dernière trouvée
                i = i + 1
                .Rows(i).Insert
                .Cells(i, "B") = .Range("$B$8")
                .Cells(i, "C") = .Range("$C$8")
                For j = .Columns("B").Column To .Columns("T").Column
                    If .Cells(i - 1, j).HasFormula Then .Cells(i - 1, j).Copy .Cells(i, j)
                Next j
            End If
        End With
    End Sub

    Voilà le fichier : https://www.cjoint.com/c/MKih6qvoeAu

    Cordialement 

    1
  2. ccm81 Messages postés 11033 Statut Membre 2 434
     

    1. J'insère une ligne qui décale le tableau vers le bas donc, la ligne 5 devient la ligne 6 et donc ma nouvelle ligne vide sera la ligne 5)

    2. avec une formule en B5

    Sub Macro1()
       ' insertion d'une ligne vide aavant la ligne 5
        Rows("5:5").Select
        Selection.Insert Shift:=xlDown
        ' recopie de la formule de B4 en B5
        Range("B4").Select
        Selection.AutoFill Destination:=Range("B4:B5"), Type:=xlFillDefault
    End Sub

    Cdlmnt

    1
    1. nathan01983 Messages postés 30 Date d'inscription   Statut Membre Dernière intervention   10
       

      Je l'ai un peu modifié car elle ne copiait pas la formule mais cela m'a BEAUCOUP 

      aidé

      Sub Macro1()
         ' insertion d'une ligne vide aavant la ligne 5
          Rows("5:5").Select
          Selection.Insert Shift:=xlDown
          ' recopie de la formule de B4 en B5
          Range("B6").Select
          Selection.AutoFill Destination:=Range("B6:B5"), Type:=xlFillDefault
      End Sub

      Merci bcp CCM81

      0
  3. ccm81 Messages postés 11033 Statut Membre 2 434
     

    Bonjour

    Pour insérer une ligne avant la lige 3 et recopier la ligne 2, formules comprises, l'éditeur de macro donne ceci

    Sub Macro1()
        Rows("3:3").Select
        Selection.Insert Shift:=xlDown
        Range("A2:C2").Select
        Selection.AutoFill Destination:=Range("A2:C3"), Type:=xlFillDefault
    End Sub

    Cdlmnt

    0
    1. nathan01983 Messages postés 30 Date d'inscription   Statut Membre Dernière intervention   10
       

      Merci :) 

      0
    2. nathan01983 Messages postés 30 Date d'inscription   Statut Membre Dernière intervention   10
       

      Bonjour à vous. 

      J'essais d'adapter ce code à un nouveau tableau mais je coince.

      J'ai un bouton qui m'insère une ligne au dessus, mais il ne copie pas la formule qui se trouve dans B5.

      Sub Insert_ligne_Formule()
      Dim CurrentSheet As Object
      For Each CurrentSheet In ActiveWindow.SelectedSheets
      CurrentSheet.Range("B5:E5").EntireRow.Insert
      Next CurrentSheet
      End Sub

      Sauriez vous comment faire ? car je n'arrive pas à adapter votre code

      Cordialement

      0
  4. ccm81 Messages postés 11033 Statut Membre 2 434
     

    Bonjour

    Essaies ceci

    Public Sub ins_ligne()
    With ActiveSheet
      Rows("5:5").Select
      Selection.Insert Shift:=xlDown
      .Cells(5, 1).Select
    End With
    End Sub

    Cdlmnt

    0
    1. nathan01983 Messages postés 30 Date d'inscription   Statut Membre Dernière intervention   10
       

      Merci pour ta réponse

      Toutefois ca me copie la ligne mais sans la formule  :/

      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. ccm81 Messages postés 11033 Statut Membre 2 434
     

    Désolé, j'ai mal lu !

    Des questions toutefois au sujet de "la formule"

    1. y a t'il une ou plusieurs formules à copier, et dans quelles cellules sont elles ?

    2. les cellules ne contenant pas de formule doivent être vides ?

    3. Si la formule à copier fait référence à la même ligne (du genre C5 = B5+1), ça ira (à peu près avec ça)

    Sub Macro1()
        Rows("5:5").Select
        Selection.Insert Shift:=xlDown
        Range("A4:C4").Select
        Selection.AutoFill Destination:=Range("A4:C5"), Type:=xlFillDefault
    End Sub

    4. sinon (du genre C5 = C4+1) il faudra la recopier jusqu'en bas

    5. Le mieux serait d'envoyer un bout de fichier avec le résultat souhaité

    Cdlmnt

    0
    1. nathan01983 Messages postés 30 Date d'inscription   Statut Membre Dernière intervention   10
       

      1 - Il y a une seule formule présente dans la colonne B5

      2 - Oui les cellules ne contenant rien doivent rester vide

      J'essaierais d'envoyer le fichier, mais là je suis "bloqué" au boulot avec la sécurité info.

      Après je ne sais pas si j'ai été clair dans ma description du fonctionnement.

      - Ma première ligne est la ligne 5 (avec une formule en B5)

      - J'insère une ligne qui décale le tableau vers le bas donc, la ligne 5 devient la ligne 6 et donc ma nouvelle ligne vide sera la ligne 5)

      ... dès que je pourrais j'envoie le fichier vidé de ses infos ;)

      En tous les cas merci pour le temps que tu passes à me répondre. 

      0