CHAT GPT m'a fournit un code VBA qui correspond à ce que je souhaite. Le voici :
Sub GenererListePaiements()
Dim ws As Worksheet
Dim wsResult As Worksheet
Dim lastRow As Long, lastCol As Long
Dim i As Long, j As Long, k As Long
Dim facture As String
Dim paymentList() As Variant
Dim countPayments As Long
Dim temp As Variant
' Définir la feuille source
Set ws = ThisWorkbook.Sheets("FACTURES ET CALENDRIER") ' Vérifie bien le nom exact de la feuille
' Trouver la dernière ligne et la dernière colonne
lastRow = ws.Cells(ws.Rows.Count, 2).End(xlUp).Row ' Dernière ligne de la colonne B
lastCol = ws.Cells(2, ws.Columns.Count).End(xlToLeft).Column ' Dernière colonne de la ligne 2
' Effacer l'ancienne liste et créer une nouvelle feuille
On Error Resume Next
Application.DisplayAlerts = False
Sheets("Liste Paiements").Delete
Application.DisplayAlerts = True
On Error GoTo 0
Set wsResult = ThisWorkbook.Sheets.Add
wsResult.Name = "Liste Paiements"
' En-têtes de colonnes
wsResult.Cells(1, 1).Value = "N° FACTURE"
wsResult.Cells(1, 2).Value = "DATE LIMITE"
wsResult.Cells(1, 3).Value = "TYPE"
wsResult.Cells(1, 4).Value = "MONTANT"
' Initialisation du tableau
ReDim paymentList(1 To (lastRow - 4) * (lastCol \ 2), 1 To 4)
countPayments = 0
' Parcours des factures
For i = 5 To lastRow
facture = ws.Cells(i, 2).Value ' Numéro de facture
' Vérifier chaque colonne de paiement (C, E, G, ...)
For j = 3 To lastCol Step 2
If ws.Cells(i, j).Value <> "" And IsDate(ws.Cells(i, j).Value) Then
countPayments = countPayments + 1
paymentList(countPayments, 1) = facture
paymentList(countPayments, 2) = CDate(ws.Cells(i, j).Value) ' Conversion en date
paymentList(countPayments, 3) = ws.Cells(2, j).Value ' Type
paymentList(countPayments, 4) = ws.Cells(i, j + 1).Value ' Montant
End If
Next j
Next i
' Trier les paiements par date
For i = 1 To countPayments - 1
For j = i + 1 To countPayments
If paymentList(i, 2) > paymentList(j, 2) Then
For k = 1 To 4
temp = paymentList(i, k)
paymentList(i, k) = paymentList(j, k)
paymentList(j, k) = temp
Next k
End If
Next j
Next i
' Insérer les données triées
For i = 1 To countPayments
wsResult.Cells(i + 1, 1).Value = paymentList(i, 1)
wsResult.Cells(i + 1, 2).Value = paymentList(i, 2)
wsResult.Cells(i + 1, 3).Value = paymentList(i, 3)
wsResult.Cells(i + 1, 4).Value = paymentList(i, 4)
Next i
' Mise en forme
wsResult.Columns("A:D").AutoFit
MsgBox "La liste des paiements a été générée avec succès !", vbInformation
End Sub