IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Répartir des cours dans des salles


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2011
    Messages : 64
    Points : 55
    Points
    55
    Par défaut Répartir des cours dans des salles
    Bonjour,

    Voilà mon problème :

    J'ai un nombre de minutes disponibles par salle.
    J'ai egalement des cours d'une certaine durée.

    Ce que je voudrai faire, c'est placer mes cours de manière à utiliser le moins de salle possible et sans débordement.

    Exemple :

    salle 1 : 20 cour 1 : 30
    salle 2 : 50 cour 2 : 20
    salle 3 : 70 cour 3 : 50
    salle 4 : 10 cour 4 : 10

    Ce que je voudrai obtenir c'est :
    salle 2 = cour1 et cour2
    salle 3 = cour3 et cour4

    Sachant qu'une seule peut accueillir plus de 2 cours si c'est possible

    J'espère que vous avez compris le principe ?

    J'avais pensé à d'abord trier mes nombres et ensuite faire un algorithme mais je me suis vite rendu compte que ca allait être vraiment galère voir impossible .

    Les pro de VBA ont-ils une idée ?

    Merci d'avance et très bonne journée à vous :-)

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 87
    Points : 105
    Points
    105
    Par défaut algo
    Bonjour,
    C'est en effet une question d'algorithmique intéressante qui n'a rien à voir spécialement avec VBA mais que les spécialistes VBA peuvent résoudre au même titre que tous les autres programmeurs.

    La récursivité est peut-être une piste

    Cela dit, il faudrait bien borner les limites du cahier des charges en terme de nombre de salles, de durées maxi (dispo salle, durée formation).

    Un jeu amusant en perspective ...

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2011
    Messages : 64
    Points : 55
    Points
    55
    Par défaut
    Le nombre de salle est de 11. Et le nombre de cour est de 17 .

    Il n'y a pas vraiment de maximum pour une durée. Enfin, elle est limité tout de même à 15h, c'est le temps de mise à disposition des salles.

    Certes un jeu amusant mais assez compliqué. La discussion avec les membres du forum emmènera surement une solution, du moins je l'espère ^^

  4. #4
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Bonjour.

    Tu vas devoir être plus précis dans la présentation de ton pb.
    Citation Envoyé par lyonnaisdu26 Voir le message
    J'ai un nombre de minutes disponibles par salle.
    J'ai egalement des cours d'une certaine durée.

    Ce que je voudrai faire, c'est placer mes cours de manière à utiliser le moins de salle possible et sans débordement.

    Exemple :

    salle 1 : 20 cour 1 : 30
    salle 2 : 50 cour 2 : 20
    salle 3 : 70 cour 3 : 50
    salle 4 : 10 cour 4 : 10

    Ce que je voudrai obtenir c'est :
    salle 2 = cour1 et cour2
    salle 3 = cour3 et cour4

    Sachant qu'une seule peut accueillir plus de 2 cours si c'est possible
    C'est quoi les nombres 20, 50, 70 et 10 dans ton exemple?
    Tu ne gères que des durées, pas des heures au sense Date/Heure?
    Si tu as 17 cours et 11 salles, les données ne peuvent pas se présenter comme dans ton exemple.

    Avec ce que tu as dit, pourquoi le résultat recherché n'est pas :
    Salle 1 : cours 1, cours 2, cours 3 et cours 4? Ca ne dépasse pas les 15 H de dispo...

    Je t'invite à faire un gros effort de spécification avant de chercher un algorithme puis un code.

    Cordialement,

    PGZ

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2011
    Messages : 64
    Points : 55
    Points
    55
    Par défaut
    Bonjour PGZ

    Citation Envoyé par pgz Voir le message
    Bonjour.

    Tu vas devoir être plus précis dans la présentation de ton pb.
    C'est quoi les nombres 20, 50, 70 et 10 dans ton exemple?
    Tu ne gères que des durées, pas des heures au sense Date/Heure?
    Les nombre 20, 50, 70 et 10, c'est le temps total mis à disposition des salles.
    Dans la salle 1, la somme des durees des cours ne pourra pas dépasser 20 min, pour la salle 2 ce sera 50 min ainsi de suite ...

    Oui je gère seulement des durées en minutes, il n'y a aucune date ...

    Citation Envoyé par pgz Voir le message

    Si tu as 17 cours et 11 salles, les données ne peuvent pas se présenter comme dans ton exemple.

    Avec ce que tu as dit, pourquoi le résultat recherché n'est pas :
    Salle 1 : cours 1, cours 2, cours 3 et cours 4? Ca ne dépasse pas les 15 H de dispo...
    Bah si pourquoi ? J'ai mis les cours à coté des salles pour la présentation, mais ca n'avait pas vraiment de sens, j'aurais pu avoir :

    sallle1 :2000
    salle2:1500

    cour1:900
    cour2:700
    cour3:300
    cour4:900
    cour5:400

    Dans ce cas, je souhaiterai obtenir :
    salle1:cour1, cour4
    salle2:cour2,cour3,cour5

    Les 15h, c'est un maximum, c'est rarement le cas. Et puis si c'est le cas, mes cours peuvent durer beaucoup plus longtemps ... (4h, 6h ...). Il ne s'agit enfaite pas vraiment de cour (c'est long 6h pour un cour ^^) mais ça n'a pas beaucoup d'importance ça.
    Je transforme mes données en minutes à chaque fois .

    Citation Envoyé par pgz Voir le message
    Je t'invite à faire un gros effort de spécification avant de chercher un algorithme puis un code.

    Cordialement,

    PGZ
    Je pensais que c'était plutôt clair mais si vous avez d'autres questions, n'hésitez pas.

    Cordialement

    CV

  6. #6
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Re,

    As-tu d'autres contraintes, comme minimiser le nombre de salles occupées? Toutes les solutions sont équivallentes ou tu cherches un optimum particulier? Dans ton dernier exemple
    sallle1 :2000
    salle2:1500

    cour1:900
    cour2:700
    cour3:300
    cour4:900
    cour5:400

    Dans ce cas, je souhaiterai obtenir :
    salle1:cour1, cour4
    salle2:cour2,cour3,cour5
    Ce que tu souhaites est-il meilleur, moins bon ou équivallent à :
    Salle 1 cours 1, cours 2, cours 4
    Salle 2 cours 3, cours 5?

    PGZ

    Bonsoir.

    Elle n'avance pas trop ta spécification.
    Je te propose quand même un code qui essaie d'économiser les salles, c'est-à-dire qu'il charche à minimiser le nombre de salles utilisées (c'est bon pour les coûts d'entretien).

    Hypothèses :
    Les salles sont listées dans une colonne, en nombre quelconques. Dans la colonne suivante, il y a les durées exploitables, la colonne suivante est vide (elle reçoit les résultats). La plage correspondant à toutes les lignes des salles et à ces 3 colonnes reçoit un nom défini "nmSalles".
    Les cours sont listés dans une colonne, en nombre quelconque. Dans la colonne suivante, il y a les durées des cours, dans la même unité que les salles. La plage correspondant, étendue à une 3 ème colonne reçoit le nom défini "nmCours".

    Voici le code
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    Sub subLyonnaisDromois()
    Dim vS As Variant, vC As Variant
    Dim s As Integer, c As Integer
    Dim oRng As Excel.Range
    Dim sngTot As Single
     
    'trier les cours et salles par durées décroissantes
    Set oRng = ThisWorkbook.Names("nmCours").RefersToRange
    oRng.Sort oRng(1, 2), xlDescending, , , , , , xlNo
    vC = oRng.Value
     
    Set oRng = ThisWorkbook.Names("nmSalles").RefersToRange
    oRng.Sort oRng(1, 2), xlDescending, , , , , , xlNo
    vS = oRng.Value
     
    'suppression des infos en colonnes 3 de S et C
    For s = 1 To UBound(vS, 1)
        vS(s, 3) = Empty
    Next s
     
    For c = 1 To UBound(vC, 1)
        vC(c, 3) = Empty
    Next c
     
    'remplir les salles
    For s = 1 To UBound(vS, 1)
        sngTot = 0
        'chercher s'il reste des cours à placer
        For c = 1 To UBound(vC, 1)
            If IsEmpty(vC(c, 1)) Then Exit For
        Next c
        If c = UBound(vC, 1) Then Exit For 'plus de cours à placer
        'chercher des cours pour la salle s
        For c = 1 To UBound(vC, 1)
            If IsEmpty(vC(c, 3)) And (sngTot + vC(c, 2) <= vS(s, 2)) Then
                'le cours c n'est pas placé et tient dans la salle s
                vS(s, 3) = vS(s, 3) & ", " & vC(c, 1)
                vC(c, 3) = vS(s, 1)
                sngTot = sngTot + vC(c, 2)
            End If
        Next c
        'enlever le premier ", " =  2 caractères
        If Not IsEmpty(vS(s, 3)) Then vS(s, 3) = Mid$(vS(s, 3), 3)
    Next s
     
    'écrire le résultat dans la feuille
    oRng.Value = vS
     
    Set oRng = Nothing
    vS = Empty
    vC = Empty
    End Sub
    Voilà. Ca répond à la spec formulée et même un peu plus.

    Cordialement,

    PGZ

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2011
    Messages : 64
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par pgz Voir le message
    Re,

    As-tu d'autres contraintes, comme minimiser le nombre de salles occupées? Toutes les solutions sont équivallentes ou tu cherches un optimum particulier? Dans ton dernier exemple Ce que tu souhaites est-il meilleur, moins bon ou équivallent à :
    Salle 1 cours 1, cours 2, cours 4
    Salle 2 cours 3, cours 5?

    PGZ
    Salut,

    Cette répartition est moins bonne, tout simplement parce que la somme des durées cours et supérieur à la durée de la salle 1. Il faut éviter les débordement.

    Merci beaucoup, j'ai testé ton programme il marche niquel. Je vais regarder tout ça d'un peu plus près. N'ayant pas des connaissances aussi poussé que toi, j'aurais surement quelques questions, j'espère que tu auras un peu de temps à m'accorder

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment ajouter des séries dans des graphes sur des feuilles variables
    Par Molomarcopolo dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 06/07/2012, 16h26
  2. Des bénévoles pour donner des cours dans les langues : Français, Anglais et Arabe
    Par witch dans le forum La taverne du Club : Humour et divers
    Réponses: 15
    Dernier message: 24/02/2012, 23h47
  3. recherches des cours ou des explications sur les algorithmes
    Par Marcus2211 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 19/05/2002, 22h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo