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 !