@Alice ; réf. P16
commentaires pour la sub Dispatch() de Module1 :
Sub Dispatch() .. End Sub : c'est la sub Dispatch(), qui va répartir les données
de la feuille "Préciser et trier" sur les 3 feuilles de droite (appelée par Ctrl d)
Dim T, R, d(1 To 3), s$, v$, y$, f$ : déclaration de plusieurs variables.
Dim a As Byte, b As Byte, c As Byte, i As Byte, j As Byte, k As Byte : idem.
'g = partie gauche (12 car) d'une sous-action qui sera ignorée
Const g As String * 12 = "A compléter " : « As String * 12 » ➯ chaîne de
caractères de longueur fixe de 12 caractères.
Application.ScreenUpdating = 0 : mise à jour de l'écran désactivée
➯ l'exécution du code VBA sera plus rapide.
ClrData "A porter seul" : 1er appel de la sub ClrData() ; on transmet le nom
de la feuille sur laquelle on va effacer les anciens résultats (s'il y en a).
ClrData "A partager" : 2ème appel de ClrData() ; idem, pour la feuille indiquée.
ClrData "A donner" : 3ème appel de ClrData() : idem, pour la feuille indiquée.
T = D00.[D30:H159] : on met dans la variable T les données de la feuille
"Préciser et trier" qui sont en D30:H159.
R = D00.[C7:C16] : on met dans la variable R les données de la feuille
"Préciser et trier" qui sont en C7:C16.
d(1) = 6: d(2) = 6: d(3) = 6 : pour chacune des 3 feuilles de résultats,
c'est à partir de la ligne 6.
For a = 1 To 10 .. Next a : boucle a, pour 10 costumes.
If D00.[A6].Offset(a) = "" Then .. End If : sur la feuille "Préciser et trier",
à partir de la cellule A6, on teste la cellule qui est a ligne(s) plus bas :
si c'est vide, on exécute la suite, sinon on saute le traitement ; c'est
cela qui permet de sauter un costume pour lequel tu as mis un « x »
en colonne A (donc en A7:A16) ; en fait, tu peux mettre aussi autre
chose que « x » : si tu mets par exemple « * » ou « # », le costume
sera aussi ignoré (car c'est différent d'une cellule vide).
i = (a - 1) * 13 + 1 : on calcule i selon a ; ça revient, dans le grand tableau
de la feuille "Préciser et trier", à la 1ère ligne du bloc de 13 lignes d'un
costume : ligne 30 pour le costume n° 1 ; ligne 43 pour le costume n° 2 ;
ligne 56 pour le costume n° 3 ; etc...
For b = 1 To 5 .. Next b : boucle b, pour 5 actions.
s = T(i, b) : action d'un costume (de l'action 1 à l'action 5 en fonction de b).
For c = 1 To 5 .. Next c : boucle c, pour 5 sous-actions.
j = (c - 1) * 2 + i + 3 : on calcule j selon c ; ça revient, dans le grand tableau
de la feuille "Préciser et trier", à la 1ère ligne du bloc de 2 lignes qui suit
la ligne i précédente, à laquelle on ajoute 3 car on doit sauter les 2 lignes
« Utilité de cette action sur 10/objectif ? » et « Pourquoi cette action... ? » ;
donc au final, ça revient au n° ligne de « Sous-action X » ; pour Action 1,
ce sont les lignes 33 ; 35 ; 37 ; 39 ; 41.
v = T(j, b) : v = valeur de la sous-action X (= son texte).
If v <> "" Then .. End If : on fait la suite seulement si le texte de la sous-
action X est non vide ➯ c'est ça qui permet de sauter une sous-action
vide ➯ une sous-action vide n'apparaîtra pas dans les résultats. ;)
y = Left$(v, 12) : on met dans y les 12 premiers caractères de gauche
du texte de la sous-action X ; ça sera pour les comparer avec les 12
caractères de la constante g (définie au début de la sub).
If y <> g Or (y = g And D00.[D21] <> "sans") Then .. End If : on fait la suite
seulement si y est différent de g, OU (si y = g ET QUE D21 de la feuille
"Préciser et trier" est différent de "sans") ; rappel : différent de "sans",
ça signifie "avec" OU cellule vide si l'utilisateur a effacé D21 par appui
de la touche Suppression ; noter que c'est ce test qui fait aussi que les
sous-actions qui commencent par "A compléter " (espace final compris)
n'apparaîtront pas dans les résultats. ;)
f = T(j + 1, b) : on met dans f la valeur qui est une ligne plus bas ; c'est la
cellule qui est juste sous la sous-action X, et qui correspond à la valeur
de "... = Quoi faire ?" ➯ c'est l'item choisi dans une liste = "A donner" ;
ou "A porter seul" ; ou "A partager" ; c'est cette valeur qui va donc
déterminer sur laquelle des 3 feuilles de résultats on va écrire.
k = 0 : k vaut 0 ; signification : feuille non valide.
If f <> "" Then : sécurité ! en effet, si au lieu de choisir un des 3 items
de la liste, l'utilisateur a effacé le contenu de la cellule en appuyant sur la
touche "Suppression", alors une cellule vide ne pourra pas être utilisée
comme nom valide de feuille de résultats ! ➯ la suite du code VBA est
exécutée seulement si f est non vide (= un des 3 items de la liste qui a
été mentionnée plus haut).
Select Case f .. End Select : selon la valeur de f
Case "A porter seul": k = 1 : si f vaut "A porter seul", on met 1 dans k.
Case "A partager": k = 2 : si f vaut "A partager", on met 2 dans k.
Case "A donner": k = 3 : si f vaut "A donner", on met 3 dans k.
If k > 0 Then .. End If : on fait la suite seulement si k est > à 0 ; donc
en fait, c'est seulement si k vaut 1, 2, ou 3 (ça arrive uniquement
pour un nom valide de feuille de résultats).
ainsi, le Select Case f .. End Select équivalait à une 2ème sécurité,
via f et k ensemble (les deux à la fois).
With Worksheets(f).Cells(d(k), 2) .. End With : avec la cellule de
la feuille f qui est en ligne d(k), colonne 2 (colonne B).
.Resize(, 4).VerticalAlignment = 2 : alignement vertical centré
pour les colonnes B:E d'une ligne de résultats.
.HorizontalAlignment = 4: .IndentLevel = 2 : pour la cellule B
d'une ligne de résultats, donc pour le n° costume : mettre
un alignement horizontal à droite, avec indentation de 2.
.Offset(, 1).Resize(, 3).WrapText = -1 : mettre un retour à la ligne
automatique pour les colonnes C:E d'une ligne de résultats ➯
c'est l'équivalent VBA de ceci : fenêtre "Format de cellule", onglet
"Alignement", ☑ Renvoyer à la ligne automatiquement ; avec -1,
c'est comme si j'avais mis : .WrapText = True.
.Value = D00.[B6].Offset(a) : dans la cellule du With, on met le n°
costume ; ce n° est sur la feuille "Préciser et trier", à partir de
B6, et a lignes plus bas.
.Offset(, 1) = R(a, 1) : 1 colonne à droite de la cellule du With,
on met le rôle endossé ; ce rôle est dans la variable R.
.Offset(, 2) = s : 2 colonnes à droite de la cellule du With,
on met l'action ; celle-ci est dans la variable s.
.Offset(, 3) = v : 3 colonnes à droite de la cellule du With,
on met la sous-action ; celle-ci est dans la variable v.
d(k) = d(k) + 1 : une ligne de plus.
D01.Select : cette instruction est située après Next a, juste avant
le End Sub de la sub Dispatch() ; ça sélectionne la feuille D01,
donc la feuille "A porter seul" ; ainsi, après exécution de la sub
Dispatch(), et juste avant d'en sortir, on sélectionne la 1ère des
3 feuilles de résultats.
rhodo