Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2013 remplir une liste aléatoirement et sans doublons

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

kingfadhel

XLDnaute Impliqué
Bonjour à tous,
Je viens encore une fois vers les XLDs, à la recherche d'une solution pour un petit problème.
- J'ai trois listes d'agents, chacune dans une colonne
- J'ai un nombre bien déterminé de poste ou je dois leurs affecter le personnel.
- Je dois affecter, aléatoirement et sans doublons, les matricules selon le nombre demandé dans la zone "F3:L3".

les agents de la liste A ne sont affecté que dans les colonnes F et G et le reste dans M
les agents de la liste B ne sont affecté que dans les colonnes H et I et le reste dans M
les agents de la liste C ne sont affecté que dans les colonnes J,K et L et le reste dans M
 

Pièces jointes

Bonsoir kingfadhel, bernard, sylvanu,

Une solution assez facile à comprendre dans le fichier joint :
VB:
Sub Tirages()
Dim a, d As Object, decal&, col%, ligmax&, n%, nn%, c As Range, im&, i&, lig&
a = Array([F3:G3,M3], [H3:I3,M3], [J3:L3,M3])
Set d = CreateObject("Scripting.Dictionary")
decal = 3 'les résultats sont décalés de 3 lignes
Randomize
Application.ScreenUpdating = False
For col = 1 To UBound(a) + 1 'numéro de la colonne source
    d.RemoveAll 'RAZ
    ligmax = Application.CountA(Columns(col)) 'il ne faut pas de cellules vides...
    n = 0
    nn = a(col - 1).Count
    For Each c In a(col - 1)
        n = n + 1
        If n < nn Or im = 0 Then c(decal + 1).Resize(Rows.Count - c.Row - decal + 1).ClearContents 'RAZ de la colonne
        For i = IIf(n = nn, im + 1, 1) To Val(c)
            If d.Count = ligmax - 1 Then Exit For
            Do
                lig = Application.RandBetween(2, ligmax) 'nombre entier aléatoire
            Loop While d.exists(lig)
            d(lig) = ""
            c(decal + i) = Cells(lig, col) 'restitution
            If n = nn Then im = i 'mémorise la ligne
Next i, c, col
End Sub
Nota : s'il y avait plusieurs milliers de valeurs en colonnes A B C il faudrait utiliser des tableaux VBA pour restituer les résultats, je ne le fais pas pour que ce soit plus compréhensible.

A+
 

Pièces jointes

Dernière édition:
J'ai testé avec 3333 matricules dans chacune des colonnes A B C donc 9999 au total.

La macro s'exécute chez moi en 1 seconde, pas besoin de tableaux VBA.

Edit : la durée se décompose en :

- calculs => 0,75 à 0,9 seconde

- restitution dans la feuille => 0,25 seconde.
 
Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
29
Affichages
928
Réponses
6
Affichages
325
Réponses
3
Affichages
136
  • Question Question
XL 2021 Doublons
Réponses
7
Affichages
135
Réponses
11
Affichages
248
Réponses
4
Affichages
106
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…