Fonction choix aléatoire avec condition

Bonjour, Premier poste donc j'en profite pour me présenter, Matthieu, 24ans, interne en médecine. Utilisateur occasionnel d'excel. Je ne sais pas programmer mais connais un peu le principe pas le langage, mes utilisations de l'ordinateur sont plus dans la retouche images, ou l'édition web ( mais avec des logiciel wysiwyg ).

Malgré mes recherches je n'ai pas réussi à trouver une réelle réponse à mon problème.

Je dois réaliser une liste de garde pour les urgences de mon hopital. J'aurai voulu utiliser la fonction aléatoire d'excel pour répartir celle-ci. Mais j'ai des conditions à mettre.

Sur mon fichier de départ j'ai le nom et le service de chaque personne. (1service = 1 colonne)

A l'arrivée je dois avoir 3noms par jour en respectant

  • pas 2 personnes du même service
  • plus de 2jours entre 2gardes

Donc dans mon idée je voulais créer quelques choses du style

feuille 1 = liste avec une colonne par service

feuille 2,3.....= mois avec colonne A,B,C ( NOMS) ligne (jours) ou juste avoir une liste dans la feuille 1 où j'ai par exemple 200 lignes avec 3 colonnes (1 nom par colonnes / une ligne par jour )

=> fonction aléatoire sur ensemble des noms résultat = 3noms (sur 3 colonne) sur 31 ligne ( nombre de jour dans le mois)

condition

si nom A-B meme colonne alors retirer B

si nom B-C meme colonne alors retirer C

si nom B-C meme colonne alorsretirer C

si nom A = nom A ligne A-1 ou A-2 ou B-1 ou B-2 ou C-1 ou C-2

si nom B = nom A ligne A-1 ou A-2 ou B-1 ou B-2 ou C-1 ou C-2

si nom C = nom A ligne A-1 ou A-2 ou B-1 ou B-2 ou C-1 ou C-2

Du coup je pense que pour ce genre de chose VBA est peu être plus adapté qu'une simple fonction excel.

J'espère que j'ai su être claire, car réfléchissant sur le problème depuis quelques jours j'ai l'impression de commencer à ne plus trop l'être .....

Merci d'avance pour les réponses

PJ: un fichier type représentant ce que je cherche a avoir

Salut et bienvenue sur le Forum,

Je ne suis pas arrivé à réaliser ton souhait

Dans le fichier ci-joint, les collaborateurs devraient être placés dans les 3 colonnes "Internes A", "Internes B" et "Internes C" d'une manière aléatoire - sans que deux personnes du même service se trouvent sur la même ligne - jusqu'à ce que tous aient été pris en compte, puis on recommence une nouvelle fois avec tous les collaborateurs.

Autrement dit, la totalité des collaborateurs devraient se trouver 1 fois dans les 13 premières lignes, puis 1 fois dans les 13 lignes suivantes, etc.

Par contre il se pourrait qu'un collaborateur se trouve exceptionnellement sur la 13ème ligne d'un cycle est sur la première d'un autre cycle. Est-ce vraiment gênant ?

Si je t'ai bien compris, tu n'aurais pas voulu ces cycles de 13 lignes, mais est-ce déjà une première aide ?

Cordialement.

Bonsoir, tout d'abord merci de ta réponse si rapide, ça correspond exactement à ce que je cherchais à faire.

j'avoue ne pas avoir tout ( voir quasi rien) compris de la macro que tu as codé, j'ai identifié les quelques requettes, la boucle qui se fait.

Par contre je vais avoir encore avoir besoin de tes conseils, car bien sur le nombre des internes par service n'est pas égal, donc je vais avoir des colonnes plus longue que d'autre. Et je n'arrive pas a identifé ou se fait la sélection des cases pour le tirage aléatoire ( je pense que c'est le <> range(A2:M4)<> mais du coup comment le modifié si j'ai des colonnes de tailles différentes ( comme j'ai pu mettre dans le PJ).

Puis il faut que je modifie la taille du cycle en fonction de "nombre d'interne/3" , d'instinct je remplacerai bien tout les 13 par la taille du cycle, les 14 par (taille du cycle+1), les 12 par (taille du cyle-1).... mais ne suis pas convaincu qu'il n'y est que ça à faire, ni que ce soit la bonne idée... Et si jamais le nombre d'interne n'est pas un multiple de 3, je prends un cycle plus grand ou plus petit?

Après pour modifier, la localisation des résultats, (seul truc que je pense avoir pleinement compris, j'espère que c'est bon) je transforme

Range("C11:H500").ClearContents qui doit devenir par exemple Range("C20:H500").ClearContents

A noter que les cycles m’intéresse ++++ car comme ça le décompte des gardes se simplifie nombre de garde = nombre de cycle

Merci

@Bientot

Salut,

thieummvtt a écrit :

.... car bien sur le nombre des internes par service n'est pas égal, donc je vais avoir des colonnes plus longue que d'autre.

Pourquoi ne pas l’avoir dit plus vite, ça aurait quand même clarifié les choses

Apparemment tu ne connais pas trop le langage VBA et il m’est difficile de te faire un cours par l’intermédiaire du Forum.

J’ai repris ton dernier fichier et j’ai simplement modifié les prénoms. Après avoir lancé «ta» macro, tu remarques que les prénoms des lignes 17 à 19 ne sont plus remplacées, que tu as placé des données provisoires dans la colonne N ainsi que dans la plage O6:U11 qui ne sont pas effacées, que des prénoms sont très souvent répétés sur deux lignes à la suite (dans le fichier tel que je te l’envoi, le Prénom 11 aux lignes 20 et 21), etc.

Je veux donc bien essayer de corriger mon code en fonction de tes nouvelles informations (et profites-en pour bien penser si tu as d’autres exigences que tu aimerais voir réaliser) mais je n'ai pas trop l'envie d’étudier et de tenter de corriger toutes tes tentatives de modifications.

Comme ta demande n’est plus du tout la même (par exemple en partant sur mon idée actuelle, des collaborateurs du service «SAU» se retrouveraient immanquablement ensemble lors des dernières journées d’un cycle), j’espère arriver quand même à te proposer une solution.

Il y aura quand même des cas extrêmes pour lesquels il sera impossible de ne pas faire travailler deux personnes du même service ensemble (par exemple si tu as en tout et pour tout 20 personnes du service «SAU» et 1 personnes de la neurologie à ta disposition pour faire cette répartition).

thieummvtt a écrit :

Et si jamais le nombre d'interne n'est pas un multiple de 3 ….

Je n’ai encore aucune idée comment pourrait se résoudre ce problème.

Durant la nuit, j'ai eu une idée afin de ne pas travailler par cycle, mais avec une répartition par année, mais j'ai aussi eu une idée afin qu'une personne ait au minimum 1 à 2 lignes d'écart entre deux services. Alors est-ce que cette idée de cycle te convient ou préférerais-tu une répartition par année ? Dans ce dernier cas, il y a quand même le risque qu'une personne travaille par exemple 3, 4 ou 5 fois de suite (avec des pauses de 1 à 2 lignes) en début d'année puis pratiquement plus durant le reste de l'année.

Alors, j’essaie de continuer ? As-tu de nouvelles exigences ?

A te relire.

167thieummvtt-v4.zip (27.90 Ko)

Merci,beaucoup pour ton implication, visiblement mon idée de départ est beaucoup plus complexe que ce que je pensais.

Malheureusement je pense que je vais arrêter de te faire corriger ton code. Les conditions à respecter son trop nombreuse et les variables trop évolutive. Car si je te donne la répartition exacte pour ce mois-ci, je serais obligé de revenir vers toi peu être dans 2mois, si j'ai une modification des équipes.

Je vais utiliser la derniere version pour faire le mois de décembre.Et corriger manuellement les dates qui pourrait poser problème. Par contre je ne m'avoue pas vaincu je vais attaquer les cours de VBA du site pour essayer de comprendre (vraiment) le code. et ainsi partir de la macro initiale pour y apporté les modif nécessaire.

En tout cas vraiment un grand merci pour ton implication et pour le temps que tu as passé dessus!!!

Rechercher des sujets similaires à "fonction choix aleatoire condition"