Tri aléatoire mais en conservant le commentaire de cellule

Bonjour,

Grace a votre aide j'ai pu réaliser cette petite macro qui me permet de faire un tri aléatoire sur une selection en colonne

Sub trialea()

'

' trialea Macro

'

' Touche de raccourci du clavier: Ctrl+m

Dim TbTrié(), Plg As Range, chT$, k$, n%, i%, x%

Set Plg = Selection

If Plg.Columns.Count > 1 Then

MsgBox "Il n'est prévue de n'appliquer ce tri qu'à une plage composée d'une " _

& "colonne unique !", vbInformation, "Plage à trier non conforme"

Exit Sub

End If

n = Plg.Rows.Count

For i = 1 To n

chT = chT & ChrW(i + 32)

Next i

ReDim TbTrié(1 To n, 0)

Randomize

For i = 1 To n

x = Int(Len(chT) * Rnd + 1)

k = Mid(chT, x, 1): x = AscW(k) - 32

TbTrié(i, 0) = Plg.Cells(x, 1)

chT = Replace(chT, k, "")

Next i

Plg.Value = TbTrié

End Sub

Cependant, les cellules ont souvent des commentaires, mais quand je lance le tri aléatoire les résultats sont bien remixés comme je e veux par contre les commentaires restent à leur place d'origine.

Si vous aviez une idée.

Merci à vous.

7tri-aleatoire.xlsb (28.30 Ko)

Bonjour,

Tri aléatoire ! L'expression est un oxymore !

Mais ta macro fait bien un tirage aléatoire... Pour intégrer les commentaires ça va compliquer un peu, les extraire pour pouvoir les réinsérer en commentaires. Pas le temps pour l'instant mais je peux voir ça dans la soirée.

Cordialement.

Bonjour,

Hello MFerrand

C'est normal, seules les valeurs sont prisent en compte !

Voici un code qui fait suivre les commentaires :

Sub Test()

    Dim Dico As Object
    Dim Cle As Variant
    Dim Tbl()
    Dim T
    Dim Plage As Range
    Dim Com As Comment
    Dim I As Integer
    Dim J As Integer

    With ActiveSheet: Set Plage = .Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp)): End With
    Set Dico = CreateObject("Scripting.Dictionary")

    I = Plage.Count

    Randomize

    Do

        J = Int((I * Rnd) + 1)

        Set Com = Plage(J).Comment
        If Not Com Is Nothing Then Dico(J) = Plage(J).Value & ";" & Com.Text Else Dico(J) = Plage(J).Value

    Loop While Dico.Count <> I

    Cle = Dico.Keys

    For J = 1 To I

         Set Com = Plage(J).Comment
        If Not Com Is Nothing Then Com.Delete

    Next J

    Plage.Value = ""

    I = 0

    For Each Cle In Dico.Keys

        I = I + 1
        T = Split(Dico(Cle), ";")
        Plage(I).Value = T(0)

        If UBound(T) = 1 Then Plage(I).AddComment T(1)

    Next Cle

End Sub

Re, Salut Theze !

Je sais bien que seules les valeurs sont prises en compte dans la macro, c'est moi qui l'avait écrite l'an dernier, pas de commentaires alors...

La même avec commentaires qui suivent :

Sub trialea()
'
' trialea Macro
'
' Touche de raccourci du clavier: Ctrl+m

    Dim TbTrié(), Cmt(), cm As Comment, Plg As Range, chT$, k$, n%, i%, x%
    Set Plg = Selection
    If Plg.Columns.Count > 1 Then
        MsgBox "Il n'est prévue de n'appliquer ce tri qu'à une plage composée d'une " _
         & "colonne unique !", vbInformation, "Plage à trier non conforme"
        Exit Sub
    End If
    n = Plg.Rows.Count
    For i = 1 To n
        chT = chT & ChrW(i + 32)
    Next i
    ReDim TbTrié(1 To n, 0)
    ReDim Cmt(1 To n)
    Randomize
    For i = 1 To n
        x = Int(Len(chT) * Rnd + 1)
        k = Mid(chT, x, 1): x = AscW(k) - 32
        TbTrié(i, 0) = Plg.Cells(x, 1)
        Set cm = Plg.Cells(x, 1).Comment
        If Not cm Is Nothing Then Cmt(i) = cm.Text: cm.Delete
        chT = Replace(chT, k, "")
    Next i
    Application.ScreenUpdating = False
    With Plg
        .Value = TbTrié
        For i = 1 To n
            If Cmt(i) <> "" Then
                .Cells(i, 1).AddComment Cmt(i)
            End If
        Next i
    End With
End Sub

Cordialement.

sans commentaire (rien à redire, quoi ! ou langue de bois, au choix. )

C'est parfait... un grand merci.

Pour ce qui est de l'année dernière, un événement perso a fait que j'avais autre chose a penser.. ce n'est pas dans mes habitudes

J'ai d'ailleurs retrouvé le post d'origine après avoir écrit celui là.

Merci à vous deux

NB : un dernier détail comment marque t(on le sujet comme terminé ?

pour marquer le sujet comme résolu, il te suffit de cliquer sur le bouton qui est près du bouton (dans le coin haut droit d'un post) ; tu sauras que tu as réussi quand tu verras un petit rond vert avec une coche, comme ceci :

sujet

fais-le de préférence sur le post qui a résolu ton problème ; donc dans le cas présent, fais-le pour le post de Theze de 16:56 et aussi pour le post de MFerrand de 23:47.

dhany

Merci encore une fois.

screen

mais t'as p't'être pas vu le bouton qui est près du bouton (dans le coin haut droit d'un post) ?

et faut pas cliquer 2 fois sur le même, sinon, ça le met, puis ça l'enlève.

dhany

Rechercher des sujets similaires à "tri aleatoire conservant commentaire"