Bonjour,
Je ne sais pas comment faire ça avec une fonction Excel classique... Du coup j'ai crée une fonction qui pourra le faire, elle s'appelle AleaSansDoublons, prend deux paramètres : la liste source, la liste des valeurs déjà sorties (optionnelle).
Le fichier est le suivant:
Et la macro qui la fait fonctionner:
Function AleaSansDoublons(Liste As Range, Optional ValeurSorties As Range)
Application.Volatile
'Enregistrement de la liste dans un objet dictionnary
Dim Valeurs As New Dictionary
For Each valeur In Liste.Cells
Valeurs.Add CStr(valeur), valeur
Next valeur
'Supprime les valeurs déjà sorties de dictionnary, si ValeurSorties est précisé
If Not ValeurSorties Is Nothing Then
For Each valeur In ValeurSorties
If Valeurs.Exists(CStr(valeur)) Then
Valeurs.Remove (CStr(valeur))
End If
Next valeur
End If
'Sort une valeur aléatoire sur ce qu'il reste dans le dictionnaire
If Valeurs.Count > 0 Then
Index = Int(((Valeurs.Count - 1) * Rnd) + 1)
AleaSansDoublons = Valeurs(Valeurs.Keys(Index))
End If
End Function
L'idée du code est la suivante:
J'enregistre dans un objet les différentes valeurs que tu peux sortir aléatoirement, j'enlève celles déjà sorties, et je choisis aléatoirement une valeur parmis celles qui restent dans mon objet. L'avantage d'un dictionnaire par rapport à un tableau, c'est que tu peux supprimer des éléments sans avoir à savoir où ils se trouvent, tu lui donnes juste une "clé" et ça te supprimera l'élément lié à cette clé.