OVH Cloud OVH Cloud

Gourous Excel : Mélanger au hasard des cellules ?

20 réponses
Avatar
nospam
Bonjour à tous,

Comment mélanger au hasard le contenu de cellules sélectionnées
préalablement ?

Exemple :

A1 = dg B1= ee
A2 = yu B2 = rt
A3 = hg B3 = tt
A4 = iof B4 = zr

Je sélectionne avec la souris la plage A1 à B4 et quand
je relâche le bouton, j'ai :

A1 = zr B1 = tt
A2 = ee B2 = iof
A3 = hg B3 = rt
A4 = dg B4 = yu

Je sélectionne avec la souris les cellules A2, A4, B1 et B3, quand
je relâche le bouton, j'ai :

A1 = zr B1 = dg
A2 = rt B2 = iof
A3 = hg B3 = tt
A4 = ee B4 = yu
(seules les cellules sélectionnées ont été mélangées au hasard)

La plage est ici petite mais j'aurai besoin de sélectionner
de grandes plages. A noter que je ne souhaite pas que le
contenu d'une cellule apparaisse au hasard dans une autre
+ d'une fois.

J'ai cherché sur le Web et dans les newsgroups sans succès...
Pas si simple on dirait...

Merci !

Bien Cordialement,

Christian

10 réponses

1 2
Avatar
Michel Gaboly
Bonjour nospam,

Gourous, le vilain mot ;-((

Pas bien compliqué :

L'idée est d'alimenter une matrice dans une première boucle avec le c ontenu de la sélection. Une seconde boucle utilise
un tirage au hasard pour déterminer un élément de la matrice, le re porte à la place d'une cellule de la sélection, puis
élimine de la matrice l'élément reporté.

A la fin tous les élements de la sélection ont été dispersés da ns celle-ci.


2 remarques.

1 Plutôt qu'une matrice en mémoire, j'ai utilisé la colonne A du cl asseur contenant la macro, à partir de la ligne 2.
Une adaptation est donc nécessaire si la sélection dépasse 65535 ce llules.

2 - Le contenu de chaque cellule est repris une fois et une seule, puisqu 'on élimine au fur et à mesure de la liste de
référence les éléments reportés. Cependant si la sélecion com porte 2 cellules (ou +) ayant le même contenu, on
retrouvera bien évidemment 2 cellules (ou +) ayant un contenu identique .


Sub Rearrangement()
Dim NbCells As Long, i As Integer, c As Range, Tirage As Long
NbCells = Selection.Count
With ThisWorkbook
.Sheets(1).Range("A:A").ClearContents
With .Sheets(1).Range("A1")
' Alimentation matrice contenant les valeurs à rep orter
For Each c In Selection
.Offset(i + 1) = c
i = i + 1
Next
' Initialisation générateur nb aléatoires
Randomize
' Report au hasard
For Each c In Selection
Tirage = Int(Rnd * i) + 1
Debug.Print i & " " & Tirage
c = .Offset(Tirage)
.Offset(Tirage).EntireRow.Delete
i = i - 1
Next
End With
End With

End Sub

Bonjour à tous,

Comment mélanger au hasard le contenu de cellules sélectionnées
préalablement ?

Exemple :

A1 = dg B1= ee
A2 = yu B2 = rt
A3 = hg B3 = tt
A4 = iof B4 = zr

Je sélectionne avec la souris la plage A1 à B4 et quand
je relâche le bouton, j'ai :

A1 = zr B1 = tt
A2 = ee B2 = iof
A3 = hg B3 = rt
A4 = dg B4 = yu

Je sélectionne avec la souris les cellules A2, A4, B1 et B3, quand
je relâche le bouton, j'ai :

A1 = zr B1 = dg
A2 = rt B2 = iof
A3 = hg B3 = tt
A4 = ee B4 = yu
(seules les cellules sélectionnées ont été mélangées au has ard)

La plage est ici petite mais j'aurai besoin de sélectionner
de grandes plages. A noter que je ne souhaite pas que le
contenu d'une cellule apparaisse au hasard dans une autre
+ d'une fois.

J'ai cherché sur le Web et dans les newsgroups sans succès...
Pas si simple on dirait...

Merci !

Bien Cordialement,

Christian





--
Cordialement,

Michel Gaboly
www.gaboly.com

Avatar
nospam
Oulà ! merci Michel, mais moi qui suis débutant, comment fait-on, pas à pas,
pour intégrer et exécuter ce programme dans Excel ??
Cà me paraît bien compliqué !

Cà ne marche que sur la "colonne A du classeur contenant la macro, à partir
de la ligne 2" ??

Merci !
Avatar
Michel Gaboly
Re,

Non cela marche avec n'importe quelle sélection ; la colonne A, à par tir de la ligne 2 est celle de la feuille "Temp" du
classeur contenant la macro, qui sert à stocker temporairement les donn ées.

Classeur exemple sur CJoint :

http://cjoint.com/?msquMKZt61


Oulà ! merci Michel, mais moi qui suis débutant, comment fait-on, p as à pas,
pour intégrer et exécuter ce programme dans Excel ??
Cà me paraît bien compliqué !

Cà ne marche que sur la "colonne A du classeur contenant la macro, à partir
de la ligne 2" ??

Merci !





--
Cordialement,

Michel Gaboly
www.gaboly.com

Avatar
docm
Bonjour.

Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
Call tt
End Sub

Sub tt()

ReDim t(0)

total = 0

For i = 1 To Selection.Areas.Count
For j = 1 To Selection.Areas(i).Count
'Création du tableau t() contenant les addresses des cellules de la
sélection
total = total + 1
ReDim Preserve t(total)
t(total) = Selection.Areas(i)(j).AddressLocal(0, 0)
Next
Next

r = total
For i = 1 To Selection.Areas.Count
For j = 1 To Selection.Areas(i).Count
'Echanger les valeurs de 2 adresses
temp = Selection.Areas(i)(j).Value
a = t(Int((r * Rnd) + 1))
Selection.Areas(i)(j).Value = Range(a).Value
Range(a).Value = temp
Next
Next
End Sub

docm

"nospam" a écrit dans le message news:

Bonjour à tous,

Comment mélanger au hasard le contenu de cellules sélectionnées
préalablement ?

Exemple :

A1 = dg B1= ee
A2 = yu B2 = rt
A3 = hg B3 = tt
A4 = iof B4 = zr

Je sélectionne avec la souris la plage A1 à B4 et quand
je relâche le bouton, j'ai :

A1 = zr B1 = tt
A2 = ee B2 = iof
A3 = hg B3 = rt
A4 = dg B4 = yu

Je sélectionne avec la souris les cellules A2, A4, B1 et B3, quand
je relâche le bouton, j'ai :

A1 = zr B1 = dg
A2 = rt B2 = iof
A3 = hg B3 = tt
A4 = ee B4 = yu
(seules les cellules sélectionnées ont été mélangées au hasard)

La plage est ici petite mais j'aurai besoin de sélectionner
de grandes plages. A noter que je ne souhaite pas que le
contenu d'une cellule apparaisse au hasard dans une autre
+ d'une fois.

J'ai cherché sur le Web et dans les newsgroups sans succès...
Pas si simple on dirait...

Merci !

Bien Cordialement,

Christian




Avatar
nospam
Cool, merci docm!! ce code marche un peu mieux...
Avatar
docm
Ce fut avec plaisir.

"nospam" a écrit dans le message news:
uA1en4$
Cool, merci docm!! ce code marche un peu mieux...




Avatar
Michel Gaboly
Re,

Vachement aimable ;-((

Le code que j'ai commenté en détail et mis dans un fichier exemple su r CJoint fonctionne parfaitement.

La seule raison pour laquelle contrairement à ta demande, et à ce qu' a fait Docm, j'ai associé mon code à une macro à
lancer explicitement, est que cela permet de choisir les plages dont on v eut redistribuer le contenu ; en associant
directement le code à l'événement SelectionChange, tu risques de ma uvaises surprises : ta feuille ne comporte plus aucun
élément stable : si tu as par exemple une zone de titres, tu ne peux même pas la sélectionner sans qu'elle se retrouve
dans le désordre, et bien pire, si tu la sélectionnes en même tant que d'autres cellules.


Cool, merci docm!! ce code marche un peu mieux...





--
Cordialement,

Michel Gaboly
www.gaboly.com

Avatar
Michel Gaboly
NB - Déjà posté un peu + tôt, mais le sujet avait été écras é

Re,

Vachement aimable ;-((

Le code que j'ai commenté en détail et mis dans un fichier exemple su r CJoint fonctionne parfaitement.

La seule raison pour laquelle contrairement à ta demande, et à ce qu' a fait Docm, j'ai associé mon code à une macro à
lancer explicitement, est que cela permet de choisir les plages dont on v eut redistribuer le contenu ; en associant
directement le code à l'événement SelectionChange, tu risques de ma uvaises surprises : ta feuille ne comporte plus aucun
élément stable : si tu as par exemple une zone de titres, tu ne peux même pas la sélectionner sans qu'elle se retrouve
dans le désordre, et c'est bien pire, si tu la sélectionnes en même tant que d'autres cellules.


Cool, merci docm!! ce code marche un peu mieux...





--
Cordialement,

Michel Gaboly
www.gaboly.com

Avatar
nospam
Oops! Toutes mes excuses Pierre !
En fait, c'est bien grâce à toi que j'ai pu comprendre comment
du code pouvait être entrer dans Excel ! Merci pour ta feuille.
Cependant si je remplis les cellules A1 à C6 avec 1,2,3,4....18,
que je sélectionne ce rectangle et que je lance ta macro,
le mélange ne s'effectue pas correctement et des cellules
vierges viennent s'insérer dans le rectangle. Le code de "docm"
fonctionne correctement pour le moment...
A noter que je tourne Excel 2003 SP2...
Avatar
nospam
Toutes mes excuses Michel, je voulais dire !
1 2