[Résolu]mélanger ensembles de cellules dans colonne d'un tableau

Mad

XLDnaute Nouveau
Bonjour,
J'aurais besoin de votre aide SVP.
Dans une feuille avec 2 tableaux que j'alimente et tri via un userform qui pioche dans une base de donnée.
Dans le code du tri, à la fin je fait repéré les lignes des Mr et Mme en les taguant par :
H1, H3, H5, etc pour le tableau homme (colonne D)
F2, F4, F6, etc pour les femmes (colonne K)
J'aimerais par vba en me servant du bouton "MELANGER", mélanger les colonne (A;B;C) et (H;I;J) (avec leurs propre valeurs) pour que les personnes se voit octroyer un autre un autre Tag. Sachant que les tableaux peuvent contenir chacun de 1 à 25 lignes indépendamment.
Ci joint le fichier exemple.
Par avance merci pour votre aide
 

Pièces jointes

  • ExempleTEST.xlsm
    19 KB · Affichages: 34
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonsoir.
Voyez si vous pouvez utiliser cette procédure OrdreAléat en étudiant l'exemple d'utilisation.
VB:
Sub Essai()
Dim TE(1 To 26), TN() As Long, TS(1 To 26), N As Long, P As Long
For N = 1 To 26: TE(N) = Chr$(N + 64): Next N
Randomize
OrdreAléat TN, 26 ' Dimensionne et garnit TN de numéros de 1 à 26 en ordre aléatoire.
For N = 1 To 26: P = TN(N): TS(N) = TE(P): Next N
MsgBox Join(TE, ", ") & vbLf & Join(TS, ", ")
End Sub

Sub OrdreAléat(TN() As Long, ByVal Nombre As Long)
Dim P As Long, A As Long, J As Long
ReDim TN(1 To Nombre): For P = 1 To Nombre: TN(P) = P: Next P
Randomize
For P = Nombre To 2 Step -1
   A = Int(Rnd * P) + 1: J = TN(A): TN(A) = TN(P): TN(P) = J
   Next P
End Sub
 

Mad

XLDnaute Nouveau
Bonjour,
Alors d'abord merci pour la direction a prendre.
Mais comment vous dire ..., j'ai découvert la fonction "countif" hier.
Mon niveau en VBA est donc misérable.
J'ai quand même essayé depuis hier de comprendre ton code, mais sans succès pour le moment.
J'avoue que je m'attendais à quelque chose de plus accessible.
Si je peu avoir un autre indice, je suis preneur.
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Qu'est-ce que vous ne comprenez pas ?
(moi c'est votre demande que je ne comprends pas: vous parlez de mélanger des colonnes alors que ça parait n'avoir aucun sens au vu des données, contrairement à un éventuel déclassement aléatoire des lignes)
En tout cas ma Sub OrdreAléat fabrique une table d'entiers longs uniques en ordre aléatoire. Alors servez vous en pour pomper des données sources dans un certain ordre et les envoyer vers un emplacement cible dans un ordre différent donné par la table rendue par cette procéture. Tout comme dans ma Sub Essai de démo j'envoie par une boucle les infos de la table TE vers la table TS dans l'ordre donné par la table TN fabriquée par la Sub OrdreAléat.
 

Mad

XLDnaute Nouveau
Alors oui, je n'ai peut-être pas été très clair.
colonne B à partir de la ligne 3, j'ai les noms de famille
colonne C à partir de la ligne 3, j'ai les prénoms correspondants.
j'aimerais que de la ligne 3 jusqu’à la fin du tableau (variable), les colonnes B et C soit mélanger ensemble afin que par exemple :
Dupont gérard en ligne 3 avant mélange, se retrouve en ligne 7 par exemple, mais reste Dupont gérard.
Et de même pour un 2ème tableau sur la même feuille mais sur les colonnes I et J avec toujours les premières valeurs en 3ème ligne.
J'espère avoir été plus compréhensible dans le but recherché.
Pour la méthode, j'essaye toujours de comprendre :( et surtout de l'appliqué.
 

Dranreb

XLDnaute Barbatruc
Oui, en me basant sur l'exemple, qui ne figure d'ailleurs pas sur votre classeur ExempleTEST, ça me semble bien être simplement un déclassement aléatoire de lignes. Les colonnes ne changent pas de place. Essayez comme ça :
VB:
Sub Bouton12_Cliquer()
Randomize
DéclasserLignesPlage ActiveSheet.[B3:C3].Resize(ActiveSheet.[B1000000].End(xlUp).Row - 2)
DéclasserLignesPlage ActiveSheet.[I3:J3].Resize(ActiveSheet.[I1000000].End(xlUp).Row - 2)
End Sub

Sub DéclasserLignesPlage(ByVal Rng As Range)
Dim TE(), LE As Long, TN() As Long, TS(), LS As Long, C As Long
TE = Rng.Value
ReDim TS(1 To UBound(TE, 1), 1 To UBound(TE, 2))
OrdreAléat TN, UBound(TE, 1)
For LE = 1 To UBound(TE, 1)
   LS = TN(LE)
   For C = 1 To UBound(TE, 2)
      TS(LS, C) = TE(LE, C)
      Next C, LE
Rng.Value = TS
End Sub

Sub OrdreAléat(TN() As Long, ByVal Nombre As Long)
Dim P As Long, A As Long, J As Long
ReDim TN(1 To Nombre): For P = 1 To Nombre: TN(P) = P: Next P
Randomize
For P = Nombre To 2 Step -1
   A = Int(Rnd * P) + 1: J = TN(A): TN(A) = TN(P): TN(P) = J
   Next P
End Sub
 

Mad

XLDnaute Nouveau
Merci beaucoup.
Alors cela marche parfaitement.
J'ai beau comprendre le principe, c'était encore en dehors et loin de ma porté de rédiger ce code.
Un indice ne m'aurais pas suffit j'aurais encore pédalé.
En tout cas du coup, un grand merci.
 

Membres actuellement en ligne

Statistiques des forums

Discussions
312 196
Messages
2 086 100
Membres
103 116
dernier inscrit
kutobi87