Function SommeAlea5(v&)
'La bibliothèque Microsoft Scripting Runtime doit être active.
Dim i&, j&, lMax&, cMax&, nDat&, vTmp&, Tmp&, InfTmp&, SupTmp&, a&(), s1%, s2%, Memo As New Scripting.Dictionary
Application.Volatile 'Si besoin est.
cMax = Application.Caller.Columns.Count
lMax = Application.Caller.Rows.Count
nDat = lMax * cMax
If (nDat - 1) * nDat > 2 * v Then SommeAlea5 = "" * 1: Exit Function
ReDim a(1 To lMax, 1 To cMax)
Randomize
s1 = 10
Do
s1 = s1 - 1
Set Memo = Nothing
vTmp = v
For i = 1 To lMax
For j = 1 To cMax
If i * j < nDat Then
SupTmp = vTmp - (nDat - (i - 1) * cMax - j - 1) * (nDat - (i - 1) * cMax - j) / 2
InfTmp = Int((Sqr(1 + 8 * vTmp) - 3)) / 2
s2 = 10
Do
s2 = s2 - 1
Tmp = InfTmp + Int((1 + SupTmp - InfTmp) * Rnd)
Loop While Memo.Exists(Tmp) And s2 > 0
If s2 Then s1 = 10: Memo.Add Tmp, Tmp Else Exit For
a(i, j) = Tmp
vTmp = vTmp - a(i, j)
End If
Next
If s2 = 0 Then Exit For
Next
Loop While Memo.Exists(vTmp) And s1 > 0 Or s2 = 0
a(lMax, cMax) = vTmp
SommeAlea5 = a
End Function