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 :

Sélection aléatoire sous condition


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2020
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2020
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Sélection aléatoire sous condition
    Bonjour à tous !

    Je me lance sur les macros et j'ai besoin de votre aide pour réaliser mon petit projet.

    J'ai deux listes l'une qui concerne des anciens de mon école et l'autre concerne les nouveaux étudiants.
    Mon objectif est de "matché" un ancien avec un nouveau selon un critère qui serait par exemple la spécialité (Finance, Marketing, Audit, etc..) et les préférences des nouveaux étudiants.

    L'Excel est constitué d'un onglet "ancien" et d'un autre onglet "nouveau"
    • Dans l'onglet ancien : tableau avec nom prénom spécialité (ex: Jean / Dupont / Finance)
    • Dans l'onglet nouveau : tableau avec nom prénom spécialité et une préférence (ex: Jean / Dupont / Marketing / Finance)


    Ma macro doit matcher les nouveaux en fonction de leur spécialité avec un ancien de la même spécialité et si aucun ancien ne reste dispo pour la spécialité alors chercher la deuxième préférence. En définitive, cela doit dresser une liste sur un autre onglet Nom prénom ancien / Nom prénom nouveau.

    J'ai commencé à définir les variables et l'initialisation mais je bloque sur la partie de sélectionner au hasard des individus uniquement entre ceux de la même spécialité.

    Merci pour votre aide très précieuse

  2. #2
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Citation Envoyé par momomulot Voir le message
    J'ai commencé à définir les variables et l'initialisation mais je bloque sur la partie de sélectionner au hasard des individus uniquement entre ceux de la même spécialité.
    Tu devrais déjà montrer ce que tu as fait.
    Cela dit, il est étonnant de déclarer les variables sans avoir écrit de code : comment savoir de quelles variables on aura besoin sans savoir ce qu'on va faire ?
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  3. #3
    Membre du Club
    Homme Profil pro
    No
    Inscrit en
    Février 2018
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : No

    Informations forums :
    Inscription : Février 2018
    Messages : 42
    Points : 45
    Points
    45
    Par défaut
    La macro s'applique a un classeur qui contient 2 onglets :
    -"Ancien" qui contient un tableau de 3 colonnes (B3 à Dx) dont les entêtes en ligne 2 sont "Prenom, "NOm", "Specialite" (Audit, Finance,....)
    - "Nouveau" qui contient un tableau de 4 colonnes (B3 à Ex) dont les entêtes en ligne 2 sont "Prenom", Nom", Specialite1", "Specialite2"

    A la fin de la macro
    - Le prenom NOM de l'ancien rattache est affiche en colonnes G,H de la feuille "Nouveau"
    - Un "Ancien" rattache a un nouveau est repere par un "X" en colonne "A" de l'onglet "Ancien"
    - certains nouveaux peuvent ne pas avoir d'ancien rattache si le nombre des anciens n’est pas suffisant( 1 ancien ne peut être rattaché qu'a un seul nouveau)
    - Si aucun ancien ne possède la spécialité renseignée dans le profil de nouveau, la macro le signale
    - certains anciens peuvent ne pas avoir de nouveau rattaches si leur spécialité n'est pas représentée dans « Nouveau » ou si au contraire trop d'anciens possèdent la spécialité concernée par rapport au nombre de nouveaux

    La macro n’est ni optimisée, ni écrite de façon académique.
    Je te la soumets quand même elle me semble fonctionner

    Principe
    - Pour chaque « Nouveau » cherche dans la feuille « Ancien » si il existe un ancien qui possède la spécialité 1 et qui n’est pas déjà relie a un nouveau (pas »X » en colonne « A »)
    - Si à la fin de la passe « Specialite1 », il reste des nouveaux sans lien avec un ancien, faire la même chose avec la specialite2

    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
    Sub test()
    'lst_n = derniere ligne du tableau nouveaux
    'lst_a = derniere ligne du tableau "ancien" dans feuille "Nouveau"
    lst_n = Cells(3, 3).End(xlDown).Row
    lst_a = Cells(3, 8).End(xlDown).Row
    'a, b variables muettes d'initialisation
    a = 0
    b = 1
    While a <> b And k < 2 ' k=nb sp -1 dans Nouveau
        Sheets("Ancien").Select
        'lst_lg = derniere ligne du tanbleau "Ancien"
        lst_lg = Cells(6400, 2).End(xlUp).Row
        'pour tous les nouveaux
        For i = 0 To Sheets("Nouveau").Cells(3, 2).End(xlDown).Row - 3
            Cells(2, 4).Select
            'si nouveau n'est pas deja lie a ancien
            If Sheets("Nouveau").Cells(3 + i, 8) = "" And Sheets("Nouveau").Cells(3 + i, 4 + k) <> "" Then
                ligne = 0
                'recherche sp(specialite) dans tableau ancien
                On Error Resume Next
                lg = Sheets("Ancien").Columns("D:D").Find(Sheets("Nouveau").Cells(3 + i, 4 + k)).Row
                'Si sp nouveau n'existe pas dans le tableau ancien
                If Err <> 0 Then
                    MsgBox "La specialite du nouveau de la ligne " & 3 + i & " n'existe pas dans le tableau des anciens"
                    Err.Clear
                    On Error GoTo 0
                    Exit Sub
                Else
                lg0 = lg
                'si ancien PAS deja lie a un nouveau
                If Sheets("Ancien").Cells(lg, 1) <> "X" Then
                    ligne = lg
                    Sheets("Ancien").Cells(ligne, 1) = "X"
                    Sheets("Nouveau").Cells(3 + i, 7) = Sheets("Ancien").Cells(ligne, 2)
                    Sheets("Nouveau").Cells(3 + i, 8) = Sheets("Ancien").Cells(ligne, 3)
                Else
                    'cherche ancien suivant avec spe
                    l = 0
                    'conditions fin de recherche
                    While lg < lst_lg And ligne <> lg And (lg <> lg0 Or l = 0)
     
                        Sheets("Ancien").Cells(lg, 4).Select
                        lg = Columns("D:D").FindNext(After:=ActiveCell).Row
                        l = l + 1
                        'si ancien PAS deja parrain reporte dans feuille nouveau
                        If Sheets("Ancien").Cells(lg, 1) <> "X" Then
                            ligne = lg
                            Sheets("Nouveau").Cells(3 + i, 7) = Sheets("Ancien").Cells(ligne, 2)
                            Sheets("Nouveau").Cells(3 + i, 8) = Sheets("Ancien").Cells(ligne, 3)
                            Sheets("Ancien").Cells(ligne, 1) = "X"
                        End If
                    Wend
                End If
            End If
        End If
        Next
        '=nb de nouveaau
        'b =nb nouveaux rattaches a un ancien
        a = WorksheetFunction.CountA(Sheets("Nouveau").Range("C3:C" & lst_n))
        b = WorksheetFunction.CountA(Sheets("Nouveau").Range("H3:H" & lst_n))
        k = k + 1
    Wend
     On Error GoTo 0
    End Sub

Discussions similaires

  1. [XL-2016] Composition d'équipe aléatoire sous condition
    Par Halpness dans le forum Excel
    Réponses: 2
    Dernier message: 24/05/2019, 12h35
  2. Creer des vecteurs de nombres aléatoires sous conditions
    Par FearGod dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 14/03/2016, 10h37
  3. [XL-MAC 2011] Afficher une donnée aléatoire sous condition
    Par Donv29 dans le forum Excel
    Réponses: 1
    Dernier message: 17/03/2012, 13h17
  4. [AC-2003] sous Requete sélection aléatoire dans requete update. Problème de syntaxe
    Par Chagui dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 19/04/2011, 11h58
  5. filtré des lignes aléatoirement mais sous condition
    Par afssaLERH dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 21/11/2008, 16h10

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