Bonjour à tous et bonne année
Je créée un programme sous VBA pour simuler le déroulement d'une unité de production.
L'unité est composée de différentes machines qui peuvent être sous différents états :
* en chargement
* en cours de fonctionnement
* en déchargement
Ces 3 états multipliés par le nombre de machines me donne 60 cas de figure.
Le bout de code ci-dessous montre 2 des 60 étapes qui sont dans leur forme toutes identiques.
Arrivé à la 60ème étape, je boucle et reprend le programme au début.
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 Sub Label1_Click() UF.Label1.Caption = "08:00" 'Heure de début de la production Do Until Label1.Caption = "22:00" 'Heure de fin de la production . . . '5 - TRANSFERT DE L'ARMOIRE VIDE VERS LA CABINE (CAMION) If Range("TotChar").Value <> 0 Or Range("SommeChCabArm").Value <> 0 Then Z°1 = "Char" Z°2 = "ChCabArm" Z°3 = NbChCabArm Z°4 = "ChCabArm" Z°5 = 3 Z°6 = "CabArm" Call TRAME End If '6 - TRANSFERT DE L'ARMOIRE VIDE VERS LA CABINE (SOINS) If Range("TotCchar").Value <> 0 Or Range("SommeChCabSoin").Value <> 0 Then Z°1 = "Cchar" Z°2 = "ChCabSoin" Z°3 = NbChCabSoin Z°4 = "ChCabSoin" Z°5 = 3 Z°6 = "CabArm" Call TRAME End If . . . Tps1 = UF.Label1.Caption UF.Label1.Caption = DateAdd("n", 1, Tps1) 'Incrémentation de l'horloge d'1 mn Loop End Sub
Ma boucle va donc vérifier 60 fois si une condition est vraie pour lancer une procédure.
Je vous passe le détail des opérations mais j'ai calculé que pour l'exécution de mon programme, 2 à 3 mn sont utilisées (selon le taux de remplissage) rien que pour la vérification d'étapes qui n'engendreront pas de renvoi vers une procédure.
J'ai créé un tableau sous Excel qui me liste, à chaque boucle, les étapes nécessitant le besoin de lancer une procédure mais cela implique que je puisse aller directement à la phase concernée en by-passant les phases inutiles grâce à une variable.
La fonction Call n'autorise pas les variables mais la fonction CallByName le permet.
La fonction CallByName intègre bien la variable OrdreMat et transfère vers le Sub concerné mais cela n'améliore pas le temps d'exécution; ce que j'ai pu vérifier dans un article publié par Microsoft qui précise :
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 Label1_Click() UF.Label1.Caption = "08:00"' 'Heure de début de la production Do Until Label1.Caption = "22:00" ''Heure de fin de la production . . . OrdreMat = Application.WorksheetFunction.VLookup(Range("ChoixChrono"), Range("ChronoMat"), 4) 'Variable définissant le nom de la procédure à atteindre sur les 60 possibles CallSubroutine OrdreMat Tps1 = UF.Label1.Caption UF.Label1.Caption = DateAdd("n", 1, Tps1) 'Incrémentation de l'horloge d'1 mn Loop End Sub Private Sub CallSubroutine(ByVal sub_name As String) CallByName Me, sub_name, VbMethod End Sub Sub TRANSFERT_ARMOIRE_VIDE_VERS_CABINE_Camion() '5 Z°1 = "Char" Z°2 = "ChCabArm" Z°3 = NbChCabArm Z°4 = "ChCabArm" Z°5 = 3 Z°6 = "CabArm" Call TRAME End Sub Sub TRANSFERT_ARMOIRE_VIDE_VERS_CABINE_Soins() '6 Z°1 = "Cchar" Z°2 = "ChCabSoin" Z°3 = NbChCabSoin Z°4 = "ChCabSoin" Z°5 = 3 Z°6 = "CabArm" Call TRAME End Sub
C'est effectivement mon problème et je suis dans une impasse car je ne vois pas comment m'en sortir mais Microsoft laisse entrevoir une solution par un appel à liaison tardive.CallByName peut être utile dans certaines situations, mais pesez bien ses avantages par rapport à ses inconvénients en matière de performances — l'appel d'une procédure à l'aide de cette fonction est un peu plus lent qu'un appel à liaison tardive. Si la fonction est appelée de façon répétitive, comme dans une boucle, CallByName peut avoir un impact négatif sur les performances.
Est ce que quelqu'un a une idée sur la question ou connait une autre solution qui pourrait résoudre mon problème.
D'avance merci pour votre aide précieuse.
Partager