Bonjour,

Je trouve toujours une grande source d'inspiration sur ce site alors que je ne connais pas le VBA, mais j'arrive tout de même à bricoler des choses. Je me retrouve donc à vous soumettre un fichier et le code qui m'a permis d'insérer une ligne dans une plage délimitée. J'ai deux points à vous soumettre :

1/ j'aimerais que ma macro insére une ligne en-dessous de la cellule active et non pas en dessus.
2/ j'aimerais ajouter un message d'erreur via msgbox pour indiquer que l'action "d'insérer la ligne" n'est pas possible en dehors du champ, mais je ne comprends pas où mettre cette commande

Point complémentaire : toute remarque sur mon code sera la bienvenue (je suis vraiment un bricoleur et le code peut certainement être un peu plus propre)

Voilà mon code et le fichier attaché :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
Sub Insert_BFU2()
 
 
' Cette macro permet d'insérer une ligne dans le document.
 
Dim DernièreLigne As Long
Dim x As Long
Dim y As Long
 
' Définition de la zone cible, càd, la plage dans laquelle peut être inserée une ligne
' Astuce : la dernière ligne est définie comme étant la dernière ligne non-vide, pour obtenir une ligne non vide, j'ai saisi "MSF" dans la cellule choisie.
 
    x = ActiveCell.Row
    DernièreLigne = ActiveSheet.Range("AY7").End(xlDown).Row
 
 
' Si l'utilisateur se positionne en dehors de cette plage (ligne 7 à "dernière ligne"), la commande s'arrête
 
If Not ((x > 9) And (x < DernièreLigne)) Then
Exit Sub
End If
 
'Déprotection de la feuille dont le mot de passe est "MSF"
 
    ActiveSheet.Unprotect Password:="MSF"
 
' Insertion de la nouvelle ligne : les cellules copiées cont de la colonne A à la colonne J
 
With Range("A" & x & ":AY" & x)
    .Insert Shift:=xlDown
    .Offset(-1).FillDown
    .Offset(-1).Clear
    .Offset(-1).Locked = Falseµ
    .Offset(-1).NumberFormat = "#,##0.00"
 
' Une manière de contourner les erreurs d'exécution du script (peut certainement être revu et amélioré...)
 
On Error Resume Next
    .Offset(-1).SpecialCells(xlCellTypeConstants, 23).ClearContents
 
'Protection de la feuille dont le mot de passe est "MSF"
 
On Error GoTo 0
    ActiveSheet.Protect UserInterfaceOnly:=True, Password:="MSF", DrawingObjects:=True, Contents:=True, Scenarios:=False _
, AllowSorting:=True, AllowFiltering:=True, AllowFormattingCells:=True, AllowFormattingColumns:=False, _
AllowFormattingRows:=False
 
End With
 
 End Sub

... Pour info, j'ai aussi ajouté une autre macro pour supprimer certaines lignes (seulement celles qui sont insérées) :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
   Sub Delete_BFU2()
' Cette macro permet de supprimer une ligne dans le document.
 
Dim DernièreLigne As Long
Dim x As Long
Dim y As String
 
' Définition de la zone cible, càd, la plage dans laquelle peut être suprimée une ligne
' Astuce : la dernière ligne est définie comme étant la dernière ligne non-vide, pour obtenir une ligne non vide, j'ai saisi "MSF" dans la cellule choisie.
 
    x = ActiveCell.Row
    y = Cells(x, 1)
    DernièreLigne = ActiveSheet.Range("AY7").End(xlDown).Row
 
' Si l'utilisateur se positionne en dehors de cette plage (ligne 7 à "dernière ligne"), la commande s'arrête
 
If Not ((x > 9) And (x < DernièreLigne)) Then
Exit Sub
End If
 
If Not (y = "") Then
Exit Sub
End If
 
'Déprotection de la feuille dont le mot de passe est "MSF"
 
    ActiveSheet.Unprotect Password:="MSF"
 
' Suppression de la ligne selectionée
With ActiveSheet
 
Rows(ActiveCell.Row).Delete Shift:=xlUp
ActiveSheet.Protect UserInterfaceOnly:=True, Password:="MSF", DrawingObjects:=True, Contents:=True, Scenarios:=False _
, AllowSorting:=True, AllowFiltering:=True, AllowFormattingCells:=True, AllowFormattingColumns:=False, _
AllowFormattingRows:=False
End With
End Sub
Je vous remercie pour votre aide