Sub Analyse()
'Si déclaration tardive
     Dim RgEx As Object
     Dim DuAu As Object, Le As Object, Et As Object, Match As Object
'Si "Microsoft VBScript Regular Expressions 5.5" mise en référence
     'Dim RgEx As New VBScript_RegExp_55.RegExp
     'Dim DuAu As VBScript_RegExp_55.MatchCollection, Le As VBScript_RegExp_55.MatchCollection, Et As VBScript_RegExp_55.MatchCollection
     'Dim Match As VBScript_RegExp_55.Match
     Dim Lecture, TbItem(), TbRésultat()
     Dim Chaîne As String, Réf As String, lgn As Long, NbMatches As Integer, i As Integer, k As Long
     Dim Wsh As Worksheet
    
     'Si déclaration tardive
     Set RgEx = CreateObject("VBScript.RegExp")
    
     With RgEx
          .IgnoreCase = True
          .Global = True
          .IgnoreCase = True
          .MultiLine = False
     End With
    
     'Désignation de la feulle à traiter
     On Error Resume Next
     Set Wsh = Application.InputBox(prompt:="Désignez une cellule de la feuille à traiter", Title:="ANALYSE DES PÉRIODES", Type:=8).Parent
     On Error GoTo 0
     If Wsh Is Nothing Then Exit Sub
    
     'Lecture des données dans un Tableau
     With Wsh
          Lecture = .[a1].CurrentRegion.Value
     End With
    
     k = 0
     'Parcourt de toutes les lignes du tableau
     For lgn = 1 To UBound(Lecture, 1)
         
          Réf = Lecture(lgn, 1)        'la référence
          Chaîne = Lecture(lgn, 2)     'la chaîne de date
    
          RgEx.Pattern = "(du \d{2}-\d{2}-\d{2} au \d{2}-\d{2}-\d{2})"   'les dates "du ...  au ..."
          Set DuAu = RgEx.Execute(Chaîne)
         
          RgEx.Pattern = "le (\d{2}-\d{2}-\d{2})"                        'les dates "le ..."
          Set Le = RgEx.Execute(Chaîne)
         
          RgEx.Pattern = "et (\d{2}-\d{2}-\d{2})"                        'les dates "et ..."
          Set Et = RgEx.Execute(Chaîne)
         
          NbMatches = DuAu.Count + Le.Count + Et.Count                   'comptage des dates trouvées
         
          If NbMatches > 0 Then
               'Stockage des périodes et de leur position dans la chaîne dans TbItem
               ReDim TbItem(1 To NbMatches, 1 To 2)
               i = 1
               For Each Match In DuAu
                    TbItem(i, 1) = Match.FirstIndex: TbItem(i, 2) = Match.Value
                    i = i + 1
               Next
                For Each Match In Le
                    TbItem(i, 1) = Match.FirstIndex: TbItem(i, 2) = Replace(LCase(Match.Value), "le ", "")
                    i = i + 1
               Next
               For Each Match In Et
                    TbItem(i, 1) = Match.FirstIndex: TbItem(i, 2) = Replace(LCase(Match.Value), "et ", "")
                    i = i + 1
               Next
               'Tri dans l'ordre des positions dans la chaîne
               tri TbItem, 1, UBound(TbItem, 1)
              
               'Stokage dans le tableau de résultat
               k = k + NbMatches
               ReDim Preserve TbRésultat(1 To 2, 1 To k)
               For i = (NbMatches - 1) To 0 Step -1
                    TbRésultat(1, k - i) = Réf:  TbRésultat(2, k - i) = TbItem(NbMatches - i, 2)
               Next
          End If
         
     Next
    
     'Transposition (si fichier trop grand pour WorksheetFunction.TRANSPOSE)
     ReDim Trans(1 To k, 1 To 2)
     For i = 1 To k
          Trans(i, 1) = TbRésultat(1, i): Trans(i, 2) = TbRésultat(2, i)
     Next
    
     'Ecriture dans une nouvelle feuille
     With Worksheets.Add(After:=Wsh)
          .[a1].Resize(k, 2).Value = Trans
          .Columns("A:B").EntireColumn.AutoFit
     End With
    
End Sub