Insérer X lignes dont X est présent dans une cellule

Bonjour,

J'ai un fichier où je veux insérer X lignes dont X se trouve dans une cellule et ensuite incrémenter les dates automatiquement

Par exemple: F2=5 je veux insérer 5 lignes

Un début de code ci-dessous mais je connais pas grand chose en VBA

Dans le fichier un exemple de résultat

Dim i As integer

Dim ws As Worksheet ' Déclaration de la variable ws

Sheets(ws).Select

If Range("F2").Value >1 and <=5 then Rows("5:" & 2 + I & " ").Select

Selection.Insert Shift:=xlDown

D'avance merci pour votre aide et votre temps

Bonjour,

Une proposition qui s’exécute par double clique dans la colonne F :

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

Dim Lig As Long

If Not Intersect(Target, Range("F:F")) Is Nothing Then 'Si le double clique est en colonne F
    If Target > 1 And Target <= 5 Then 'Si la valeur est entre 1 et 5
        Rows(Target.Row + 1 & ":" & Target.Row + Int(Target) - 1).Insert Shift:=xlDown, CopyOrigin:=lFormatFromLeftOrAbove  'Insertion ligne(s)
        For Lig = Target.Row + Int(Target) - 1 To Target.Row Step -1 'Boucle sur les lignes
            Range("A" & Lig) = Range("A" & Target.Row) 'Recopie du nom
            Range("B" & Lig) = Range("B" & Target.Row) + Lig - Target.Row 'Incrémentation de la date
            Range("C" & Lig) = Range("B" & Lig) 'Date fin = début
            Range("D" & Lig) = Range("D" & Target.Row) 'Recopie de l'évenement
            Range("G" & Lig) = Round(Range("G" & Target.Row) / Target, 2) 'MAJ du nb d'heures
            Range("F" & Lig) = Round(Range("F" & Target.Row) / Target, 2) 'MAJ du nb de jours
        Next Lig
        Cancel = True 'Annule le double clique
    End If
End If

End Sub

Le code étant lié à un évenement (double clique), il est placé dans le module de la feuille ("Feuil1") et non un module standard ("Module1")

Merci Pedro22, le code marche nickel.

Par contre, je ne veux pas que l'instruction fait suite à un évènement en l'occurence ici le double click.

Si vous voulez, le but est que je veux l'associer à un bouton de contrôle, et que cette instruction s'applique à tout les onglets de mon classeur.

Est-ce que je dois déclarer d'autres variable ?

Dim ws As Worsheet 'Déclaration de des onglets

Dim Target As Range

Le code :

For Sheets(1)

If Target > 1 And Target <= 5 Then 'Si la valeur est entre 1 et 5

Rows(Target.Row + 1 & ":" & Target.Row + Int(Target) - 1).Insert Shift:=xlDown, CopyOrigin:=lFormatFromLeftOrAbove 'Insertion ligne(s)

For Lig = Target.Row + Int(Target) - 1 To Target.Row Step -1 'Boucle sur les lignes

Range("A" & Lig) = Range("A" & Target.Row) 'Recopie du nom

Range("B" & Lig) = Range("B" & Target.Row) + Lig - Target.Row 'Incrémentation de la date

Range("C" & Lig) = Range("B" & Lig) 'Date fin = début

Range("D" & Lig) = Range("D" & Target.Row) 'Recopie de l'évenement

Range("G" & Lig) = Round(Range("G" & Target.Row) / Target, 2) 'MAJ du nb d'heures

Range("F" & Lig) = Round(Range("F" & Target.Row) / Target, 2) 'MAJ du nb de jours

Next Lig

Next Sheets

End If

Merci pour votre aide

Bonne journée

Merci Pedro22, le code marche nickel.

Par contre, je ne veux pas que l'instruction fait suite à un évènement en l'occurence ici le double click.

Si vous voulez, le but est que je veux l'associer à un bouton de contrôle, et que cette instruction s'applique à tout les onglets de mon classeur.

Est-ce que je dois déclarer d'autres variable ?

Dim ws As Worsheet 'Déclaration de des onglets

Dim Target As Range

Bonjour,

Quelques remarques préliminaires !

  • la déclaration d'une variable n'a de sens que si elle est utilisée par la suite (voir ws)
  • l'utilisation d'une variable nommée Target est à éviter en dehors d'une macro événement
  • la syntaxe de votre boucle sur les feuilles n'est pas correcte, voir syntaxe générique :
For NomVariable = ValeurDébut To ValeurFinale Step ValeurPas 'Step est facultatif (pas de 1 par défaut)
Next NomVariable

Il vous faut 2 boucles supplémentaires par rapport au code d'origine : une pour parcourir les feuilles, l'autre pour parcourir les lignes. Attention, comme la macro insert des lignes, on privilégiera une boucle qui part du dernier élément et qui remonte (Step -1) pour éviter les soucis.

Un essai :

Sub MacroTest()

Dim Lig As Long, DerLig As Long, NoFeuille As Byte, Element As Byte

For NoFeuille = 1 To Worksheets.Count 'Boucle sur les feuilles
      With Worksheets(NoFeuille) 'Tout instruction commençant par "." se rattache à cette feuille
            DerLig = .Range("F" & Rows.Count).End(xlUp).Row 'Indice de la dernière cellule non vide en colonne F
            For Lig = DerLig To 2 Step -1 'To 2 car on suppose la présence d'une ligne d'en-têtes
                  If .Range("F" & Lig) > 1 And .Range("F" & Lig) <= 5 Then 'Si la valeur est entre 1 et 5
                        .Rows(Lig + 1 & ":" & Lig + Int(.Range(«F» & Lig)) - 1).Insert Shift:=xlDown, CopyOrigin:=lFormatFromLeftOrAbove  
                        For Element = Lig + Int(.Range("F" & Lig)) - 1 To Lig Step -1 'Boucle sur les Éléments
                              .Range("A" & Element) = .Range("A" & Lig) 'Recopie du nom
                              .Range("B" & Element) = .Range("B" & Lig) + Element - Lig 'Incrémentation date
                              .Range("C" & Element) = .Range("B" & Element) 'Date fin = début
                              .Range("D" & Element) = .Range("D" & Lig) 'Recopie évenement
                              .Range("G" & Element) = Round(.Range("G" & Lig) / .Range("F" & Lig), 2) 'MAJ nb heures
                              .Range("F" & Element) = Round(.Range("F" & Lig) / .Range("F" & Lig), 2) 'MAJ nb jours
                        Next Element
                  End If
            Next Lig
      End With
Next NoFeuille

End Sub

Merci Pedro22. Le code fonctionne.

Super. Merci beaucoup pour ton aide et ton temps.

Bonne journée.

Merci du retour, bonne continuation !

Rechercher des sujets similaires à "inserer lignes present"