Sub AvecStock2()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim NL As Long 'déclare la variable NL (Nombre de Lignes)
Dim I As Long 'déclare la variable I(Incrément)
Dim LF As Long 'déclare la variable LF (Ligne de Fin)
Dim LD As Long 'déclare la variable LD (Ligne de Début)
Dim LAD As Long 'déclare la variable LAD (Ligne À Déplacer)
Dim REF As String 'déclare la variable REF (REFérence)
Dim V As Double 'déclare la variable V (Valeur)
Dim DEB As Double '
DEB = Timer
Application.ScreenUpdating = False 'masque les rafraîchissement de l'Écran
Set O = Worksheets("EXPORT") 'définit l'onglet O
TV = O.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
NL = UBound(TV, 1) 'définit le nombre de lignes NL du tableau des valeurs TV
For I = NL To 2 Step -1 'boucle inversée sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
If Trim(TV(I, 13)) <> "" Then 'condition 1 : si la donnée ligne I, colonne 13 de TV (la référence) n'est pas vide
If TV(I, 5) = "Stock fin" Then 'condition 2 : si la donnée ligne I colonne 5 de TV vaut "Stock fin"
LF = I + 1 'définit la ligne de fin LF
REF = TV(I, 13) 'définit la référence REF
O.Rows(I).Cut 'coupe la ligne I
O.Rows(LF + 1).Insert Shift:=xlDown 'déplace la ligne I en dernière position
End If 'fin de la condition 2
'si la donnée ligne I colonne 5 vaut "Stock début" définit la valeur V, définit la ligne à déplacer LAD
If TV(I, 5) = "Stock début" Then V = CDbl(TV(I, 7)): LAD = I
'si la donnée ligne I colonne 13 est différence de la référence REF et que la ligne de fin LF n'est pas nulle, définit la ligne de début LD
If TV(I, 13) <> REF And LF <> 0 Then LD = I + 1
If LD <> 0 Then 'condition 3 : si LD n'est pas nulle
O.Rows(LAD).Cut 'coupe la ligne LAD
O.Rows(LD).Insert Shift:=xlDown 'déplace la ligne LAD en première position
If V <> 0 Then 'codition4 : si Vn'est pas nulle
O.Range(O.Cells(LD, "Q"), O.Cells(LF, "Q")).Value = V 'renvoie la valeur V dans la colonne Q des ligne LD à LF
Else 'sinon (condition 4)
O.Rows(LD & ":" & LF).Delete 'supprime les lignes LD à LF
End If 'fin de la condition 4
LD = 0: LF = 0 'réinitialise les variable LD et LF
End If 'fin de la condition 3
End If 'fin de la condition 1
Next I 'prochaine ligne de la boucle
O.Columns(17).NumberFormat = "0.000" 'formate la colonne Q
Application.ScreenUpdating = True 'affiche les rafraîchissement de l'Écran
MsgBox Timer - DEB
End Sub