Microsoft 365 Nombre aléatoire ordre croissant dans une zone sélectionnée

wiwi520

XLDnaute Nouveau
Bonjour,

Je cherche un code en VBA pour générer des nombres dans un ordre croissant sur une colonne (A par exemple) de manière aléatoire et que cette macro s'applique sur une sélection que je ferais manuellement. En d'autres mots je veux que cette macro ne s'applique que sur les cellules que je sélectionne.
Par exemple:
Si je sélectionne les cellules (A1:A10) et j'active la commande macro, seules ces cellules afficheront des nombres croissants de manière aléatoire. Je pourrais aussi sélectionner les cellules (A3:A7), ou (A8 : A25) pour avoir le même résultat.

Alors j'ai jamais fait des macros.

Merci pour votre aide précieuse.
 

Staple1600

XLDnaute Barbatruc
Bonjour

Un petit exemple tout simple
(Voir si cela t'inspire)
VB:
Sub Nombres()
Dim NBL&
Randomize 1600
NBL = Selection.Rows.Count
For i = 1 To NBL
Selection.Item(i) = Application.RandBetween(123, NBL + 1600)
Next
Selection.Sort Key1:=Selection.Item(1), Order1:=xlAscending
End Sub
Pour copier le code VBA
1) Dans Excel: ALT+F11 puis Insertion/Module
Et pour la suite voir les nombreux tutoriels sur le net.
 

wiwi520

XLDnaute Nouveau
Bonjour

Un petit exemple tout simple
(Voir si cela t'inspire)
VB:
Sub Nombres()
Dim NBL&
Randomize 1600
NBL = Selection.Rows.Count
For i = 1 To NBL
Selection.Item(i) = Application.RandBetween(123, NBL + 1600)
Next
Selection.Sort Key1:=Selection.Item(1), Order1:=xlAscending
End Sub
Pour copier le code VBA
1) Dans Excel: ALT+F11 puis Insertion/Module
Et pour la suite voir les nombreux tutoriels sur le net.

Merci de votre réponse.

Par contre j'ai oublié de préciser les nombres aléatoire doivent être compris entre 1 et 35.

Merci de votre retour
 

jmfmarques

XLDnaute Accro
Bonjour
Je lis :
1)
Par contre j'ai oublié de préciser les nombres aléatoire doivent être compris entre 1 et 35.
2)
pour générer des nombres dans un ordre croissant
et
3)
Si je sélectionne les cellules (A1:A10) et j'active la commande macro, seules ces cellules afficheront des nombres croissants de manière aléatoire.
Ce qui a pour moi la conséquence suivante: si (par exemple et entre autres) 35 est le premier nombre tiré aléatoirement entre 1 et 35, seule sera remplie la celle A1
Aurais-je mal lu ? Te serais-tu mal ou incomplètement exprimé ?
 

wiwi520

XLDnaute Nouveau
Bonjour
Je lis :
1)

2)pour générer des nombres dans un ordre croissant
et
3)
Ce qui a pour moi la conséquence suivante: si (par exemple et entre autres) le premier nombre tiré aléatoirement entre 1 et 35, seule sera remplie la celle A1
Aurais-je mal lu ? Te serais-tu mal ou incomplètement exprimé ?

Bonjour,

En effet mon explication est peut être incomplète:( Je vais essayer de reformuler:

Mon objectif est d'afficher de manière aléatoire et dans un ordre croissant des nombres compris en 1 et 35 sur les cellules que je sélectionne manuellement.

Merci d'avance
 

Staple1600

XLDnaute Barbatruc
Re

Oui, mais cela marche avec des doublons
Avec ce code ci-dessous remanié pour ta question (et issu des archives du forum), plus de doublons
Enrichi (BBcode):
Sub Nombre_Alea()
'source:Sub aleatoire [08/2015] - ROGER2327 / Magic_Doctor / job75

Dim dico As Object, i As Integer, NbLgn As Integer
Set dico = CreateObject("Scripting.Dictionary")
NbLgn = Selection.Rows.Count
Randomize
While dico.Count < NbLgn
dico(Round((35 - 1) * Rnd() + 1, 0)) = ""
Wend
Selection.Item(1).Resize(dico.Count) = Application.Transpose(dico.keys)
Selection.Item(1).Sort Key1:=Selection.Item(1), Order1:=xlAscending

End Sub
 

Staple1600

XLDnaute Barbatruc
Re

Un légère adaptation de mon adaptation précédente ;)
(juste un peu d'élagage ;))
VB:
Sub Nombre_Alea_II()
'souce:Sub aleatoire [08/2015] - ROGER2327 / Magic_Doctor / job75
Dim dk As Object, NbLgn&: Set dk = CreateObject("Scripting.Dictionary")
Randomize
With Selection
    NbLgn = .Rows.Count
    While dk.Count < NbLgn
        dk(Round((35 - 1) * Rnd() + 1, 0)) = ""
    Wend
    .Value = Application.Transpose(dk.keys): .Sort .Item(1), 1
End With
End Sub
Le code tel que présenté présuppose que l'utilisateur sélectionne une seule et unique colonne* avant de lancer la macro.
*: et ne contenant pas de cellules fusionnées sinon...
 

wiwi520

XLDnaute Nouveau
Re

Un légère adaptation de mon adaptation précédente ;)
(juste un peu d'élagage ;))
VB:
Sub Nombre_Alea_II()
'souce:Sub aleatoire [08/2015] - ROGER2327 / Magic_Doctor / job75
Dim dk As Object, NbLgn&: Set dk = CreateObject("Scripting.Dictionary")
Randomize
With Selection
    NbLgn = .Rows.Count
    While dk.Count < NbLgn
        dk(Round((35 - 1) * Rnd() + 1, 0)) = ""
    Wend
    .Value = Application.Transpose(dk.keys): .Sort .Item(1), 1
End With
End Sub
Le code tel que présenté présuppose que l'utilisateur sélectionne une seule et unique colonne* avant de lancer la macro.
*: et ne contenant pas de cellules fusionnées sinon...

Haha super merci tu gères. ça marche à merveille

Une petite question par curiosité. Si je souhaite mettre un ordre décroissant, qu'est ce que je devrais modifier dans le code?
 

Discussions similaires

Réponses
1
Affichages
604

Statistiques des forums

Discussions
312 210
Messages
2 086 281
Membres
103 170
dernier inscrit
HASSEN@45