VBA - bloc opératoire

Bonjour à tous et bonne année 2017 !

Je reviens vers vous afin que vous m'apportiez votre aide sur un projet de planification d'un bloc opératoire. C'est un exercice assez simple mais le réaliser est assez complexe (pour moi hein ).

Voici le problème : il faut réussir à créer un outil permettant de placer les opérations les plus urgentes (indiqué par un 3 dans la colonne F), en premier dans les colonnes rose allant de L à AS. Puis après les n°3 faire de même avec les n°2 et les n°1 (toujours de la colonne F). Le tout en respectant la valeur "capacité dispo" ne jamais la dépasser mais s'y approcher au plus près.

Le but étant :

1) dans la colonne G, l'utilisateur va rentrer un numéro de jour de 1 à 12 (correspond à 1 jour, soit 12 jours ; une colonne par exemple la colonne L correspond au jour 1, la colonne O au jour 2 etc jusqu'au 12ième jour en colonne AS...)

2) Dès lors que l'utilisateur renseigne ses jours dans la colonne F, doit apparaître dans la colonne H l'emplacement de cette opération (par exemple, si je met 1 dans la colonne F ligne 5, on doit me renvoyer L7 dans la colonne H).

3) le plus compliqué à mon avis : une fois les points précédents réalisés, il faut maintenant placé automatiquement les urgences dans les colonne allant de L à AS (en rose). Toujours les n°3 en premier puis les n°2 et enfin les n°1. Le tout en prenant en compte la valeur de "capacité dispo" renseigné en vert dans chaque colonnes (ne jamais la dépasser, mais s'y approcher au plus près). Une fois approché au mieux de la "capacité dispo", on continue dans la colonne suivante et ainsi de suite jusqu'à la 12 ième (colonne AS).

Le tout peut être réalisé en VBA, juste en utilisant des fonctions etc... mon plus gros problème consiste à placer automatiquement les urgences dans les colonnes en fonction de leur degrés d'urgence (et de s'approcher au plus près de la valeur cible "capacité dispo" avant de changer de colonne)

Le tout est présent dans le fichier Excel joint que j'ai déjà commencé (le fichier et le sujet mieux expliqué surement ).

Merci à tous pour votre aide !

Bonjour,

Ca a tout l'air d'être un exercice, on ne va pas faire tes devoirs...

Commence déjà ton travail et revient si tu as une question précise sur UNE difficulté.

eric

Bonjour Eriiic,

Effectivement j'ai mis en ligne le mauvais fichier Excel qui est bien mon exercice.

Je joins ici le fichier sur lequel je travaille (ou vous trouverez mes macros et fonctions).

Donc, sur ce fichier, en rentrant des valeurs de 0 à 12 dans la colonne F, s'affiche dans la colonne G la ligne ou doit se copier les valeurs. jusqu'ici j'ai réussi à l'aide d'une macro.

Ce que je n'arrive pas à faire et c'est là ou j'ai besoin de votre aide (piste, exemple sur fichier excel...), c'est pour placer seulement mes urgences n°3 dans la colonne L14 --> puis dès que j'ai atteins (ou approché au plus près) ma valeur cible en L7 de ma colonne L --> continuer à mettre mes urgences (le n°3 en priorité puis les 2 et 1) dans les autres colonnes à savoir la O (toujours en respectant la valeur cible "capacité dispo" de chaque colonnes)

J'espère avoir été clair et que vous allez pouvoir m'aider car je suis complétement bloqué. J'imagine qu'un compteur va devoir être utilisé, mais je n'y arrive pas seul

Merci !

26test.xlsm (27.29 Ko)

Il faut faire comme si tu le faisais à la main, plusieurs boucles imbriquées

Une première b1 qui parcours tes degrés de 3 à 1

Une autre b2 qui parcours les interventions (3 fois donc) et :

  • si c'est le bon degré :
  • une autre boucle b3 qui parcours tes 12 jours (step 3 sur les colonnes) et :
  • si durée compatible place sur première ligne dispo et exit for
  • sinon next b3
+ alerte si une opération n'est pas plaçable

La boucle b3 n'existe que si tu peux décaler une intervention le jour suivant

eric

Merci pour votre réactivité !

Donc pour la première boucle, voici ce que je peux écrire (corrigez moi si j'ai faux) :

Sub parcourir_degres()
Dim FL1 As Worksheet, Cell As Range, Plage As Range
Dim Var1

    Set FL1 = Worksheets("Feuil1")
    With FL1

        Set Plage = .Range("E5:E104")
        For Each Cell In Plage

            'Valeur de la cellule lue
            Var1 = Cell.Value
        Next
    End With
    Set FL1 = NoThing
    Set Plage = NoThing
End Sub

Mais que dois-je faire avec ? car je parcours mes données mais rien ne se passe. Faut-il séparer les données ??

Quand vous me dites "une autre boucle b2 pour parcourir les interventions (3 fois)" qu'appelez-vous interventions ?

Pour ma boucle b3, je peux reprendre le code de ma boucle 1 en la faisant pour chaque colonnes rose ? je n'ai jamais utilisé step...

Merci ! je joins l'avancement du fichier avec la boucle b1

4test.xlsm (31.87 Ko)

Je te met le pied à l'étrier que tu démarres, mais je n'en ferai pas plus.

C'est à toi de travailler...

Je ne vois rien de nouveau par rapport à ce que tu avais.

Je t'ai dit

Une première b1 qui parcours tes degrés de 3 à 1

:
For urg = 3 to 1 step -1
  ' ta boucle qui sera parcourue 3 fois
   For Each Cell In Plage
      ' si urgence de l'intervention = urg ET qu'il reste de la place le jour prévu alors tu la places
   next cell
next urg

.offset() pourrait te servir

eric

merci, mais malheureusement je ne sais pas faire. Bien que je saches écrire "littéralement" le code que je veux réaliser, je ne sais pas le retranscrire en VBA, surtout les boucles n'ayant jamais eu de cours basés sur Excel.

ce n'est pas grave merci quand même.

Ben je te l'ai écrite la boucle non ?

Bonjour à tous et particulièrement à Eric !

Après plusieurs essais de création de ma macro à l'aide d'exemples trouvés sur internet j'ai enfin réussi ! mais ce matin problème, la macro ne fonctionne plus, enfin plus rien ne se passe alors que je ne n'ai pas touché au code pouvez vous m'aider ?

8test2.xlsm (29.95 Ko)

Bonjour,

Ca m'étonnerait que ta macro ait fonctionné correctement comme ça...

1) ton bouton n'est lié à aucune macro...

2) il faut que tu débogues

  • menu Affichage, ajouter la fenêtre espion
  • tu sélectionnes l'expression
Cells(i, 7) + 9 = ""

que tu fais glisser dans la fenêtre Espions

  • tu mets ton curseur au début de la macro et tu fais en pas à pas avec F8
  • arrivé sur la ligne de test regarde la valeur de ton espion si c'est ce que tu attends
Tu peux contrôler toutes les expressions et variables que tu juges utiles pour continuer le débogage.

A regarder vite fait j'ai l'impression que la logique n'est pas totale pour obtenir ce qui t'était demandé.

Déjà personnellement j'aurais mis la boucle For A = 1 To 12 'Balayage des jours du planning à l'intérieur de For i = 5 To 104 : je prend une intervention et j'essaie de la placer au plus tôt. D'ailleurs tu avais dit que c'était l'utilisateur qui choisissait le jour, pas la macro...

Tu inscris F:G et tu testes ensuite si c'est possible, pour l'effacer ensuite si ça coince.

Où est la logique ??? Teste d'abord avant d'inscrire, et tu dois tester si la somme des interventions + celle que tu veux ajouter est valide, et s'il te reste une ligne disponible pour l'inscrire ce jour là (et la trouver).

Il y aurait sans doute d'autres choses à dire mais tu as déjà de quoi faire.

eric

Merci Eric, j'ai effectivement tout testé avec la fenêtre espion que je ne connaissais pas et c'est bien mon "+7" qui ne fonctionnait pas. Maintenant, cela fonctionne (j'ai bien les 3 au début, puis les 2 puis les 1 le tout respectant ma valeur cible".

Effectivement, le but principal est d'arrivé à faire pareil mais juste après que l'utilisateur est renseigné ces valeurs de 0 à 12 (l'utilisateur rentre d'abord ses valeurs puis on lance la macro).

Tu me dis, "j'aurais mis la boucle For A = 1 To 12 'Balayage des jours du planning à l'intérieur de For i = 5 To 104", mais comment faire ? juste en la copiant en dessous de mon for i= 2 to 101 ?? car cela me désorganise tout quand je le teste

voilà le nouveau fichier (plus grand que l'ancien car j'ai adapté ma macro à ma feuille de rendu)

merci !

Si c'est l'utilisateur qui saisi et impose le jour cette boucle est inutile.

Je vois bien, mais comment faire car si j'enlève les références à mon J, le programme va devoir considérablement changé ??

Avec tes boucles tu as trouvé une intervention à placer.

Comment tu ferais manuellement pour la placer au mieux ?

Quelles questions te poserais-tu pour la mettre ici avant de regarder le jour suivant ?

C'est l'algorithme que tu dois utiliser

Comment tu ferais manuellement pour la placer au mieux ?

--> pour la placer au mieux, je commencerais par regarder la date en colonne D (la plus ancienne) et le degré d'urgence (les 3 en priorité) puis je commencerais à remplir avec les urgences 3 les plus anciennes dans ma première colonne rose et ainsi de suite

Quelles questions te poserais-tu pour la mettre ici avant de regarder le jour suivant ?

--> première : Puis-je rentrer toutes mes urgences 3 les plus anciennes dans ma première colonne rose ?

deuxième : toutes ces urgences sont elles compatibles avec ma charge de travail imposé "capacité dispo" ?

-> si OUI : les placer dans la première colonne

-> si NON : placer les urgences 3 avec les dates les plus anciennes et premier et compléter avec les urgences 3 de la deuxième date plus ancienne

Mais comment transcrire sa dans mon code ?

Relis ça :

https://forum.excel-pratique.com/excel/vba-bloc-operatoire-t88194.html#p511774

tu as fait les boucles b1 et b2, reste la b3 que je trouve mal placée.

Après ce ne sont que des tests à réaliser.

Aller je te fais un petit bout :

For jour = 1 to 12
  ' tu calcules la colonne
  lig = cells(4,colonne_en_cours_que_tu_as_calculé)].End(xlDown).Offset(1).Row 'donne la 1ère ligne dispo de la colonne. 
  If lig<=24 ' c'est que tu as de la place. 
    If il reste assez de temps then
      'tu la places en cells(lig,colonne_en_cours_que_tu_as_calculé) 
      'et tu mets à jour le reste, 
      exit for ' IMPORTANT, c'est placé, pas la peine de la replacer
    endif
endif
next jour ' sinon on essaie jour suivant
if jour >12 then
  ' y'a un os, intervention non placée, à traiter ou pas, ou bien tout arrêter c'est toi qui voit
endif

A mettre dans la boucle b2 qui doit te présenter d'abord les urg=3 non placées, puis les 2, puis les 1.

C'est bon ?

eric

Rechercher des sujets similaires à "vba bloc operatoire"