OVH Cloud OVH Cloud

Copie de 6 cellules au hasard (Macro Excel - débutant)

16 réponses
Avatar
nospam
Bonjour à tous,

J'ai une colonne de cellules C1 à C32.

Je souhaite lancer une macro Excel qui recopie 6 cellules
au hasard de cette colonne dans les cellules A1 à A6.

Les cellules copiées devront être différentes.

Une idée ?

Merci pour votre aide,

Bien Cordialement,

Christian

10 réponses

1 2
Avatar
Jacquouille
Bonsoir
Tout plein des idées.
en B1, tu inscris =alea(), puis tu tires la formule jusqu'à B32.
Ensuite, tu trie ( les col A et B) par ordre de grandeur en prenant la col B
comme base de tri, puis tu fais un copié-collé des 6 premières valeurs de la
col A....
Bonne chance

--
Bien amicalmement,
Vivement conseillés:
http://www.excelabo.net
http://jacxl.free.fr/mpfe/trombino.html
http://dj.joss.free.fr/netiquet.htm
http://frederic.sigonneau.free.fr/

Jacquouille.

"nospam" a écrit dans le message de news:

Bonjour à tous,

J'ai une colonne de cellules C1 à C32.

Je souhaite lancer une macro Excel qui recopie 6 cellules
au hasard de cette colonne dans les cellules A1 à A6.

Les cellules copiées devront être différentes.

Une idée ?

Merci pour votre aide,

Bien Cordialement,

Christian



Avatar
nospam
Excellente idée Jacquouille. Le seul problème, c'est que je
ne sais pas écrire cet algorithme en "langage" Macro Excel :-))

Quelqu'un peut m'aider ?

Merci,

Bien Cordialement,

Christian
Avatar
Jacquouille
Bonsoir
Rien de plus facile.
Tu imprimes ma réponse, puis tu ouvres ton fichier et l'enregistreur de
macro.
Ensuite, tu fais tout ce que j'ai écrit, puis tu arrêtes l'enregistreur.
O, Miracle. VBA est là. -)) Et si tu es gentil, on te fera un bouton
pour y coller cette littérature Goncourrienne de VBA. -))
Bonne chance

--
Bien amicalmement,
Vivement conseillés:
http://www.excelabo.net
http://jacxl.free.fr/mpfe/trombino.html
http://dj.joss.free.fr/netiquet.htm
http://frederic.sigonneau.free.fr/

Jacquouille.

"nospam" a écrit dans le message de news:

Excellente idée Jacquouille. Le seul problème, c'est que je
ne sais pas écrire cet algorithme en "langage" Macro Excel :-))

Quelqu'un peut m'aider ?

Merci,

Bien Cordialement,

Christian



Avatar
nospam
Jacquouille, merci mais ta solution nécessite de créer une colonne
supplémentaire dans ma feuille, or cela m'ennuie beaucoup pour
différentes raisons.

Ne serait-il pas possible, plutôt, de mettre ces 32 valeurs aléatoires
dans un tableau en mémoire, de les trier, puis d'effectuer la recopie
de 6 cellules sélectionnées, le tout dans la macro ?

Merci,

B.C.

Christian
Avatar
Jacquouille
Re
Réflexion purement poétique: Si tu mets un truc en mémoire dans un tableau,
il n'y aura plus rien d'aléatoire.
Ceci dit et écrit, rien ne t'empêche de créer cette colonne hors de ton
tableau d'activité, par ex en col AZ ....puisque tu y crées une valeur
aléatoire qui changera.....IV peut aussi convenir.
Tout ceci pour masquer mon ignorance quant au fait de savoir si VBA accepte
une fonction alea qui m eparait assez volatile mais non volage.
Si d'autres pouvaient répondre????


--
Bien amicalmement,
Vivement conseillés:
http://www.excelabo.net
http://jacxl.free.fr/mpfe/trombino.html
http://dj.joss.free.fr/netiquet.htm
http://frederic.sigonneau.free.fr/

Jacquouille.

"nospam" a écrit dans le message de news:
uLhkC$
Jacquouille, merci mais ta solution nécessite de créer une colonne
supplémentaire dans ma feuille, or cela m'ennuie beaucoup pour
différentes raisons.

Ne serait-il pas possible, plutôt, de mettre ces 32 valeurs aléatoires
dans un tableau en mémoire, de les trier, puis d'effectuer la recopie
de 6 cellules sélectionnées, le tout dans la macro ?

Merci,

B.C.

Christian



Avatar
Jacquouille
Deuxième RE
Rien ne t'empêche, sinon la vitesse de calcul, de mettre ces col sur une
autre feuille.....

--
Bien amicalmement,
Vivement conseillés:
http://www.excelabo.net
http://jacxl.free.fr/mpfe/trombino.html
http://dj.joss.free.fr/netiquet.htm
http://frederic.sigonneau.free.fr/

Jacquouille.

"nospam" a écrit dans le message de news:
uLhkC$
Jacquouille, merci mais ta solution nécessite de créer une colonne
supplémentaire dans ma feuille, or cela m'ennuie beaucoup pour
différentes raisons.

Ne serait-il pas possible, plutôt, de mettre ces 32 valeurs aléatoires
dans un tableau en mémoire, de les trier, puis d'effectuer la recopie
de 6 cellules sélectionnées, le tout dans la macro ?

Merci,

B.C.

Christian



Avatar
Lionel
Bonsoir,

Nettement moins rapide que la solution de Jacquouille, voici une proposition
en vba :

Option Explicit
Option Base 1

Sub test()
'
Dim Tablo
Dim Result()
Dim Cell As Range
Dim i%, Indice%
'
Application.ScreenUpdating = False
Tablo = Range("C1:C" & Range("C65536").End(xlUp).Row)
ReDim Result(1 To UBound(Tablo))
i = 1
Do While i <= 6
Indice = Int(Rnd * 32 + 1)
If Result(Indice) = 0 Then
Result(Indice) = 1
i = i + 1
End If
Loop
Set Cell = Range("A1")
For i = 1 To UBound(Tablo)
If Result(i) Then
Cell = Tablo(i, 1)
Set Cell = Cell.Offset(1, 0)
End If
Next i
Range("A1").Select
Application.ScreenUpdating = True
End Sub

Amicalement
Lionel

"nospam" a écrit dans le message de
news:uLhkC$
Jacquouille, merci mais ta solution nécessite de créer une colonne
supplémentaire dans ma feuille, or cela m'ennuie beaucoup pour
différentes raisons.

Ne serait-il pas possible, plutôt, de mettre ces 32 valeurs aléatoires
dans un tableau en mémoire, de les trier, puis d'effectuer la recopie
de 6 cellules sélectionnées, le tout dans la macro ?

Merci,

B.C.

Christian




Avatar
michdenis
Bonjour Nospam,

Une variante :

'----------------------
Sub test2()

Dim T(1 To 6)
For a = 1 To 6
T(a) = Range("c" & Int(Rnd * 32 + 1)).Value
Next
Range("A1").Resize(UBound(T)) = WorksheetFunction.Transpose(ListSort(T))

End Sub
'----------------------
Function ListSort(liSte)
Dim First As Integer, Last As Integer
Dim i As Integer, j As Integer
Dim Temp
First = LBound(liSte)
Last = UBound(liSte)
For i = First To Last - 1
For j = i + 1 To Last
If liSte(i) > liSte(j) Then
Temp = liSte(j)
liSte(j) = liSte(i)
liSte(i) = Temp
End If
Next j
Next i
ListSort = liSte
End Function
'----------------------


Salutations!


"nospam" a écrit dans le message de news:
Bonjour à tous,

J'ai une colonne de cellules C1 à C32.

Je souhaite lancer une macro Excel qui recopie 6 cellules
au hasard de cette colonne dans les cellules A1 à A6.

Les cellules copiées devront être différentes.

Une idée ?

Merci pour votre aide,

Bien Cordialement,

Christian
Avatar
michdenis
Oups : J'ai omis de tenir compte de ceci :
Les cellules copiées devront être différentes.


Salutations!




"michdenis" a écrit dans le message de news:
Bonjour Nospam,

Une variante :

'----------------------
Sub test2()

Dim T(1 To 6)
For a = 1 To 6
T(a) = Range("c" & Int(Rnd * 32 + 1)).Value
Next
Range("A1").Resize(UBound(T)) = WorksheetFunction.Transpose(ListSort(T))

End Sub
'----------------------
Function ListSort(liSte)
Dim First As Integer, Last As Integer
Dim i As Integer, j As Integer
Dim Temp
First = LBound(liSte)
Last = UBound(liSte)
For i = First To Last - 1
For j = i + 1 To Last
If liSte(i) > liSte(j) Then
Temp = liSte(j)
liSte(j) = liSte(i)
liSte(i) = Temp
End If
Next j
Next i
ListSort = liSte
End Function
'----------------------


Salutations!


"nospam" a écrit dans le message de news:
Bonjour à tous,

J'ai une colonne de cellules C1 à C32.

Je souhaite lancer une macro Excel qui recopie 6 cellules
au hasard de cette colonne dans les cellules A1 à A6.

Les cellules copiées devront être différentes.

Une idée ?

Merci pour votre aide,

Bien Cordialement,

Christian
Avatar
michdenis
Il y a ceci dérivé d'un truc de AV

'-------------------------------
Sub SansDoublons()

Dim Top As Integer, Bottom As Integer
Top = 32: Bottom = 1
With Worksheets("Feuil1") 'à adapter
For i = 1 To 6
.Cells(i, 1) = .Range("C" & Evaluate("int(rand()*(" & Top & "-" & Bottom & ")+" & Bottom & ")"))
If i > 1 Then
While Not .Range(Cells(1, 1), .Cells(i - 1, 1)).Find(Cells(i, 1)) Is Nothing
.Cells(i, 1) = Evaluate("int(rand()*(" & Top & "-" & Bottom & ")+" & Bottom & ")")
Wend
End If
Next
End With
End Sub
'-------------------------------


Salutations!






"michdenis" a écrit dans le message de news:
Bonjour Nospam,

Une variante :

'----------------------
Sub test2()

Dim T(1 To 6)
For a = 1 To 6
T(a) = Range("c" & Int(Rnd * 32 + 1)).Value
Next
Range("A1").Resize(UBound(T)) = WorksheetFunction.Transpose(ListSort(T))

End Sub
'----------------------
Function ListSort(liSte)
Dim First As Integer, Last As Integer
Dim i As Integer, j As Integer
Dim Temp
First = LBound(liSte)
Last = UBound(liSte)
For i = First To Last - 1
For j = i + 1 To Last
If liSte(i) > liSte(j) Then
Temp = liSte(j)
liSte(j) = liSte(i)
liSte(i) = Temp
End If
Next j
Next i
ListSort = liSte
End Function
'----------------------


Salutations!


"nospam" a écrit dans le message de news:
Bonjour à tous,

J'ai une colonne de cellules C1 à C32.

Je souhaite lancer une macro Excel qui recopie 6 cellules
au hasard de cette colonne dans les cellules A1 à A6.

Les cellules copiées devront être différentes.

Une idée ?

Merci pour votre aide,

Bien Cordialement,

Christian
1 2