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...
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 ?
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
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 ?
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...
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 ?
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
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 !
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" ??
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 !
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
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" ??
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
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 ?
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
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" <nospam@nospam.com> a écrit dans le message news:
efyePF9AGHA.1676@TK2MSFTNGP09.phx.gbl...
Bonjour à tous,
Comment mélanger au hasard le contenu de cellules sélectionnées
préalablement ?
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...
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 ?
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...
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
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.
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
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
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.
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
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...
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...
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...