Bonjour Roran,
voici l'explication du code VBA :
Option Explicit
: oblige à déclarer toutes les variables utilisées
Sub Essai() .. End Sub
: sub Essai()
déclaration de plusieurs variables :
Dim FX As Worksheet, Z1 As Range, Z2 As Range
Dim Qté%, Coef!, Nbj%, lg1&, lg2&, dv As Byte
: Qté% : idem que Qté As Integer ; lg1& : idem que lg1 As Long
Worksheets("Feuil1").Select
: sélection de la feuille "Feuil1"
Set FX = Worksheets("Feuil2")
: FX fait référence à "Feuil2"
lg1 = 2
: lg1 va être utilisé pour lire "Feuil1" ; 2 car les données commencent en ligne 2
Application.ScreenUpdating = 0
: gel de l'affichage écran ➯ l'écran n'est plus mis à jour ➯ ça va plus vite
Do .. Loop
: 1ère boucle infinie (mais plus loin, y'a c'qui faut pour en sortir) ; cette 1ère boucle est pour lire toutes les lignes de "Feuil1"
Set Z1 = Cells(lg1, 2)
: Z1 fait référence à la cellule qui est en ligne lg1, colonne B (sur "Feuil1") ; c'est donc la colonne Zone (Z1 = Zone de "Feuil1") ; et juste pour info, le code VBA n'utilise pas la colonne A "Réf" : on peut très bien s'en passer pour faire l'exo.
If Z1 = "" Then Exit Sub
: voilà la porte de sortie de la boucle infinie : on s'arrête si on rencontre une cellule vide en colonne B ; donc ici en ligne 9 (et c'est ce test qui te permet d'ajouter d'autres lignes si besoin : adaptation automatique au nombre de lignes)
With Z1 .. End With
: avec Z1
Qté = .Offset(, 1)
: Quantité (sur la même ligne, 1 colonne à droite)
lg2 = 2
: lg2 va être utilisé pour lire "Feuil2" ; 2 car les données commencent en ligne 2
Do .. Loop
: 2ème boucle infinie (mais plus loin, y'a c'qui faut pour en sortir) ; cette 2ème boucle est pour lire toutes les lignes de "Feuil2"
Set Z2 = FX.Cells(lg2, 1)
: Z2 fait référence à la cellule qui est en ligne lg2, colonne A (sur FX = "Feuil2")
If Z2 = "" Then Exit Do
: voilà la porte de sortie de la boucle infinie : on s'arrête si on rencontre une cellule vide en colonne A ; donc ici en ligne 9 (et c'est ce test qui te permet d'ajouter d'autres lignes si besoin : adaptation automatique au nombre de lignes)
If Z2 = Z1 Then .. End If
: si les 2 Zones correspondent
dv = 1 + (Qté <= Z2.Offset(, 2))
: Z2.Offset(, 2) : c'est la cellule qui est sur la même ligne que Z2 (donc sur lg2), 2 colonnes à droite ; c'est donc Qté maxi ; si Qté <= Qté maxi, le test est VRAI ➯ ça vaut -1, et 1 + (-1) = 1 - 1 = 0 ➯ dv = 0 ; si le test est FAUX (Qté > Qté maxi) : FAUX vaut 0, et 1 + (0) = 1 ➯ dv = 1 ; dv (décalage vertical) permettra de lire la bonne ligne : celle en cours ou celle qui suit juste en dessous
Coef = Z2.Offset(dv, 3)
: par rapport à Z2, dv lignes dessous et 3 colonnes à droite : on a le bon Coef
Nbj = Z2.Offset(dv, 4)
: par rapport à Z2, dv lignes dessous et 4 colonnes à droite : on a le bon Nbj
Exit Do
: et comme on a trouvé nos 2 infos, on sort aussitôt de la 2ème boucle
lg2 = lg2 + 1
: sinon on continue ; et on incrémente lg2 pour lire la ligne suivante (sur "Feuil2")
.Offset(, 3) = Application.RoundUp((.Offset(, 2) * Coef + Nbj) / 5, 0)
: par rapport à Z1, même ligne lg1 et 3 colonnes à droite (de la colonne B) : c'est la colonne E "Calcul" : là ou on va écrire le résultat de la formule ; .Offset(, 2) est la colonne D "Délai" ➯ (Délai × Coef × Nbj) / 5
; j'avais utilisé Round(.., 2)
pour un arrondi à 2 décimales ; c'est maintenant RoundUp(.., 0)
pour un arrondi supérieur, à l'entier (0 décimales).
lg1 = lg1 + 1
: on incrémente lg1, pour lire la ligne suivante (sur "Feuil1")
dhany