Peu d'aide pour code VBA

Bonjour à tous,

Veuillez m’excuser d’avance pour la longueur des explications mais ma situation m’oblige à venir vous demander de l’aide dans sa totalité. Voici maintenant de très nombreuses semaines que je suis bloqué sur le même point, à savoir pouvoir effectuer une incrémentation par heure sur une semaine et selon des conditions.

Dans le fichier en pièce jointe j’ai 6 moteurs disposés par ordre de priorité en colonne « A ». En colonne « B » est affilié leurs vitesses respectives. En colonne « C » il s’agit du temps de fonctionnement propre à chaque moteur que j’ai ici considéré comme un entier pour éviter de travailler sous le format horaire de VBA. En colonne « D » il s’agit du temps de repos du moteur et en colonne « E » de la vitesse minimale à atteindre.

La colonne H0 (« G ») correspond à l’état initial avant lancement. Le « 1 » signifie que le moteur est disponible, le « 0 » qu’il est en repos et le « 3 » qu’il est totalement indisponible sur toute la durée du programme.

Mon problème est alors le suivant : La première partie du programme permet de sélectionner dans la colonne H0 les moteurs qui sont disponibles de manière à satisfaire la condition suivante : la vitesse minimale de la colonne « E » doit toujours être atteinte ou dépassée. En conséquence, le but à l’instant H0 est de sélectionner les moteurs disponibles de manière à satisfaire cette condition. Puis de H1 à H168, il s’agit des colonnes représentant l’état des moteurs par pas horaire et c’est là qu’est mon problème. Une fois les moteurs à l’instant H0 sélectionnés, je souhaiterai que le programme lance un compteur se terminant à la 168ème heure (correspondant alors ici à la 174ème colonne (H1 étant à colonne 7). Le compteur faisant des pas de 1, tant que le temps de production des moteurs sélectionnés n’est pas atteint, un 2 s’afficherait dans les lignes concernées. Par exemple, ici pour satisfaire la vitesse minimale en « E » il faut les moteurs 6 et 2 aux vues des disponibilités de l’état H0. Le moteur 6 a un temps de production de 35h, soit ici 35, d’où de la colonne H1 à la colonne H36 on aurait un 2 qui s’afficherait. Pour le moteur 2 le temps de production est de 10 d’où de H1 à H11 on aurait un 2. Mais arrivé à H12 le moteur 2 est alors lancé au repos pendant 8h et donc de H12 à H20 des 0 s’afficheraient alors.

Mais la condition d’être toujours supérieur à la vitesse minimale ne serait plus satisfaite, le moteur 6 étant le seul actif. Du coup le code regarde si d’autres moteurs sont disponibles pour les mettre en fonctionnement afin de satisfaire la condition de vitesse. Par exemple le moteur 1 a un temps de repos de 5h donc de H1 à H6 il est au repos, des 0 s’affiche sur sa ligne mais arriver à H7 il est disponible donc des 1 s’afficheraient jusqu’à ce que le code ait besoin de moteurs supplémentaires et ainsi de H12 à H36 (temps de fonctionnement de 24h) des deux seraient affichés dans les lignes correspondantes. La démarche est alors la même jusqu’à ce qu’on atteigne H168. De là l’utilisateur appuie sur un bouton « reset » effaçant le contenu des colonnes H1 à H168 et un MsgBox apparait demande à l’utilisateur de rentrer de nouvelles valeurs à l’état H0.

Si vous êtes allés jusqu’au bout de mon long texte, je vous en remercie, et si vous ne désirez pas m’aider je comprends tout à fait, mais comprenez juste que mes compétences et ma compréhension en VBA est de niveau débutant et que j’ai tant bien que mal tourné le problème dans tous les sens avec plusieurs approches différentes à mon niveau et sans succès. Etant sans plus aucune solution, je me tourne à nouveau vers le forum qui a su m’aider par le passé en espérant un conseil, une approche ou un codage entier qu’importe, quelque chose qui puisse potentiellement éclairer ma lanterne.

Je vous remercie énormément pour l’attention consacrée à ma demande et souhaite à tous une bonne journée et une bonne fin de semaine.

Cordialement

12prog-essais.xlsm (19.85 Ko)

Bonjour le titre est coupé, il s'agit de "Besoin d'un peu d'aide pour code VBA"

Bien cordialement

bonjour,

une proposition à peaufiner (lancer la macro aargh, via alt-F8)

15prog-essais.xlsm (27.10 Ko)

Bonjour,

Merci infiniment de votre aide h2so4, je comprends en grande partie votre démarche. Cependant, j'ai deux questions:

1) Que représentent ici (cf image) t et Lig s'il vous plait ? Et aussi quel est votre raisonnement au niveau du If?

2022 02 03 14 22 18 window

2) Aussi je n'ai pas compris votre décrémentation d'une unité de temps en fonction du moteur ? (t(Lig, 5) = t(Lig, 5) - 1 'décremente une unité de temps de fonctionnement du moteur)

En tout cas, je souhaite vous remercier encore une fois pour votre aide.

Bien cordialement

Bonjour

Bonjour à tous

Un essai à tester. Te convient-il ?

Bye !

Bonjour gmb,

Je vous remercie aussi infiniment pour votre proposition.

J'ai en effet testé votre code cependant je ne comprends pas pourquoi arrivé à H12 les moteurs 5 et 1 se mettent en route sachant que seulement le 6 et 1 suffisent pour satisfaire la vitesse minimale. Mais surtout, le moteur 5 a un temps de fonctionnement de 18h hors ici il ne tourne que 8h tout comme le moteur 1 alors qu'ils ont encore du temps de fonctionnement. Si j'ai bien compris, une fois que le moteur 2 a fini son temps de repos, vous le mettez en route de nouveau au dépend des moteurs en cours de fonctionnement hors mon souhait est qu'une fois le moteur en route, il tourne jusqu'à atteindre son temps maximal puis se met en repos et à l'issue de ce repos, si la vitesse maximale est déjà satisfaite avec d'autre moteurs, le moteur est considéré disponible (présence de "1") en attendant d'être à nouveau sélectionné si besoin pour continuer à satisfaire la vitesse minimale.

2022 02 03 16 13 28 prog essais v1 lecture seule excel

Je vous remercie encore pour votre temps et votre attention

Bonne fin de journée,

Cordialement

bonsoir,

j'ai mis des commentaires supplémentaires dans le code.

Sub aargh()
    vn = Range("A1") 'vitesse nominale que j'ai mise en A1 plutôt qu'en E2
    t = Range("A2:F7") 'je crée un tableau VBA sur base de la plage A2:F7
    'tableau de dimension t(6,6) chaque ligne correspond aux données d'un moteur
    ' colonne 1 : l'identification du moteur (non utilisé)
    ' colonne 2 : vitesse du moteur
    ' colonne 3 : temps de fonctionnement
    ' colonne 4 : temps de repos
    ' colonne 5 : servira décompte du temps de fonctionnement ou de repos
    ' colonne 6 : sert à gérer l'état du moteur

    'on initialise la colonne 5 pour les moteurs en repos (état 0)
    ' on copie le temps de repos dans la variable qui sert au décompte des unités de temps
    For Lig = 1 To 6 'lig=n° de ligne du tableau VBA
        If t(Lig, 6) = 0 Then t(Lig, 5) = t(Lig, 4)
    Next Lig

    'on simule le fonctionnement d H1 à H168
    For col = 7 To 174
        tv = 0 ' total de vitesse
        For Lig = 1 To 6
            'on traite les moteurs actifs
            If t(Lig, 6) = 2 Then
                tv = tv + t(Lig, 2) ' on ajoute la vitesse du moteur au total des vitesses
                t(Lig, 5) = t(Lig, 5) - 1 'décrémente une unité de temps de fonctionnement du moteur
                If t(Lig, 5) = 0 Then
                    t(Lig, 5) = t(Lig, 4) 'mettre temps de repos
                    t(Lig, 6) = 4 'le moteur doit être mis au repos
                End If
                Cells(Lig + 1, col) = "A" ' mettre A pour actif pour ce moteur dans la colonne Hx en cours
            End If
        Next Lig
        ' on traite les autres moteurs
        For Lig = 1 To 6
            Select Case t(Lig, 6)
                Case 0 'moteur au repos
                    t(Lig, 5) = t(Lig, 5) - 1 ' décrémente d'une unité le temps de repos
                    If t(Lig, 5) = 0 Then 'repos terminé
                        t(Lig, 6) = 1 'moteur disponible
                    End If
                    Cells(Lig + 1, col) = "R" 'mettre R pour repos pour ce moteur dans la colonne Hx en cours
                Case 1 'moteur libre
                    If tv < vn Then 'si besoin de moteur supplémentaire (vitesse totale actuelle < vitesse nominale)
                        tv = tv + t(Lig, 2) ' on ajoute la vitesse du moteur au total des vitesses
                        t(Lig, 5) = t(Lig, 3) - 1 ' on décompte une première unité de temps
                        t(Lig, 6) = 2 'on met l'état du moteur à 2 = actif
                        If t(Lig, 5) = 0 Then 'temps de fonctionnement terminé ?
                            t(Lig, 5) = t(Lig, 4) 'mettre temps de repos
                            t(Lig, 6) = 0 'on met l'état du moteur à 0 = repos à la prochaine période
                        End If
                        Cells(Lig + 1, col) = "A" ' mettre A pour actif pour ce moteur dans la colonne Hx en cours
                    End If
                Case 4 'moteur à mettre au repos
                    t(Lig, 6) = 0 'mettre l'état du moteur à 0
            End Select
        Next Lig
        If tv < nv Then
            MsgBox "pas assez de moteurs disponibles pour atteindre la vitesse de " & vn & " à la période " & Cells(1, col)
        End If
    Next col

End Sub

concernant ce point

(t(Lig, 5) = t(Lig, 5) - 1 'décrémente une unité de temps de fonctionnement du moteur)

la colonne 5 du tableau VBA sert à décompter le temps d'utilisation ou le temps de repos. A chaque période, si le moteur est actif ou au repos, on enlève une unité de temps de ce compteur.

Bonjour h2so4,

Merci beaucoup pour avoir ajouter des lignes explicatives à votre démarche cela me paraît plus clair. Je vais m'inspirer de votre proposition pour tenter de résoudre mon problème. Je vous remercie sincèrement pour votre aide qui m'est très utile, encore merci.

En vous souhaitant une bonne fin de semaine et un bon week-end,

Cordialement.

Bonjour à tous

Ma variante corrigée...

13prog-essais-v2.xlsm (30.49 Ko)

Bye !

Bonjour à tous,

Je viens de nouveau vous demander de l’aide car suite à votre proposition qui fonctionne à merveille h2so4, je souhaite intégrer la vérification de la vitesse cumulée des moteurs. On a la vitesse initiale cumulée rentrée par l’utilisateur (V0) en cellule « F10 ». « B11 » représente la vitesse cumulée maximale à ne pas dépasser et « B12 » la vitesse minimale cumulée. Des cellules « G10 » à « FR10 » j’ai entrer sur la feuille une formule à condition d’affichage permettant de connaitre le cumul des vitesses à chaque pas de H.

Je viens demander de l’aide dans le forum afin de pouvoir corriger le code ci-joint de la manière suivante : tant que l’on a pas atteint les valeurs seuils de cumuls de vitesse (« B11 » et « B12 ») on conserve la tournure actuelle.

Cependant, si on atteint ou dépasse les 2000 m/s alors les moteurs « actifs » (présence d’un 2) à l’instant Hx passent en « attente » (présence d’un 1) dans les H+n tant que la vitesse cumulée n’a pas atteint 0,75*2000. Leur temps de fonctionnement est lui aussi mis en attente, c’est-à-dire qu’une fois les 0.75*2000 atteints, les moteurs initialement actifs avant mis en attente, sont remis en marche avec leur temps de fonctionnement restant. Par exemple si le moteur 6 a tourné pendant 24h puis a été mis en attente car la valeur seuille a été atteinte, une fois relancé, il tourne pendant encore les 11h restantes.

De même, si l’on est dans le cas où on est en dessous des 800m/s alors les moteurs en « attente » (présence d’un 1) sont activés (ils passent à 2) tant que l’on a pas atteint les 1.75*800. Une fois cette valeur atteinte, ils sont alors mis en repos même si il reste du temps de fonctionnement.

Je viens une nouvelle fois demander de l’aide car il s’agit de la dernière marche du programme et que malheureusement je suis dans l’incapacité de pouvoir résoudre seul ce dernier obstacle.

Je vous remercie d’avoir pris du temps pour lire ma requête et vous suis reconnaissant d’avance si vous avez des propositions ou des pistes pour m’aider à régler ce problème.

En vous souhaitant une bonne journée et une bonne semaine,

Cordialement

doublon avec un autre message :

Rechercher des sujets similaires à "peu aide code vba"