Bonjour le forum,
je bute pour trouver le code me permettant d'effectuer une répartition en groupes d'effectifs plus ou moins proches.
Dans le fichier joint, il s'agit de répartir les lignes du tableau (feuille Données) en n groupes (n donné en paramètre) de plus ou moins le même effectif,
en fonction d'un paramètre d'hétérogénéité situé dans un intervalle de 1 (effectif souhaité identique pour tous les groupes) à 10 (maximum d'hétérogénéité dans les effectifs)
Par exemple avec un tableau de 100 lignes (c'est le cas du fichier en pj), à répartir en 4 groupes :
Paramètre d 'hétérogénéité = 1 : 25 - 25 - 25 - 25,
Paramètre d 'hétérogénéité = 2 : 26 - 26 - 24 - 24,
Paramètre d 'hétérogénéité = 10 : 29 - 27 - 22 - 22.
Les contraintes :
- Il ne faut pas toucher au Tableau (Tri, Filtre ...), seulement affecter les n° de groupes.
- Utiliser les paramètres du fichier et le faire uniquement par code VBA (en adaptant la macro ci-dessous)
- Les n° de Groupes doivent être attribués aléatoirement aux lignes du tableau de la feuille Données. Il ne faut pas (pour reprendre l'exemple ci-dessus), attribuer 1 aux 29 premières lignes, 2 aux 27 suivantes, 3 aux 22 suivantes et 22 aux 22 dernières.
Le code de la macro lancée par le bouton N° de Groupe Aléatoire
Merci d'avance
je bute pour trouver le code me permettant d'effectuer une répartition en groupes d'effectifs plus ou moins proches.
Dans le fichier joint, il s'agit de répartir les lignes du tableau (feuille Données) en n groupes (n donné en paramètre) de plus ou moins le même effectif,
en fonction d'un paramètre d'hétérogénéité situé dans un intervalle de 1 (effectif souhaité identique pour tous les groupes) à 10 (maximum d'hétérogénéité dans les effectifs)
Par exemple avec un tableau de 100 lignes (c'est le cas du fichier en pj), à répartir en 4 groupes :
Paramètre d 'hétérogénéité = 1 : 25 - 25 - 25 - 25,
Paramètre d 'hétérogénéité = 2 : 26 - 26 - 24 - 24,
Paramètre d 'hétérogénéité = 10 : 29 - 27 - 22 - 22.
Les contraintes :
- Il ne faut pas toucher au Tableau (Tri, Filtre ...), seulement affecter les n° de groupes.
- Utiliser les paramètres du fichier et le faire uniquement par code VBA (en adaptant la macro ci-dessous)
- Les n° de Groupes doivent être attribués aléatoirement aux lignes du tableau de la feuille Données. Il ne faut pas (pour reprendre l'exemple ci-dessus), attribuer 1 aux 29 premières lignes, 2 aux 27 suivantes, 3 aux 22 suivantes et 22 aux 22 dernières.
Le code de la macro lancée par le bouton N° de Groupe Aléatoire
VB:
Option Explicit
Const F_DONNEES = "Données"
Sub GroupesAleatoires()
Dim CellGroupe As Range
Dim NbAleatoire
Dim Coeff
Dim i As Integer, j As Integer
For i = 1 To 2
If i = 1 Then
' groupes souhaités d'effectif identique
ActiveSheet.Range("NIV_HETERO") = 1
Else
' groupes souhaités avec un maximum d'hétérogénéité dans les effectifs
ActiveSheet.Range("NIV_HETERO") = 10
End If
ActiveSheet.Range("NO_TEST").Offset(0, i) = ActiveSheet.Range("NIV_HETERO").Value
'10 lignes de test de 1 à 10
For j = 1 To 10 '10
' niveau d'hétérogénéité vaut de 1 à 10 -> Coeff = 1, 10, 100 ...
Coeff = Application.Power(10, ActiveSheet.Range("NIV_HETERO") - 1)
For Each CellGroupe In Sheets(F_DONNEES).Range("TabDonnées[Groupe]")
Randomize
' Quand le Coeff vaut 1 (groupes souhaités d'effectif identique),
' on retrouve la formule classique pour générer un nombre aléatoire de 1 à n : "Int(n * Rnd) + 1"
' Quand le Coeff vaut 10 (groupes groupes souhaités avec un maximum d'hétérogénéité dans les effectifs),
' pas de différence avec la formule standard !!!
NbAleatoire = Int(ActiveSheet.Range("NB_MAX") * Coeff * Rnd) + Coeff
NbAleatoire = Int(NbAleatoire / Coeff)
CellGroupe.Value = NbAleatoire
Next CellGroupe
' L'écart (cellule MOYENNE_ECARTS en O16) est une bonne estimation de l'hétérogénéité des Groupes
' on affecte l'écart sur la ligne du n° de test en cours
' - en colonne H pour le Niveau d'hétérogénéité 1 (groupes souhaités d'effectif identique)
' - en colonne I pour le Niveau d'hétérogénéité 10 (groupes souhaités avec un maximum d'hétérogénéité dans les effectifs)
ActiveSheet.Range("NO_TEST").Offset(j, i) = ActiveSheet.Range("MOYENNE_ECARTS").Value
Next j
Next i
End Sub
Merci d'avance
Pièces jointes
Dernière édition: