Sub Extraction()
Dim DL&, tablo, a(), i&, n&, sejour As Range, x$, y As Variant, s, ub%, hTVA As Variant, b, ii&, jj%, j%
With Sheets("FACTURES")
DL = .Cells(.Rows.Count, 1).End(xlUp).Row 'dernière ligne
tablo = .Range("A1:A" & DL + 1) 'matrice, plus rapide, au moins 2 éléments
ReDim a(1 To DL, 1 To 7)
For i = 1 To DL
If UCase(Left(tablo(i, 1), 6)) = "SEJOUR" Then
n = n + 1
Set sejour = .Cells(i, 1)
x = tablo(i, 1) & "/"
a(n, 1) = Trim(Mid(x, 9, InStr(x, "/") - 9)) 'nom
x = "/ CHB"
y = Application.HLookup("*" & x & "*", sejour.EntireRow, 1, 0)
If Not IsError(y) Then a(n, 2) = Mid(y, InStr(y, x) + 2) 'chambre
x = Replace(Replace(UCase(sejour(4)), ".", "/"), "DU", "")
s = Split(x, "AU"): ub = UBound(s)
If ub > -1 Then If IsDate(s(0)) Then a(n, 3) = CDate(s(0)) 'date arrivée
If ub > 0 Then If IsDate(s(1)) Then a(n, 4) = CDate(s(1)) 'date départ
x = sejour(2)
a(n, 5) = Trim(Mid(x, InStr(x, ":") + 1)) 'facture n°
hTVA = Application.Match("*TVA*", sejour(5, 2).Resize(DL - sejour(4).Row), 0) 'pour limiter les recherches
If IsNumeric(hTVA) Then
b = sejour(5, 2).Resize(hTVA - 1, 5) 'matrice, plus rapide, colonnes B à F
For ii = 1 To UBound(b)
For jj = 4 To 5
If b(ii, jj) < 0 Then
If a(n, 6) Then
For j = 1 To 5: a(n + 1, j) = a(n, j): Next j 'copie la ligne sur la suivante
n = n + 1
End If
a(n, 6) = b(ii, jj) 'montant < 0
a(n, 7) = b(ii, 1) 'mode de paiement
End If
Next jj, ii
End If
End If
Next i
End With
'---restitution---
With Sheets("Résultat").[A2] '1ère cellule de destination
If n Then .Resize(n, 7) = a
.Offset(n).Resize(.Parent.Rows.Count - n - .Row + 1, 7).ClearContents 'RAZ en dessous
End With
MsgBox "Extraction terminée"
End Sub