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

VBA Access Discussion :

code VBA pour faire des tri


Sujet :

VBA Access

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Octobre 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 5
    Points : 1
    Points
    1
    Par défaut code VBA pour faire des tri
    Bonjour,
    J’ai besoin un coud de main pour avec un code VBA access 2003, j’ai un table avec 5 champs
    1- Nom d’étudiant
    2- une note
    3- une option 1 (choix de classe entre A, B, C et D) (champ n’est pas vide)
    4- une option 2 1 (choix de classe entre A, B, C et D) (peut être vide)
    5- une option 3 1 (choix de classe entre A, B, C et D) (peut être vide)

    les données sont classées par l’ordre croissante des notes
    je veux remplir les 4 classes par ces nom sachant que les classes n’ont pas le même capacité d’accueille. (n1, n2, n3, n4)
    L’algorithme doit commencer par le 1er et le mettre dans la classe correspondant à son choix (option 1) et puis le 2eme et …. Etc et à chaque étape va vérifier si la classe est complet (si oui il va fermer cette classe). si un nom veux comme une option 1 la classe A par exemple et la classe A est déjà complet l’algorithme doit regarder son 2eme option et s’il est par example la classe C va vérifie son état (complet ou pas )…..

    L’algorithme s’arrête quand toutes les classes sont complètes

    Un code VBA si vous pouvez m’aider


    Ou si possible sous Excel

    Je vous merci par avance

  2. #2
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 281 907
    Points
    281 907
    Par défaut
    Bonjour,

    Pour mettre au point, j'ai testé. A toutes fins utiles je joins la db de test [Access2000]

    Je suppose
    - un champ "Retenu" dans la table
    - que les choix ont d'abord été validés
    - si ex aequo dans les prioritaires, le hasard est déterminant
    - dès qu'une colonne option est "null", le candidat n'est plus en lice
    - pour simplifier, les disponibilités sont dans le code (prévoir une table)

    J'ai ajouté des commentaires au code qui devraient permettre de comprendre l'algorithme. Reviens si pas suffisant.

    J'aurais voulu une syntaxe plus concise (éviter le select case). Je reviens si je trouve.





    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    Public Sub Attribution()
    Dim rstCandidats As Recordset
    Dim iOption As Integer, jCapacité As Integer
    Dim DisponibleA As Integer, DisponibleB As Integer, DisponibleC As Integer, DisponibleD As Integer
     'Initialiser les "disponible"
    DisponibleA = 2: DisponibleB = 3: DisponibleC = 4: DisponibleD = 1
    'classer les candidats par priorité et affecter
    Set rstCandidats = CurrentDb.OpenRecordset("SELECT Candidats.Nom, Candidats.note, Candidats.option1, Candidats.option2, Candidats.option3, Candidats.Retenu  FROM Candidats ORDER BY Candidats.note DESC;")
      Do Until rstCandidats.EOF
            rstCandidats.Edit
               For iOption = 2 To 4  'colonnes 3 à 5 de rstCandidats
                 If IsNull(rstCandidats(iOption)) Then
                    GoTo AuSuivant                     'les choix sont épuisés
                 Else
                      Select Case rstCandidats(iOption)
                      Case "A"
                          If DisponibleA > 0 Then 'il reste de la place
                             rstCandidats(5) = "A"  ' on affecte
                             rstCandidats.Update    ' on met la table à jour
                             DisponibleA = DisponibleA - 1 'on émarge le disponible
                             GoTo AuSuivant
                          Else
                             GoTo OptionSuivante  'plus de place pour cette option --> voir suivante
                          End If
                       Case "B"
                          If DisponibleB > 0 Then 'il reste de la place
                             rstCandidats(5) = "B"
                             rstCandidats.Update
                             DisponibleB = DisponibleB - 1
                             GoTo AuSuivant
                          Else
                             GoTo OptionSuivante
                          End If
                      Case "C"
                          If DisponibleC > 0 Then 'il reste de la place
                             rstCandidats(5) = "C"
                             rstCandidats.Update
                             DisponibleC = DisponibleC - 1
                             GoTo AuSuivant
                          Else
                             GoTo OptionSuivante
                          End If
                      Case "D"
                          If DisponibleD > 0 Then 'il reste de la place
                             rstCandidats(5) = "D"
                             rstCandidats.Update
                             DisponibleD = DisponibleD - 1
                             GoTo AuSuivant
                          Else
                             GoTo OptionSuivante
                          End If
     
                      End Select
     
                 End If
     
     
    OptionSuivante:
               Next iOption
     
    AuSuivant:
    rstCandidats.MoveNext
      Loop
    End Sub
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Octobre 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 5
    Points : 1
    Points
    1
    Par défaut merci
    Merci beucoup pour votre algorithme je vais le tester sur ma base avec 12000 records et je vous donne les resu après

  4. #4
    Nouveau Candidat au Club
    Inscrit en
    Octobre 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 5
    Points : 1
    Points
    1
    Par défaut problème d'égalité
    Bonjour,
    D’abord je voulais vous dire que votre algorithme marche super bien, j’ai besoin de savoir si possible d’améliorer cet algorithme pour qu’il puisse gérer les cas où on a des égalités de note, exemple :
    La classe A a la capacité de 135 et le dernier étudiant accepté a la note de 50, mais on a encore des étudiants qui ont la note de 50 et ils ont comme option 1 la classe A, donc on ne peux pas les refuser car ils ont les même droit d’être dans la classe A s’il y a un dans la classe A qui a la note de 50, pour cela il faut regarder la capacité comme un chiffre pas fixe (ça peut être mois qu’annoncer ou plus), nous allons accepter d’ajouter 20% de plus sur la capacité de chaque classe si on sera obligé (égalité des notes) ou on va mettre moins que prévu si l’égalité va nous obliger à dépasser le 20% de capacité annoncé.

    Donc là ça va jouer quand on veux affecter le dernier de chaque classe, l’algorithme va s’arrêter pour prendre une cigarette et un café et puis regarder s’il y a d’égalité et combien et puis il va décider ce qu’il va faire, dès qu’il règle ce problème va recommencer son affectation.

    Finalement j’ai bien apprécié votre rapidité de réponse et j’espère que vous allez régler cette problème.

    Bien cordialement

  5. #5
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 281 907
    Points
    281 907
    Par défaut
    Bonjour,

    A mon avis, il faut éviter deux choses :

    - que cela ne devienne trop compliqué
    - que la solution incite à fumer … par contre un petit café à cette heure-ci …

    Vous devriez envisager un deuxième tour pour ceux qui n’ont pas été élus au premier ou qui l’ont été de justesse.
    Il me semble que la décision finale ne devrait pas être laissée à un programme.

    Je vous suggère donc de procéder comme ceci :
    1° un premier tour : l’algorithme pur et dur
    2° examiner les résultats pour faire émerger les problèmes : les classes surpeuplées ou … désertées.
    3° avec une requête (en exploitant le champ « retenu ») constituer une table par problème identifié avec les candidats en ballottage c’est-à-dire qui n’ont pas d’affectation ou qui ont été élus de justesse au premier tour.
    4° procéder par itérations successives : soumettre chaque table à l’algorithme avec des paramètres adaptés pour aider à prendre la décision finale.
    5° une dernière vérification : soumettre la table originale à l’algorithme avec les paramètres finals* (nombre de places disponibles exceptionnellement élargi et avec 0 place disponible pour les options que l’école aurait renoncé à organiser cette année vu le trop peu de candidats)

    Bonne rentrée !

    * sûr !
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  6. #6
    Nouveau Candidat au Club
    Inscrit en
    Octobre 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 5
    Points : 1
    Points
    1
    Par défaut merci
    merci bien je vais voir tous ça.

  7. #7
    Nouveau Candidat au Club
    Inscrit en
    Octobre 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 5
    Points : 1
    Points
    1
    Par défaut challange
    bonjour Claude,
    Finalement j'ai adopté le point 5, avec des paramètres entrés à la main pour chaque classe et chaque situation. mais ça reste un chalenge pour moi de le faire marcher tout seul (algorithme intelegent capable je gérer tout seul le problème)

    Bien cordialement

  8. #8
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 281 907
    Points
    281 907
    Par défaut
    Un peu plus de confort.
    vois le formulaire.
    Pièce jointe 68273
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

Discussions similaires

  1. [XL-2013] Simplifier un code macro en VBA pour faire un tri d'une liste personnalisée
    Par phanoulevoyou dans le forum Macros et VBA Excel
    Réponses: 19
    Dernier message: 17/11/2013, 12h23
  2. Réponses: 1
    Dernier message: 09/01/2012, 13h52
  3. Code VBA pour importer des données vers Excel
    Par thanmirt dans le forum SDK
    Réponses: 1
    Dernier message: 09/04/2011, 17h53
  4. [XL-2007] Code vba pour faire un explorateur
    Par theBinette dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 02/12/2009, 19h50
  5. [XL-2003] Code VBA pour fusion des Dossiers
    Par em_bengue dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 07/04/2009, 00h03

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