Bonjour,
Proposition de fonction personnalisée :
Function TIRAGESELEC(n As Integer)
Dim tabt(), tablo() As Integer, i%, m%, x%
Application.Volatile False
If n < 1 Then
TIRAGESELEC = CVErr(xlErrNum)
Exit Function
End If
m = Selection.Cells.Count
ReDim tabt(1 To m)
If m > n Then
For i = n + 1 To m
tabt(i) = CVErr(xlErrNA)
Next i
m = n
End If
ReDim tablo(n)
For i = 1 To n
tablo(i) = i
Next i
Randomize
For i = 1 To n
x = Int(n * Rnd + 1)
tablo(0) = tablo(x)
tablo(x) = tablo(i)
tablo(i) = tablo(0)
Next i
tablo(0) = tablo(n)
x = Int(n * Rnd + 1)
For i = 1 To m
tabt(i) = tablo((x - 1 + i) Mod n)
Next i
If Application.Caller.Rows.Count > 1 Then
TIRAGESELEC = Application.Transpose(tabt)
Else
TIRAGESELEC = tabt
End If
End Function
La fonction est à placer dans un module Standard. (Faire Alt+F11 pour ouvrir l'Editeur VBA, clic droit dans le volet Explorateur de Projets à gauche, Insertion > Module, et dans le module coller le code.
Utilisation, comme toute fonction Excel, celle-ci étant matricielle :
Sélectionner une plage de cellules sur une ligne ou sur une colonne, nombre de cellules correspondant au nombre de tirages que l'on veut faire, indiquer en argument le nombre d'éléments sur lesquels on tire (il doit logiquement être supérieur ou égal au nombre de cellules sélectionné), exemple :
=TIRAGESELEC(12)
une plage de 12 cellules ayant été sélectionnée.
On valide par Ctrl+Maj+Entrée et les nombres 1 à 12 apparaissent aléatoirement dans les 12 cellules, sans doublon.
(Ne se recalcule pas lors des recalculs automatiques...)
Cordialement.