Bonjour,
une proposition (ne fonctionne pas sur Mac)
Dim tr(1000, 1000), ntr 'tr =tableau résultat max 1000 clients, ntr nombre de clients effectivement présents dans tr
Sub aargh()
Dim dict As Object ' dictionnaire cle=numero client, item= indice dans tableau tr
ntr = 0
Erase tr
Set dict = CreateObject("scripting.dictionary")
With Sheets("feuil1")
dc = .Cells(2, Columns.Count).End(xlToLeft).Column 'dc = dernière colonne tournée
For col = 3 To dc 'pout chaque tournée
' on determine la dernière ligne contenant un numéro client
dl = 3
Do While Val(.Cells(dl, col)) <> 0
dl = dl + 1
Loop
dl = dl - 1
' si plus d'un client on charge les N° de client dans la table t et incremente le compteur de chaque paire de clients présents dans la tournée
If dl > 3 Then
t = .Cells(3, col).Resize(dl - 2, 1)
totalpaire t, tr, dict
End If
Next col
' on affiche le tableau résultat
.Cells(17, 2).Resize(ntr + 1, ntr + 1) = tr
End With
End Sub
Sub totalpaire(t, tr, dict As Object, Optional n = 1, Optional ni = 1, Optional fa = 0)
'procedure recursive
For i = ni To UBound(t) - (2 - n) 'on prend chaque numéro client à partir de l'indice ni
cle = t(i, 1)
If Not dict.exists(cle) Then 'client pas encore dans le dictionnaire, on l'ajoute au dictionnaire et au tableau résultat
ntr = ntr + 1
tr(ntr, 0) = cle
tr(0, ntr) = cle
dict(cle) = ntr
End If
If n = 1 Then ' si premier élément de la paire est choisi
fa = cle
totalpaire t, tr, dict, n + 1, i + 1, fa 'on choisit le second
Else 'sinon les deux éléments de la paire sont choisis on incrémente les compteurs
tr(dict(cle), dict(fa)) = tr(dict(cle), dict(fa)) + 1
tr(dict(fa), dict(cle)) = tr(dict(fa), dict(cle)) + 1
End If
Next i
End Sub