Fonction Alea()
danielc0 Messages postés 1672 Date d'inscription mardi 5 juin 2018 Statut Membre Dernière intervention 21 mars 2025 - 19 févr. 2025 à 14:03
- Fonction Alea()
- Fonction si et - Guide
- Fonction moyenne excel - Guide
- Fonction somme excel - Guide
- Fonction miroir - Guide
- Fonction remplacer word - Guide
21 réponses
16 févr. 2025 à 11:23
Bonjour,
voir fichier joint
Slts
Bonjour
Ca ne va pas , parce que le renvoi de la formule doit se faire sur plusieurs cellules et
sans doublons
Merci
16 févr. 2025 à 11:38
Re,
Ca ne va pas , parce que le renvoi de la formule doit se faire sur plusieurs cellules
merci de joindre un fichier
Slts
Modifié le 16 févr. 2025 à 11:47
Bonjour,
Une fonction ne peut pas remplir une plage de cellules, mais seulement la cellule dans laquelle elle se trouve, (à l'exception des fonctions à propagation). Donne un exemple d'utilisation de cette fonction.
Daniel
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question16 févr. 2025 à 12:43
Essaie :
Function Alea_SR(l As Long, c As Long) Dim Tabl(), I As Long, J As Long, Var As Double Set dico = CreateObject("scripting.dictionary") Randomize ReDim Tabl(1 To l, 1 To c) For I = 1 To UBound(Tabl, 1) For J = 1 To UBound(Tabl, 2) Var = Rnd Do While dico.exists(Var) Var = Rnd dico.Add Var, Var Loop Tabl(I, J) = Rnd Next J Next I Alea_SR1 = Tabl End Function
Les paramètres à passer sont le nombre de lignes et de colonnes :
Daniel
Modifié le 16 févr. 2025 à 14:38
Oups, erreur. Voici le code corrigé :
Function Alea_SR(l As Long, c As Long) Dim Tabl(), I As Long, J As Long, Var As Double, Dico As Object Set Dico = CreateObject("scripting.dictionary") Application.Volatile Randomize ReDim Tabl(1 To l, 1 To c) For I = 1 To UBound(Tabl, 1) For J = 1 To UBound(Tabl, 2) Var = Rnd Do While Dico.exists(Var) Var = Rnd Dico.Add Var, Var Loop Tabl(I, J) = Var Next J Next I Alea_SR = Tabl End Function
Daniel
Bonjour
Je te remercie pour ce travail,mais ce n'est pas exactement ce que j'attend.
Exemple ,j'ai une plage A1:A7 avec des chiffres différents (1,3,5,6,7,9,4)
et en C1:C5, je sélectionne la plage,et je valide la formule en faisant Ctrl/Maj/Entrée.
et la formule me renvoie 5 chiffres pris dans la 1ère plage , et me renvoie 5 chiffres différents pris dans la 2 ème plage.
Svp. comment faire pour envoyer 1 classeur d'exemple.
18 févr. 2025 à 09:54
Bonjour,
La macro que je t'ai fournie répond exactement à ce que tu as demandé. Essaie d'être précis quand tu formules tes questions.
"et me renvoie 5 chiffres différents pris dans la 2 ème plage."
Quelle deuxième plage ? C1:C5 ? Il y a des nombres en C1:C5 ? Je n'y comprends rien !
Daniel
18 févr. 2025 à 09:56
"Svp. comment faire pour envoyer 1 classeur d'exemple."
Pour le partager, clique sur :
https://www.cjoint.com/
Clique sur le bouton "parcourir". Choisis le fichier à partager. Dans le bas de la page, clique sur le bouton "Créer le lien cjoint". Copie le lien affiché et colle-le dans ta réponse.
18 févr. 2025 à 10:32
Je ne sais pas le faire. Pour reprendre ton exemple, j'ai besoin d'indiquer la plage source et la plage cible. eg.
Alea_SR(A1:A7;C1:C5)
Dis-moi si tu es d 'accord.
Daniel
Bonjour
Non pas la plage cible ! ni la plage source ,la plage source je la sélectionne dans la fonction et la plage cible je la sélectionne quand j'utilise la fonction en validant avec Ctrl/maj/entrée
Merci
18 févr. 2025 à 12:04
Alors, je ne sais pas faire.
Daniel
18 févr. 2025 à 11:53
18 févr. 2025 à 12:53
Bonjour,
Un essai utilisant Power Query, nativement installé dans ta version 2021.
Tu peux mettre ce que tu veux dans la colonne A (autant de lignes que tu veux, et les valeurs que tu veux - chiffres, questions, noms...)
Dans la cellule C2, tu indiques le nombre de retours que tu veux (évite juste de mettre plus de tirages que de lignes de la colonne A)
Et en colonne E, le résultat
Pour effectuer un tirage, ruban "Données", "Actualiser tout"
Bonne apm
https://www.cjoint.com/c/OBsl1LG8pTF
Bonjour
Le classeur que vous m'avez fait reste figé ,quand je veux faire "Actualiser tout" ,je ne peux pas car c'est grisé.
et en + j'avais besoin de pouvoir faire des recalcul en série .
Merci quand même
18 févr. 2025 à 15:05
18 févr. 2025 à 17:28
On pourrait mettre simplement un bouton sui appellerait une macro si la plage de résultats a toujours la même cellule de départ.
Sub test() Dim C As Range, Var As Integer, Dico As Object Set Dico = CreateObject("Scripting.Dictionary") Randomize With Application .Volatile For Each C In Selection Var = .RandBetween([A1].Row, Cells(Rows.Count, 1).End(xlUp).Row) Var = .Index([A:A], Var) Do While Dico.exists(Var) Var = .RandBetween([A1].Value, [A9].Value) Loop Dico.Add Var, Var C = Var Next C End With End Sub
https://www.cjoint.com/c/OBsqBsTqCs4
Daniel
Bonsoir
la macro fonctionne ,ce qui est très bien ,mais ne serait il pas possible de faire la même chose sous forme de fonction.
Merci
18 févr. 2025 à 19:40
Perso, je ne sais pas faire.
Daniel
19 févr. 2025 à 08:51
Bonjour à tous,
La nuit porte conseil... Il y a peut-être une possibilité.
@ nihcoc :
1. Quelle est ta version d'Excel ?
2. Essaie la fonction suivante. Ce n'est pas ce que tu attends mais c'est pour voir si je peux faire ce à quoi je pense.
Function Alea_SR(l As Long, c As Long) Dim Tabl(), I As Long, J As Long, Var As Double, Dico As Object Set Dico = CreateObject("scripting.dictionary") Application.Volatile Randomize ReDim Tabl(1 To l, 1 To c) For I = 1 To UBound(Tabl, 1) For J = 1 To UBound(Tabl, 2) Var = Rnd Do While Dico.exists(Var) Var = Rnd Dico.Add Var, Var Loop Tabl(I, J) = Var Next J Next I Alea_SR = Tabl End Function
Teste en entrant :
=Alea_SR(4;5)
(sans validation matricielle)
Le résultat doit être une plage de cellules de 4 lignes sur 5 colonnes.
Daniel
bonjour
j'ai essayé ta fonction,elle marche ,mais ce n'est pas ce que je cherche exactement.
Par contre de mon coté, j'ai réussi a trouvé une fonction qui marche.
Merci
19 févr. 2025 à 09:35
"mais ce n'est pas ce que je cherche exactement"
Ce n'était pas le but. Comme je te l'ai indiqué, il fallait savoir si ta version d'Excel supportait les fonctions à propagation.
Dans ce cas, merci de partager ta solution, ça peut servir à tous.
Daniel
19 févr. 2025 à 10:03
Une solution :
Function Alea_SR() Dim Tabl(), Dico As Object, Source As Range, l As Integer, c As Integer Set Dico = CreateObject("scripting.dictionary") Application.Volatile Randomize Set Source = [A1:A9] l = Selection.Rows.Count c = Selection.Columns.Count ReDim Tabl(1 To l, 1 To c) For I = 1 To UBound(Tabl, 1) For J = 1 To UBound(Tabl, 2) Var = Application.RandBetween(Source.Row, Source.Row + Source.Rows.Count - 1) Var = Application.Index(Source, Var) Do While Dico.exists(Var) Var = Application.RandBetween(Source.Row, Source.Row + Source.Rows.Count - 1) Var = Application.Index(Source, Var) Loop Tabl(I, J) = Var Dico.Add Var, Var Next J Next I Alea_SR = Tabl End Function
La fonction utilise la plage A1:A9 comme source de nombres. Au besoin, je peux modifier pour accepter une plage variable.
Daniel
Bonjour
tout d'abord j'utilise excel 2021.
j'ai essayé la macro en plage, la macro marche mais dès que je fais un recalcul les chiffres sont identiques.
merci
voila la macro que j'ai récupéré :
Public Function Alea_SR(oussa As Variant) As Variant
Application.Volatile
Dim Rep, Koi, Tmp, FL, Liste As Variant
Dim Large, Haut, Tout, TT, I, J, X, K, Lar, Hau, vol, ligne As Long
Dim Tablo As Boolean
ki = Application.Caller.Address
Haut = Range(ki).Rows.Count
Large = Range(ki).Columns.Count
Tout = Haut * Large
Select Case VarType(oussa)
Case 8204
Koi = oussa
Hau = UBound(Koi, 1): Lar = UBound(Koi, 2)
N = Hau * Lar
Tablo = True
ReDim Liste(1 To N)
For I = 1 To Lar
For J = 1 To Hau
Liste((I - 1) * Hau + J) = Koi(J, I)
Next J
Next I
Case 2 To 6, 14, 17
N = oussa
If Int(N) <> N Or N < 2 Then
Rep = CVErr(xlErrValue): GoTo FIN
End If
Tablo = False
Case Else
Rep = CVErr(xlErrValue): GoTo FIN
End Select
If Tout > N Then
TT = N
Else
TT = Tout
End If
ReDim Rep(0 To Haut - 1, 0 To Large - 1)
ReDim FL(0 To N - 1) As Boolean
For I = 0 To N - 1
FL(I) = True
Next I
For I = 0 To Tout - 1
col = Int(I / Haut)
ligne = I - col * Haut
If I < TT Then
ReDim Tmp(0 To N - I)
K = 0
For J = 0 To N - 1
If FL(J) Then
K = K + 1
Tmp(K) = J + 1
End If
Next J
X = Int(1 + (N - I) * Rnd())
FL(Tmp(X) - 1) = False
If Tablo Then
Rep(ligne, col) = Liste(Tmp(X))
Else
Rep(ligne, col) = Tmp(X)
End If
Else
Rep(ligne, col) = Chr(164)
End If
Next I
FIN:
Alea_SR = Rep
End Function