Option Explicit
Sub VersusSansDoublon()
Dim ASUR As Range, TDon(), L As Long, C As Long, N As Long, TK(), _
D As New Dictionary, TVsExiste() As Boolean, J As Long, A As Long, TRés()
Set ASUR = ActiveSheet.UsedRange ' À adapter
TDon = ASUR.Value
ReDim TK(1 To UBound(TDon, 1) * 2)
For L = 1 To UBound(TDon, 1)
For C = 1 To 2
If Not D.Exists(TDon(L, C)) Then
N = N + 1
TK(N) = TDon(L, C)
D(TK(N)) = N: End If
Next C, L
ReDim TRés(1 To UBound(TDon, 1), 1 To UBound(TDon, 2)), _
TVsExiste(0 To VersusJA(N - 1, N))
For L = 1 To UBound(TDon, 1)
J = D(TDon(L, 1)): A = D(TDon(L, 2))
If J <> A Then TVsExiste(VersusJA(J, A)) = True
Next L
L = 0
For N = 0 To UBound(TVsExiste)
If TVsExiste(N) Then
L = L + 1
CalcJAVersus J, A, N
TRés(L, 1) = TK(J)
TRés(L, 2) = TK(A)
End If
Next N
ASUR.Value = TRés
End Sub
Public Function VersusJA(ByVal J As Long, ByVal A As Long) As Long
If A < J Then A = A Xor J: J = J Xor A: A = A Xor J
If A > J Then VersusJA = A * (A - 3) \ 2 + J Else VersusJA = -1
If VersusJA < 0 Then Err.Raise 9999, , "VersusJA(" & J & ", " & A & ") impossible."
End Function
Private Sub CalcJAVersus(ByRef J As Long, ByRef A As Long, ByVal VS As Long)
A = Int(Sqr(2 * VS + 0.25) + 1.5)
J = VS - A * (A - 3) \ 2
End Sub