XL 2013 créer une serie aleatoire sans doublons sans matrice(plage de cellule)par formule

patricktoulon

XLDnaute Barbatruc
bonsoir à tous
punaise je me bat avec chatGPT pour trouver comment se servir de alea.entre.bornes ou autre pour créer une serie aleatoire sans doublons


si vous avez des idées allez y bombardez
;)
 

Dranreb

XLDnaute Barbatruc
Bonsoir.
J'ai ça :
VB:
Option Explicit
Private HDernUti As Date, TN°() As Long, GrnPréc As Double
Public Function Hasard(ByVal Rang As Long, ByVal Donné, Optional ByVal Graine As Double) As Variant
Rem. ——— Renvoie dans une cellule une information choisie aléatoirement d'une plage.
'  Arguments :
'     Rang:   Rang dans la permutation du numéro souhaité.
'     Donné:  Deux possibilités :
'        1) — Une expression du numéro le plus élevé, la fonction en renvoyant un de 1 à Donné.
'        2) — Une plage d'une colonne contenant les valeurs possibles, la fonction renvoyant l'une d'elles.
'     Graine: Base de départ de la série. Si omis l'ordre des numéros sera différent à chaque évaluation.
'  Principe important: Cette fonction étant conçue pour une validation normale, non matricielle,
'     elle construit un tableau sur lequel elle se base, ensuite, à chaque invocation,
'     tant qu'il est récent de moins d'une seconde depuis sa dernière utilisation.
   Dim RngDon As Range, LMax As Long, L As Long, P As Long
   If TypeOf Donné Is Range Then
      Set RngDon = Donné: LMax = RngDon.Rows.Count
   ElseIf IsNumeric(Donné) Then
      LMax = Donné
   Else: Hasard = CVErr(xlErrValue): Exit Function: End If
   On Error Resume Next: L = UBound(TN°): On Error GoTo 0
   If Now - HDernUti > 1 / 86400 Or LMax <> L Or Graine <> GrnPréc Then
      ReDim TN°(1 To LMax): TN°(1) = 1
      If Graine <= 0 Then Randomize Else Rnd -1: Randomize Graine
      For L = 2 To LMax: P = Int(Rnd * L) + 1: If P < L Then TN°(L) = TN°(P)
         TN°(P) = L: Next L
      GrnPréc = Graine: End If
   On Error Resume Next: L = TN°(Rang): On Error GoTo 0
   If Err Then
      Hasard = IIf(RngDon Is Nothing, 0, "")
   ElseIf RngDon Is Nothing Then: Hasard = L
   Else: Hasard = RngDon(L, 1).Value: End If
   HDernUti = Now
   End Function
 

patricktoulon

XLDnaute Barbatruc
bonsoir @Dranreb
bien que j’apprécie me régaler de tes codes parfois abscons mais toujours intéressants
ici pour le faire en vba j'ai beaucoup plus simple
mais le titre de ma question est bien par formule
c'est un challenge en fait
trouver une formule qui me permettrais de créer une série ou une matrice aléatoire sans plage de cellules(avec des nombres) de référence
et si possible compatible 2013
 

Dranreb

XLDnaute Barbatruc
C'est bien par formule utilisant une fonction personnalisée. C'était interdit ? Pas précisé ! Je croyais que le "ou autre" les incluait … Ce qui était bien clair c'est qu'elle devait pouvoir être utilisé dans un tableau Excel, lequel interdit les formules matricielles.
Par fonctions de base je ne sais vraiment pas faire.
 

patricktoulon

XLDnaute Barbatruc
re
t' en fait pas même chatGPT je le rend fou 😂 😂 😂

il fini par me donner des formules moitié en français moitié en anglais 😂😂😂😂

ça vaut le détour voir le lien en post 1

punaise je me marre avec ce truc

il y a bien un moyen de modifier ceci:
formule en b1 etendu a b10
=INDEX(LIGNE(A1:A10);ALEA.ENTRE.BORNES(1;10))
avec un truc du genre nb.si ou nbval ou equiv dans la colonne "$b$1:b1"
 

job75

XLDnaute Barbatruc
Bonsoir Patrick, Bernard,

Formule en A1 =ALEA.ENTRE.BORNES(1;10)

Formule en A2 à copier sur A2:A10 :
Code:
=SI(OU(A2=0;NB.SI(A$1:A$10;A2)>1);ALEA.ENTRE.BORNES(1;10);A2)
Le calcul itératif est activé.

A+
 

Pièces jointes

  • ALEA sans doublon.xlsx
    10.6 KB · Affichages: 5

ALS35

XLDnaute Impliqué
Bonjour à tous,
En fouinant, j'ai pu trouver ça, en A2 et à recopier jusqu'à A11 :
VB:
=AGREGAT(14;4;LIGNE($1:$10)*NON(NB.SI($A$1:A1; LIGNE($1:$10))); ALEA.ENTRE.BORNES(1;LIGNES($1:$10)+1-LIGNE(A1)))
Pas facile à modifier mais ça semble fonctionner sans doublon, c'est le LIGNE($1:$10) qui donne les bornes
Si ça peut aider
Cordialement
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
315 080
Messages
2 116 020
Membres
112 637
dernier inscrit
pseudoinconnu