Affichage nombre de triplets
Bonjour,
J'ai une matrice de 50 colonnes et 2'000 lignes. Chaque ligne contient 5 nombres de 1 à 50 répartis dans les colonnes idoines, le 1 dans la colonne 1, le 10 dans colonne 10, etc…
Mon souhait est de pouvoir déterminer le nombre de tous les triplets (1, 2, 3… à 48, 49, 50) se trouvant dans cette matrice. Ce qui doit faire 20'000 combinaisons possibles de triplets.
Est-ce envisageable?...D'afficher ça dans un fichier?
Merci
Cordiaux messages
Jean-Pierre
Bonjour,
pas un petit fichier exemple à se mettre sous la dent ? (avec explication claire et résultat souhaité...)
P.
Bonjour,
Pour 50 nombres, cela fait 19600 combinaisons de 3 nombres...
Mais pour 5 nombres par ligne, cela fait 10 combinaisons à recenser par ligne, soit en effet 20000 pour 2000 lignes...
Tu ne fournis pas de modèle et tu n'indiques pas comment les classer : par ordre de combinaisons (1 2 3, 1 2 4, 1 2 5...) ou par nombre d'occurrences trouvé pour chacune ?
Cordialement.
Tiens ! j'avais oublié de valider ! Il y a deux heures que ce message attend !
Bonjour et merci pour vos réponses.
J'ai joint à ce message un fichier représentatif de mon souci. Ce n'est qu'un extrait, l'original contient plus de 60 colonnes.
Comme vous le constaterez, sur une ligne peuvent figurer plusieurs fois le même nombre.
J'ai essayé avec Sommeprod et des imbrications de Si et de ET...mais sans succès!
Le classement pourrait être du plus grand nombre de triplets au plus petit. Par exemple (1,2,3) 123...le triplet 1,2 3 est apparu 123 fois.
Peu importe la manière de l'écrire. Malgré mes faibles compétences, je devrais être en mesure d'adapter la solution le cas échéant.
Bien à vous et au plaisir de vous lire
Jean-Pierre
Bonjour,
La réaction n'a pas été très rapide !
Je te rappelle la base de ta question initiale :
J'ai une matrice de 50 colonnes et 2'000 lignes. Chaque ligne contient 5 nombres de 1 à 50 répartis dans les colonnes idoines, le 1 dans la colonne 1, le 10 dans colonne 10, etc…Tu sembles l'avoir quelque peu oubliée ! Et tu reviens avec une autre question, et en ajoutant que ton fichier réel comporte des éléments en plus...
Ce sont pas là de bonnes conditions pour travailler...
J'avais établi en attendant une procédure correspondant à ta question initiale, qu'il me restait à revoir pour affiner le tri...
Je la livre volontiers au cas où... mais je m'en tiendrai là pour ma part et laisse à d'autres le soin d'envisager ta nouvelle question.
Sub Triplets()
Dim d As Object, T(), q(1 To 5), lgn, k, n%, i%, u%, v%, w%
Set d = CreateObject("Scripting.Dictionary")
Application.ScreenUpdating = False
With Worksheets(1)
n = .Cells.SpecialCells(xlCellTypeLastCell).Row
For i = 1 To n
lgn = .Cells(i, 1).Resize(, 50).Value
For v = 1 To 5
q(v) = WorksheetFunction.Large(lgn, 6 - v)
Next v
For u = 1 To 3
For v = u + 1 To 4
For w = v + 1 To 5
k = q(u) & "|" & q(v) & "|" & q(w)
If d.exists(k) Then
d(k) = CInt(d(k)) + 1
Else
d(k) = 1
End If
Next w
Next v
Next u
Next i
End With
ReDim T(d.Count, 3): n = 0
For Each k In d.keys
n = n + 1: T(n, 0) = k: T(n, 3) = CInt(d(k))
Next k
For u = 1 To n - 1
For v = u + 1 To n
If T(v, 3) > T(u, 3) Then
For w = 0 To 3 Step 3
T(0, w) = T(v, w): T(v, w) = T(u, w): T(u, w) = T(0, w)
Next w
End If
Next v
Next u
T(0, 0) = "Triplets": T(0, 3) = "Nb"
For i = 1 To n
k = Split(T(i, 0), "|")
For v = 0 To 2
T(i, v) = CInt(k(v))
Next v
Next i
With Worksheets(2)
.Range("A1").CurrentRegion.Clear
With .Range("A1").Resize(n + 1, 4)
.Value = T
.HorizontalAlignment = xlCenter
.Columns.ColumnWidth = 6
With .Borders
.LineStyle = xlContinuous: Weight = xlThin
End With
With .Rows(1).Font
.Bold = True: .Italic = True
End With
End With
.Range("A1:C1").Merge
.Activate
End With
End SubCordialement.
Merci pour la réponse. Désolé du retard, j'étais sous terre...sans possibilité de contacts avec l'extérieur...sécurité oblige.
Bon week-end!