Comment puis-je utiliser excel pour créer des noms randoms avec des valeurs entre une certaine quantité?

J'ai 100 noms dans une colonne. Et à côté de chaque nom dans la cellule suivante, il y a une valeur numérique dont le nom vaut. Il y a 6 positions dans une entreprise que chaque nom pourrait contenir. Et c'est aussi dans une cellule à côté de chaque nom.

Donc, la feuille de calcul ressemble à quelque chose comme ça.

 Avocat John Smith 445352 $

 Joe Doe Doctor $ 525222

 John Doe Accountant $ 123192 

 etc....

Je veux que l'on me donne 10 personnes qui font un montant combiné entre 2 et 3 millions de dollars. Mais j'ai besoin que 2 des personnes soient des médecins 2 soit des avocats et 2 des comptables, etc. Comment créer cela?

J'ai configuré la fiche 1 avec datatables suivantes:

entrez la description de l'image ici

Objectif:

  1. Retourner 10 personnes
  2. Salaire entre 1000000 et 6000000
  3. Min 2 chaque doc, avocat, comptable

Exécutez cette macro:

Sub macro() Dim rCell As Range Dim rRng As Range Dim rangelist As Ssortingng Dim entryCount As Long Dim totalnum As Long Set rRng = Sheet1.Range("A1:A12") Dim OccA As Ssortingng Dim OccCntA As Long Dim OccASalmin As Long Dim OccASalmax As Long Dim OccB As Ssortingng Dim OccCntB As Long Dim OccBSalmin As Long Dim OccBSalmax As Long Dim OccC As Ssortingng Dim OccCntC As Long Dim OccCSalmin As Long Dim OccCSalmax As Long 'Set total number of results to return totalnum = 10 'Set which occupations that must be included in results OccA = "Accountant" OccB = "Doctor" OccC = "Lawyer" 'Set minimum quantity of each occupation to me returned in results OccCntA = 2 OccCntB = 2 OccCntC = 2 'Set min and max salary ranges to return for each occupation OccASalmin = 1000000 OccASalmax = 6000000 OccBSalmin = 1000000 OccBSalmax = 6000000 OccCSalmin = 1000000 OccCSalmax = 6000000 'Get total number of ensortinges entryCount = rRng.Count 'Randomly get first required occupation ensortinges 'Return list of rows for each Occupation OccAList = PickRandomItemsFromList(OccCntA, entryCount, OccA, OccASalmin, OccASalmax) OccBList = PickRandomItemsFromList(OccCntB, entryCount, OccB, OccBSalmin, OccBSalmax) OccCList = PickRandomItemsFromList(OccCntC, entryCount, OccC, OccCSalmin, OccCSalmax) For Each i In OccAList If rangelist = "" Then rangelist = "A" & i Else rangelist = rangelist & "," & "A" & i End If Next i For Each i In OccBList If rangelist = "" Then rangelist = "A" & i Else rangelist = rangelist & "," & "A" & i End If Next i For Each i In OccCList If rangelist = "" Then rangelist = "A" & i Else rangelist = rangelist & "," & "A" & i End If Next i 'Print the rows that match criteria Dim rCntr As Long rCntr = 1 Dim nRng As Range Set nRng = Range(rangelist) For Each j In nRng Range(j, j.Offset(0, 2)).Select Selection.Copy Range("E" & rCntr).Select ActiveSheet.Paste rCntr = rCntr + 1 Next j 'Get rest of rows randomly and print OccList = PickRandomItemsFromListB(totalnum - rCntr + 1, entryCount, rangelist) For Each k In OccList Set Rng = Range("A" & k) Range(Rng, Rng.Offset(0, 2)).Select Selection.Copy Range("E" & rCntr).Select ActiveSheet.Paste rCntr = rCntr + 1 Next k End Sub Function PickRandomItemsFromListB(nItemsToPick As Long, nItemsTotal As Long, avoidRng As Ssortingng) Dim rngList As Range Dim idx() As Long Dim varRandomItems() As Variant Dim i As Long Dim j As Long Dim booIndexIsUnique As Boolean Set rngList = Range("B1").Resize(nItemsTotal, 1) ReDim idx(1 To nItemsToPick) ReDim varRandomItems(1 To nItemsToPick) For i = 1 To nItemsToPick Do booIndexIsUnique = True ' Innoncent until proven guilty idx(i) = Int(nItemsTotal * Rnd + 1) For j = 1 To i - 1 If idx(i) = idx(j) Then ' It's already there. booIndexIsUnique = False Exit For End If Next j Set isect = Application.Intersect(Range("A" & idx(i)), Range(avoidRng)) If booIndexIsUnique = True And isect Is Nothing Then Exit Do End If Loop varRandomItems(i) = idx(i) Next i PickRandomItemsFromListB = varRandomItems ' varRandomItems now contains nItemsToPick unique random ' items from range rngList. End Function Function PickRandomItemsFromList(nItemsToPick As Long, nItemsTotal As Long, Occ As Ssortingng, Salmin As Long, Salmax As Long) Dim rngList As Range Dim idx() As Long Dim varRandomItems() As Variant Dim i As Long Dim j As Long Dim booIndexIsUnique As Boolean Set rngList = Range("B1").Resize(nItemsTotal, 1) ReDim idx(1 To nItemsToPick) ReDim varRandomItems(1 To nItemsToPick) For i = 1 To nItemsToPick Do booIndexIsUnique = True ' Innoncent until proven guilty idx(i) = Int(nItemsTotal * Rnd + 1) For j = 1 To i - 1 If idx(i) = idx(j) Then ' It's already there. booIndexIsUnique = False Exit For End If Next j If booIndexIsUnique = True And Range("B" & idx(i)).Value = Occ And Range("B" & idx(i)).Offset(0, 1).Value >= Salmin And Range("B" & idx(i)).Offset(0, 1).Value <= Salmax Then Exit Do End If Loop varRandomItems(i) = idx(i) Next i PickRandomItemsFromList = varRandomItems End Function 

Les résultats sont imprimés dans la colonne E avec les premiers résultats répondant aux critères. Après ceux-ci, le rest est random mais ne répète pas les précédents:

entrez la description de l'image ici

Je ne fais pas beaucoup de vérification des erreurs, comme ce qui se passe si il n'y a pas deux médecins ou pas assez d'inputs pour satisfaire le nombre de résultats requirejs. Vous devrez l'affiner pour vos besoins. Vous voudrez probablement configurer les inputs en tant que formulaire, de sorte que vous ne devez pas faire appel au code chaque fois que vous modifiez vos critères.