XL 2016 Ma formule de détection de chevauchements et bilocations en étudiant les plages horaires dysfonctionne

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Webperegrino

XLDnaute Accro
Supporter XLD
Bonjour Le Forum,

L’extrait de ce qui est présenté en pièce annexé et le résultat d’une longue recherche par codification VBA.
Le résultat s’affiche après un tri ascendant sur la colonne F [Prénoms] , puis ascendant sur la colonne L [Début de la plage horaire] et ascendant sur colonne M (Fin de plage horaire].

Une première formule spécifique est placée en cellule [N3] : elle semble bien fonctionner.
C’est la deuxième formule en cellule [N4], glissée jusqu’à la cellule [N100] qui me porte des complications ?
Plus j’essaie de la transformer plus je me noie…
Rien ne presse mais j’aimerai trouver mon erreur dans la formulation ; ça fait un jour de recherche mais plus je modifie plus je me noie…

Fonctionnement souhaité de la formule de la colonne M :
Lorsqu’un prénom placé en colonne F, figurant aussi, ou pas, dans la cellule au-dessus et/ou dans la cellule au-dessous, la formule devrait travailler sur ce prénom, pour détecter (colonne N) sur une ou trois de ces cellules (colonne F) , selon le début horaire et fin horaire (colonnes L et M) :

  • du chevauchement sur le début de plage ou la fin de plage horaire
  • de la bilocation (sur deux sites différents) avec une plage horaire identique
Par exemple, avec la formule placée en colonne N :
  • Lignes 3 et 4 : Alexandra est en chevauchement sur les deux premières lignes : elle terminerait en Site n° 1 à 22h30 mais doit être en Site n° 7 à partir de 21h00 : CHEVAUCHEMENT de plage horaire,
  • Lignes 19 et 20 : il s’agit bien d’une BILOCATION sur Site 4 et Site 5 car Dominique est à la même plage horaire aux deux endroits,
  • Mais, la formule ne fonctionne pas en lignes 21 et 22 : en effet, Elisabeth·P a deux plages horaires qui ne se chevauchent pas. Elle finit à 17h00 sur un site et ne reprend sur l’autre site qu’à 22h30 pour finir au matin à 02h00. Quand bien même elle aurait repris sur le deuxième site à 17h00 précises, il ne doit pas y avoir là, ni CHEVAUCHEMENT ni BILOCATION.
  • Idem pour mes lignes suivantes :
    • ligne 52 avec le cas de Maryse
    • ligne 56 pour Michel·G
    • ligne 59 pour Muriel
Qu’est-ce que j’ai mal réalisé dans la formule et qui empêche de donner un bon résultat dans tous ces cas ?
Cette formule en colle N devrait pouvoir fonctionner pour tout nouvel affichage ultérieur de valeurs différentes en colonnes F-K-L-M.
J’ai espoir que vous pourrez m’aiguiller.

Dans deuxième dernier temps, une fois le bon résultat trouvé sur toutes les cellules de la colonne N, et pour ne garder à l’écran que les « anomalies de plages horaires » pour chaque personne, je cacherai toutes les lignes sans message pour n’afficher que les bilocations et les chevauchements.
Merci à l’avance pour toute aide apporté sur cette formule.
Webperegrino
 

Pièces jointes

Dernière édition:
Solution
Avec quelques petis ajustements dans les macros pour "depivoter" et "chevauchement",le voilà.
Mais il faut lancer les 2 macros quand vous modifiez quelque chose dans cette ligne 167 avant que vous pouvez voir le résultat.
Bonsoir Sylvanu,
L'application #13 de Bsalv, seule, réagit aussi et parfaitement dans le même temps que vous indiquez.

Mon vrai fichier, devenu un mastodonte de 10 000Ko, tourne, mais est devenu une usine à gaz.
Il y a certainement des feuilles qui travaillent en même temps et qui ralentissent l'analyse de Bsalv que j'y ai intégré. J'ai essayé de placer des "xlCalculationManual" ici ou là dans les lignes, en vain.

C'est pour cela que je reprends tout à zéro avant de vous le proposer les lignes vba pour vérification-correction.
N'étant pas un grand expert comme vous trois, ça me prend du temps...
Mais je reviens ici dès que c'est prêt à présenter.
Webpergrino
 
Avez vous des macros Worksheet_Change dans votre feuille ?
Cela pourrait expliquer.
Essayez de mettre en début de macro :
VB:
Application.ScreenUpdating = false
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
et en fin :
Code:
Application.ScreenUpdating = true
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
Une autre piste est de passer par des arrays qui accoleront d'un factor 10 ou 20 car cela évite d'écrire en cellules.
 
j'ai modifié les fonctions dans une macro et la source n'est plus un TS, mais une plage dynamique qu'on doit examiner pour savoir son largeur.
En haut, on définit 6 colonnes qui nous intéressent et "1", c'est la colonne 1 de la plage "With c.Offset(1).Resize(i - c.Row, 10)", donc ce n'estpas nécessairement la colonne 1.
Tout est réalisé en mémoire, donc je ne pense pas que ces "screenupdating, enableevents et calculation" auront une influence.
Vous pouvez trier votre source d'une autre manière et puis relancer la macro, le résultat serait le même.
Chez moi, tout se passe en <100 ms.
 

Pièces jointes

Le forum,
Je crois avoir trouvé mieux, plus rapide, et avec la feuille BDD qui est en place.
Ci-joint une simulation (Analyse sur PANORAMIQUE...) qui me donne espoir.
Ce que je ne sais pas faire :
- les résultats en colonne M comme pour ce qui se voit en préparation colonne Q pour Alexandra et Béatrice, avec coloration selon l'affichage Chevauchement ou Bilocation.
- la colonne L recevrait les lettres des colonnes concernées de feuille Panoramique.
- Pratique et rapide :
· Choix du jour en Q1
· filtre sur colonne G sur un nom
· les affichages de ColonnePanoramique + chevauchement·Bilocations seraient tout de suite visibles en colonne L et M. (plus lisible aussi lors d'un filtrage en colonne G sur Alexandra ou Béatrice par exemple, mais étendu sur toute la colonne M par la fonction de Bsalv).
Sur cette feuille BDD que j'utilise déjà grâce à Bsalv, les affichages sont très rapides.

Comme vous le constaterez, j'étais parti avec le deuxième fichier (Analyseur...) mais c'était trop lourd à gérer ; l'avantage dans ce dernier, c'est que j'ai réussi à trouver une formule pour donner la lettre de la colonne de la feuille PANORAMIQUE où se trouve le prénom recherché, à partir du numéro de la colonne dans Panoramique :
VB:
BIL.[J3].Offset(i) = Lettre_Colonne(Cel.Column) 'la LETTRE de ColPAN
Si vous pouviez, Bsalv, modifier la fonction sur les colonnes L et M, je serais ravi.
Merci
Webperegrino.
 

Pièces jointes

Dernière édition:
Bonjour,
@bsalv vous a fait une belle proposition qui tient compte du fait que votre projet n'est pas basé sur des tableaux structurés (TS).
Dans le code VBA, c'est évidemment plus parlant de faire référence aux colonnes par leur noms donnés dans les TS que par leur n°.
Mais quand du VBA a déjà été écrit sur des Tableaux non structurés, pas évident de rétropédaler, d'autant plus si on n'est pas familier avec les TS. Dans certains cas (peu fréquents), les TS présentent moins d'intérêt que les tableaux non structurés.
Le code de @bsalv propose une certaine souplesse : les n° de colonnes utiles du tableau sont identifiés par un tableau de constantes (sColonnes).
Juste pour ajouter un peu plus de lisibilité dans les colonnes , dans le code (la macro M_Chevauchement est dupliquée en M_Chevauchement_bis), j'ai remplacé la constante sColonnes par une liste de constantes, plus parlantes et dans le code, ne référer qu'à ces noms de constantes, ce qui facilite les changements (noms, n° ...). Un principe que j'adopte souvent.
Le code de @bsalv est ici très commenté, très lisible et ne justifie évidemment pas de telles modifications.

VB:
'Private Const sColonnes = "1,5,6,7,8,10"     'colN° des bénévoles, du lieu, de la plage horaire, du début, du fin et la colonne des résultats dans votre BDD
Private Const COL_BENEVOLE = 1
Private Const COL_LOCATION = 5
Private Const COL_PLAGE = 6
Private Const COL_DEBUT = 7
Private Const COL_FIN = 8
Private Const COL_RESULTAT = 10
Private Const RANGE_ENTETE_BENEVOLE = "F2"
Private Const NOM_PLAGE_BENEVOLE = "Benevole"
Private Const NOM_PLAGE_DEBUT = "Debut"
Private Const NOM_PLAGE_FIN = "Fin"
Private Const NOM_PLAGE_RESULTAT = "Resultat"
Sub M_Chevauchement()

     Dim Arr, aCol() As Integer, sNom As String, Temp, Arr1, N1, N2, N3, aNoms, Ptr As Integer, i, j, iOffset, D(1) As Double, aResultat, s As String, sp, aOut, c As Range, Tim1, Tim2

     Tim1 = Timer
     Application.ScreenUpdating = False
     sp = Split(sColonnes, ",")              'position des 5 colonnes utilies en "strings"
     ReDim aCol(UBound(sp))                  'préparer matrice pour les colonnes en "integer"
     For i = 0 To UBound(sp): aCol(i) = sp(i): Next     'copier&coller ces integers
     With Sheets("feuil1")
          On Error Resume Next
          .AutoFilter.Range.AutoFilter
          On Error GoTo 0
          Set c = .Range("F2")               'entête "bénévole"
          i = Application.Max(c.Row + 1, Application.Match("zzzzzz", c.EntireColumn, 1))     'dernière cellule non-vide de la colonne "F"
          With c.Offset(1).Resize(i - c.Row, 10)     'plage (qui n'est pas un TS) avec vos données
               Arr = .Value2                 'lire vers une matrice
               iOffset = .Row - 1            'ligne de l'entête
               .Columns(aCol(0)).Name = "Benevole"     'plage nommée des benevoles
               .Columns(aCol(3)).Name = "Debut"     'plage nommée du début
               .Columns(aCol(4)).Name = "Fin"     'plage nommée du Fin
               .Columns(aCol(5)).Name = "Resultat"     'plage nommée pour les résultats
               .EntireRow.AutoFit
          End With
     End With

     N1 = UBound(Arr)                        'nombre de lignes
     N2 = UBound(Arr, 2)                     'nombre de colonnes
     ReDim aResultat(1 To N1, 0)             'préparer matrice pour le résultat

     For i = 1 To N1                         'boucler les lignes
          sNom = Arr(i, aCol(0))             'nom du bénévole
          If Len(sNom) > 0 Then              'n'est pas vide
               If TypeName(aNoms) = "Empty" Then     'encore aucun nom connu
                    b = True                 'nouveau nom
                    ReDim aNoms(0): aNoms(0) = sNom     'créer une matrice et coller noms dans position "0"
               Else
                    r = Application.IfError(Application.Match(sNom, aNoms, 0), 0)     'vérifier si ce nom existe dans la matrice "aNoms"
                    b = (r = 0)              'il n'existe pas encore
                    If b Then
                         j = UBound(aNoms) + 1     'nouveau Ubound
                         ReDim Preserve aNoms(j)     'redimensioner avec maintenance des données
                         aNoms(j) = sNom     'coller nouveau nom
                    End If
               End If

               If b Then                     'nouveau nom
                    N3 = WorksheetFunction.CountIf(Range("benevole"), sNom)     'nombre de ce nom
                    Temp = Evaluate("if(benevole=" & Chr(34) & sNom & Chr(34) & ",hour(debut)*100+minute(debut)+row(debut)/1000,1e99)")     'savoir les numéro des lignes de ce nom dans une séquence ascendant du temps "debut"
                    ReDim Arr1(1 To N3, 1 To 7)     'préparer une matrice pour les données filtrées de ce nom
                    For i1 = 1 To N3
                         D(0) = WorksheetFunction.Small(Temp, i1)     'lai-ème plus petite valeur de "Temp"
                         D(1) = Int(D(0))    'la partie integer  = "hhmm", donc heure et minute en 4 chiffres
                         Ptr = (D(0) - D(1)) * 1000 - iOffset     'la partie décimale avec un décalage = ligne à partir de l'entête
                         Arr1(i1, 1) = Arr(Ptr, --aCol(0))     'nom
                         Arr1(i1, 2) = Arr(Ptr, aCol(1))     'location
                         Arr1(i1, 3) = Arr(Ptr, aCol(3))     'debut
                         Arr1(i1, 4) = Arr(Ptr, aCol(4)) - (Arr(Ptr, aCol(3)) > Arr(Ptr, aCol(4)))     'fin (avec correction si on dépasse minuit
                         Arr1(i1, 5) = Arr(Ptr, aCol(2))     'plage horaire
                         Arr1(i1, 6) = Ptr + iOffset     'ligne
                         Arr1(i1, 7) = Ptr
                    Next

                    For i1 = 1 To N3 - 1     'boucler les lignes
                         i2 = i1 + 1         'comparer avec le précédent et le suivant (s'il existe)
                         If Application.Min(Arr1(i1, 4), Arr(i2, 4)) > Application.Max(Arr1(i1, 3), Arr1(i2, 3)) Then     'il y a du chevauchement
                              b = (StrComp(Arr(i1, 2), Arr1(i2, 2), 1) <> 0) And (Arr1(i1, 3) = Arr1(i2, 3))     'location différente mais même début
                              s1 = Arr1(i1, 6) & " | " & Arr1(i2, 6) & " | "
                              s2 = IIf(b, "Bilocation | " & Arr1(i1, 2) & " | " & Arr1(i2, 2), "Chevauchement | " & Arr1(i1, 5) & " | " & Arr1(i2, 5))
                              aResultat(Arr1(i1, 7), 0) = aResultat(Arr1(i1, 7), 0) & IIf(Len(aResultat(Arr1(i1, 7), 0)) = 0, "", vbLf) & s1 & s2
                              aResultat(Arr1(i2, 7), 0) = aResultat(Arr1(i2, 7), 0) & IIf(Len(aResultat(Arr1(i2, 7), 0)) = 0, "", vbLf) & s1 & s2

                              If TypeName(aOut) = "Empty" Then
                                   N3 = 1: ReDim aOut(1 To 5, 1 To 1)
                              Else
                                   N3 = UBound(aOut, 2) + 1: ReDim Preserve aOut(1 To UBound(aOut), 1 To N3)
                              End If

                              aOut(1, N3) = sNom     'nom
                              aOut(2, N3) = Arr1(i1, 6) & " vs " & Arr1(i2, 6)     'ligne
                              sp = Split(s2, " | ")
                              aOut(3, N3) = sp(0)
                              aOut(4, N3) = sp(1)
                              aOut(5, N3) = sp(2)
                         End If
                    Next
               End If
          End If
     Next
    
Tim2 = Timer
     With Range("Resultat")
          .Value = aResultat
          .EntireColumn.AutoFit
     End With

     If TypeName(aOut) = "Empty" Then N3 = 0 Else N3 = UBound(aOut, 2)
     With Range("Tabel2").ListObject
          If N3 > 0 Then
               If .ListRows.Count = 0 Then .ListRows.Add
               .DataBodyRange.Resize(N3).Value = Application.Transpose(aOut)
          End If
          If .ListRows.Count > N3 Then .DataBodyRange.Offset(N3).Resize(.ListRows.Count - N3).Delete
          With .Range
               If N3 > 1 Then .Sort .Range("A1"), xlAscending, Header:=xlYes
               .EntireColumn.AutoFit
               .EntireRow.AutoFit
          End With
     End With
    
     Application.ScreenUpdating = True

     MsgBox "prêt en " & Format(Timer - Tim1, "0.000 \s") & vbLf & "dont " & Format(Tim2 - Tim1, "0.000 \s") & " pour la calculation"
End Sub
Sub M_Chevauchement_bis()

     Dim Arr, sNom As String, Temp, Arr1, N1, N2, N3, aNoms, Ptr As Integer, i, j, iOffset, D(1) As Double, aResultat, s As String, sp, aOut, c As Range, Tim1, Tim2

     Tim1 = Timer
     Application.ScreenUpdating = False
     With Sheets("feuil1")
          On Error Resume Next
          .AutoFilter.Range.AutoFilter
          On Error GoTo 0
          Set c = .Range(RANGE_ENTETE_BENEVOLE)               'entête "bénévole"
          i = .Cells(Rows.Count, c.Column).End(xlUp).Row    'dernière cellule non-vide de la colonne "F"
          With c.Offset(1).Resize(i - c.Row, COL_RESULTAT)     'plage (qui n'est pas un TS) avec vos données
               Arr = .Value2                 'lire vers une matrice
               iOffset = .Row - 1            'ligne de l'entête
               .Columns(COL_BENEVOLE).Name = NOM_PLAGE_BENEVOLE     'plage nommée des benevoles
               .Columns(COL_DEBUT).Name = NOM_PLAGE_DEBUT           'plage nommée du début
               .Columns(COL_FIN).Name = NOM_PLAGE_FIN               'plage nommée du Fin
               .Columns(COL_RESULTAT).Name = NOM_PLAGE_RESULTAT     'plage nommée pour les résultats
               .EntireRow.AutoFit
          End With
     End With

     N1 = UBound(Arr)                        'nombre de lignes
     N2 = UBound(Arr, 2)                     'nombre de colonnes
     ReDim aResultat(1 To N1, 0)             'préparer matrice pour le résultat

     For i = 1 To N1                         'boucler les lignes
          sNom = Arr(i, COL_BENEVOLE)             'nom du bénévole
          If Len(sNom) > 0 Then              'n'est pas vide
               If TypeName(aNoms) = "Empty" Then     'encore aucun nom connu
                    b = True                 'nouveau nom
                    ReDim aNoms(0): aNoms(0) = sNom     'créer une matrice et coller noms dans position "0"
               Else
                    r = Application.IfError(Application.Match(sNom, aNoms, 0), 0)     'vérifier si ce nom existe dans la matrice "aNoms"
                    b = (r = 0)              'il n'existe pas encore
                    If b Then
                         j = UBound(aNoms) + 1     'nouveau Ubound
                         ReDim Preserve aNoms(j)     'redimensioner avec maintenance des données
                         aNoms(j) = sNom     'coller nouveau nom
                    End If
               End If

               If b Then                     'nouveau nom
                    N3 = WorksheetFunction.CountIf(Range(NOM_PLAGE_BENEVOLE), sNom)     'nombre de ce nom
                    Temp = Evaluate("if(" & NOM_PLAGE_BENEVOLE & "=" & Chr(34) & sNom & Chr(34) & ",hour(debut)*100+minute(debut)+row(debut)/1000,1e99)")     'savoir les numéro des lignes de ce nom dans une séquence ascendant du temps "debut"
                    ReDim Arr1(1 To N3, 1 To 7)     'préparer une matrice pour les données filtrées de ce nom
                    For i1 = 1 To N3
                         D(0) = WorksheetFunction.Small(Temp, i1)     'lai-ème plus petite valeur de "Temp"
                         D(1) = Int(D(0))    'la partie integer  = "hhmm", donc heure et minute en 4 chiffres
                         Ptr = (D(0) - D(1)) * 1000 - iOffset     'la partie décimale avec un décalage = ligne à partir de l'entête
                         Arr1(i1, 1) = Arr(Ptr, --COL_BENEVOLE)     'nom
                         Arr1(i1, 2) = Arr(Ptr, COL_LOCATION)     'location
                         Arr1(i1, 3) = Arr(Ptr, COL_DEBUT)     'debut
                         Arr1(i1, 4) = Arr(Ptr, COL_FIN) - (Arr(Ptr, COL_DEBUT) > Arr(Ptr, COL_FIN))     'fin (avec correction si on dépasse minuit
                         Arr1(i1, 5) = Arr(Ptr, COL_PLAGE)     'plage horaire
                         Arr1(i1, 6) = Ptr + iOffset     'ligne
                         Arr1(i1, 7) = Ptr
                    Next

                    For i1 = 1 To N3 - 1     'boucler les lignes
                         i2 = i1 + 1         'comparer avec le précédent et le suivant (s'il existe)
                         If Application.Min(Arr1(i1, 4), Arr(i2, 4)) > Application.Max(Arr1(i1, 3), Arr1(i2, 3)) Then     'il y a du chevauchement
                              b = (StrComp(Arr(i1, 2), Arr1(i2, 2), 1) <> 0) And (Arr1(i1, 3) = Arr1(i2, 3))     'location différente mais même début
                              s1 = Arr1(i1, 6) & " | " & Arr1(i2, 6) & " | "
                              s2 = IIf(b, "Bilocation | " & Arr1(i1, 2) & " | " & Arr1(i2, 2), "Chevauchement | " & Arr1(i1, 5) & " | " & Arr1(i2, 5))
                              aResultat(Arr1(i1, 7), 0) = aResultat(Arr1(i1, 7), 0) & IIf(Len(aResultat(Arr1(i1, 7), 0)) = 0, "", vbLf) & s1 & s2
                              aResultat(Arr1(i2, 7), 0) = aResultat(Arr1(i2, 7), 0) & IIf(Len(aResultat(Arr1(i2, 7), 0)) = 0, "", vbLf) & s1 & s2

                              If TypeName(aOut) = "Empty" Then
                                   N3 = 1: ReDim aOut(1 To 5, 1 To 1)
                              Else
                                   N3 = UBound(aOut, 2) + 1: ReDim Preserve aOut(1 To UBound(aOut), 1 To N3)
                              End If

                              aOut(1, N3) = sNom     'nom
                              aOut(2, N3) = Arr1(i1, 6) & " vs " & Arr1(i2, 6)     'ligne
                              sp = Split(s2, " | ")
                              aOut(3, N3) = sp(0)
                              aOut(4, N3) = sp(1)
                              aOut(5, N3) = sp(2)
                         End If
                    Next
               End If
          End If
     Next
    
Tim2 = Timer
     With Range(NOM_PLAGE_RESULTAT)
          .Value = aResultat
          .EntireColumn.AutoFit
     End With

     If TypeName(aOut) = "Empty" Then N3 = 0 Else N3 = UBound(aOut, 2)
     With Range("Tabel2").ListObject
          If N3 > 0 Then
               If .ListRows.Count = 0 Then .ListRows.Add
               .DataBodyRange.Resize(N3).Value = Application.Transpose(aOut)
          End If
          If .ListRows.Count > N3 Then .DataBodyRange.Offset(N3).Resize(.ListRows.Count - N3).Delete
          With .Range
               If N3 > 1 Then .Sort .Range("A1"), xlAscending, Header:=xlYes
               .EntireColumn.AutoFit
               .EntireRow.AutoFit
          End With
     End With
    
     Application.ScreenUpdating = True

     MsgBox "prêt en " & Format(Timer - Tim1, "0.000 \s") & vbLf & "dont " & Format(Tim2 - Tim1, "0.000 \s") & " pour la calculation"
End Sub
 
Le Forum,
Bsalv, Crocrocro, c'est quasi parfait pour moi.
Dernière question avec ce rectificatif du fichier #26, ici joint :

En ligne 167 et entre colonne 7 et colonne 88, dans PANORAMIQUE, j'ai placé par formule la lettre de colonne.
Dans la feuille BDD, quelles lignes vba ajouter pour placer cette lettre en colonne ColPAN ?

J'ai essayé avec quelques codes supplémentaires vba que vous y trouverez, mais en vain.
Webperegrino
 
Dernière édition:
Avec quelques petis ajustements dans les macros pour "depivoter" et "chevauchement",le voilà.
Mais il faut lancer les 2 macros quand vous modifiez quelque chose dans cette ligne 167 avant que vous pouvez voir le résultat.
 

Pièces jointes

Le Forum,
Merci, Bsalv, pour la réponse #28 : le fichier rectifié correspond maintenant à mes attentes.
C'est parfait : j'aurai mis trois ans pour trouver mes erreurs...
Il ne me reste plus qu'à appliquer tout cela dans mon vrai fichier 'dinosaure de 10 Mo' ; "Ça devrait aller".
Je vous remercie beaucoup, TootFatBoy, Sylvanu, Crocrocro et vous Bsalv, pour votre patience.
Vive la famille de Excel-downloads.com !
Webperegrino
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
2
Affichages
384
Réponses
1
Affichages
358
Retour