Option Explicit
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim Rng As Range, LMax As Long, TAl() As Long, L As Long, NbLig As Long
Set Rng = Intersect(Me.[A1:C1000000], Me.UsedRange)
LMax = Rng.Rows.Count
Select Case Target.Address
Case "$C$1": If VarType(Me.[C1].Value) = vbDouble Then If MsgBox("Voulez vous refaire la liste de numéros" _
& vbLf & "de lignes en ordre aléatoire ?", vbYesNo, "Sélection C1") = vbNo Then Exit Sub
InitListeAl TAl, LMax
Rng.Columns(3).Value = WorksheetFunction.Transpose(TAl)
Case "$F$9": If VarType(Me.[C1].Value) <> vbDouble Then MsgBox "Veuillez sélectionner la cellule C1 pour" _
& vbLf & "y établir la liste aléatoire des numéros de lignes.", vbCritical, "Tirer les lettres": Exit Sub
L = Me.[C1].Value: Target.Value = Rng(L, 2).Value
With Me.[H9]: .NumberFormat = ";;;": .Value = Rng(L, 1).Value: End With
NbLig = Int(LMax * (2 + Rnd) / 3)
Rng(1, 3).Resize(NbLig).Value = Rng(2, 3).Resize(NbLig).Value
Rng(NbLig + 1, 3).Value = L
Case "$H$9": Target.NumberFormat = "General"
End Select
End Sub
Sub InitListeAl(TAl() As Long, Optional ByVal NMax As Long, Optional ByVal Graine As Double)
Rem. ——— Garnit un tableau à une dimension base 1 de numéros sans doublon ou change aléatoirement l'ordre
' des numéros y étant déjà portés.
' Arguments :
' TAl : Le tableau à traiter.
' NMax: Numéro maxi. Si spécifié, le tableau est redimensionné TAl(1 To NMax), puis garni de numéros de 1 à NMax.
' Graine: Base de départ de la série. Si omis la série sera différente à chaque exécution.
Dim P As Long, R As Long, X As Long
If NMax >= 0 Then
ReDim TAl(1 To NMax): For P = 1 To NMax: TAl(P) = P: Next P
Else: NMax = UBound(TAl): End If
If Graine <= 0 Then Randomize Else Rnd -1: Randomize Graine
For P = NMax To 2 Step -1
R = Int(Rnd * P) + 1: X = TAl(R): TAl(R) = TAl(P): TAl(P) = X
Next P
End Sub