Function InRegion(ByVal MatX As Range, ByVal MatY As Range, ByVal X As Double, ByVal Y As Double)
'Renvoi 1 si (X,Y) se trouve dans la Région fermée défini par MatX et MatY
'Renvoi 0 si extérieur à la région
'Renvoi -1 si sur la frontière

'Tailles matrices
Dim L As Long, L2 As Long, C As Long, C2 As Long
L = MatX.Rows.Count
L2 = MatY.Rows.Count
C = MatX.Columns.Count
C2 = MatY.Columns.Count

'Erreur de taille
If C > 1 Or C2 > 1 Then InRegion = "#COLONNE!": Exit Function
If L <> L2 Then InRegion = "#LIGNE!": Exit Function

'Paramètres
Dim t As Long, nb As Double, D As Double
Dim X1 As Double, X2 As Double, X3 As Double, Y1 As Double, Y2 As Double

'compte le nb de coupure
For t = 1 To L - 1
X1 = MatX.Cells(t)
Y1 = MatY.Cells(t)
X2 = MatX.Cells(t + 1)
Y2 = MatY.Cells(t + 1)

'Le point se trouve-t-il sur un segment verticale
If ((X1 = X2) And (X1 = X)) And ((Y1 <= Y And Y < Y2) Or (Y1 >= Y And Y > Y2)) Then
    InRegion = -1
    Exit Function
End If

'Le point se trouve-t-il entre le segment [(X1,Y1);(X2,Y2)[ ?
If (X1 <= X And X < X2) Or (X1 >= X And X > X2) Then

    'Calcul distance entre le segment et le point
    D = Y - Y1 + (Y1 - Y2) * (X1 - X) / (X1 - X2)

    'Test distance D
    If D = 0 Then 'Sur frontière
        InRegion = -1
        Exit Function

    ElseIf D > 0 Then 'point coupe le segment
        nb = nb + 1
        If X = X1 Then 'a l'aplomb du départ d'un segment
            X3 = MatX(t - 1)
            If t = 1 Then X3 = MatX(L)
            If (X3 < X And X2 < X) Or (X3 > X And X2 > X) Then nb = nb + 1
    End If
    End If
End If
Next t

'Renvoi vrai (=1) si pair ou faux (=0) si impair
InRegion = nb And 1

End Function