Function LigneCommune(xligne As Range, xtablo As Range, xNbrCommun) As Boolean
Dim tablo, ligne, i&, j&, k&, k2&, i1&, j1&, Nbr&, tot&, sauf&
Application.Volatile
ligne = xligne.Value
tablo = xtablo.Value
sauf = xligne.Row - xtablo.Row + 1
k2 = UBound(tablo)
i1 = UBound(tablo, 2): j1 = UBound(ligne, 2)
For k = 1 To k2
  If k <> sauf Then
    Nbr = 0
    i = 1: j = 1
    Do While i <= i1 And j <= j1
      Select Case Sgn(tablo(k, i) - ligne(1, j))
        Case -1
          i = i + 1
        Case 0
          Nbr = Nbr + 1
          i = i + 1: j = j + 1
        Case 1
          j = j + 1
      End Select
    Loop
    If Nbr = xNbrCommun Then
      LigneCommune = True
      Exit Function
    End If
  End If
Next k
End Function
Function LigneCommuneN(xligne As Range, xtablo As Range, xNbrCommun) As String
Dim tablo, ligne, i&, j&, k&, k2&, i1&, j1&, Nbr&, tot&, sauf&
Application.Volatile
ligne = xligne.Value
tablo = xtablo.Value
sauf = xligne.Row - xtablo.Row + 1
k2 = UBound(tablo)
i1 = UBound(tablo, 2): j1 = UBound(ligne, 2)
For k = 1 To k2
  If k <> sauf Then
    Nbr = 0
    i = 1: j = 1
    Do While i <= i1 And j <= j1
      Select Case Sgn(tablo(k, i) - ligne(1, j))
        Case -1
          i = i + 1
        Case 0
          Nbr = Nbr + 1
          i = i + 1: j = j + 1
        Case 1
          j = j + 1
      End Select
    Loop
    If Nbr = xNbrCommun Then
      LigneCommuneN = LigneCommuneN & "," & k + xtablo.Row - 1
    End If
  End If
Next k
If Left(LigneCommuneN, 1) = "," Then LigneCommuneN = Mid(LigneCommuneN, 2)
End Function