Bonjour Petiloup et bienvenu, bonjour le forum,
Peut-être comme ça :
Sub exemple()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim TA() As Variant 'déclare la variable TA (Tableau des Aléatoires)
Dim NA As Integer 'déclare la variable NA (Nombre Aléatoire)
Dim TF() As Variant 'déclare la variable TF (Tableau Final)
Set O = Worksheets("Feuil1") 'définit l'onglet O
TV = Range("liste") 'définit le tableau des valeurs TV
ReDim TA(1 To UBound(TV, 1)) 'redimensionne le tableau des aléatoires TA
ReDim TF(1 To UBound(TV, 1)) 'redimensionne le tableau Final TF
For I = 1 To UBound(TV, 1) 'boucle 1 : sur toutes les lignes I du tableau des valeurs TV
ici: 'étiquette
Randomize 'lance le générateur de nombres aléatoires
NA = Int((UBound(TV, 1) * Rnd) + 1) 'définit le nombre aléatoire NA
TA(I) = NA 'définit le nombre aléatoire I du tableau TA
For J = 1 To UBound(TA) 'boucle 2 sur tous les nombre aléatoires J du tableau TA
If I <> J And TA(J) = NA Then GoTo ici 'si I est différent de J et si le nombre aléatoire J du tableau TA est égal à NA, va à l'étiquette "ici" (génère un nouveau nombre aléatoire)
Next J 'prochain nombre aléatoire de la boucle 2
TF(NA) = TV(I, 1) 'renvoie dans la tableau final en position NA, la donnée ligne I colonne 1 de TV
Next I 'prochaine ligne de la boucle 1
O.Range("A1").Resize(UBound(TV, 1)).Value = Application.Transpose(TF) 'substitue les données de la plage nommée "Listes" par le tableau final
End Sub