J'ai repris ton code pour détecter les erreurs. Celles-ci ont été mises dans une ListBox (ListBoxErreurs) à 3 colonnes (0, 1, 2) dans le Userform (ListBoxErreurs). Comme les enregistrements sont dans le désordre dans la ListBox, j'ai utilisé la procédure QuickOrdre créée par Jacques BOISGONTIER pour trier les données récupérées.
Option Explicit
Public ShData As Worksheet
Public MatriceErreurs() As Variant
Sub ListerLesErreurs()
Dim Ligne As Byte, Colonne As Byte
Dim NbErreurs As Integer, IndexListe As Integer
Dim Madate As String, STDxxxx As String, Erreurs As String
Set ShData = Sheets("Data")
With ShData
NbErreurs = 0
IndexListe = 0
For Colonne = 105 To 213
Madate = .Cells(49, Colonne).Value
For Ligne = 2 To 48
STDxxxx = .Cells(Ligne, 1).Value
'Comparaison des dates entre "Madate" et toute les dates de la même colonne
'Si "Madate" < à une des lignes de la même colonne alors on utilise la variable "Erreur"
If Madate < .Cells(Ligne, Colonne).Value Then
With Usf_Erreurs
With .ListBoxErreurs
.AddItem
.List(IndexListe, 0) = STDxxxx
.List(IndexListe, 1) = Ligne
.List(IndexListe, 2) = "Révisé après le " & ShData.Cells(1, Colonne).Value
IndexListe = IndexListe + 1
End With
NbErreurs = NbErreurs + 1
End With
Exit For
End If
Next Ligne
Next Colonne
If NbErreurs > 0 Then
With Usf_Erreurs
.ListBoxTitre.AddItem
.ListBoxTitre.Column = Array("STD", "Ligne", "Erreur")
MatriceErreurs = .ListBoxErreurs.List
QuickOrdre MatriceErreurs(), LBound(MatriceErreurs), UBound(MatriceErreurs), 1, True
.ListBoxErreurs.List = MatriceErreurs
.Show
End With
End If
End With
Set ShData = Nothing
End Sub
Dans le Userform, un clic sur la ListBox permet de se positionner sur la ligne choisie dans le tableau :
Dans la ligne de commande, Me.ListBoxErreurs.List(, 1) correspond à la ligne en cours dans la ListBox et à la colonne 2 car on décompte les colonnes et les lignes à partir de 0 pour cet objet.
Private Sub ListBoxErreurs_Click()
Application.Goto ShData.Cells(Me.ListBoxErreurs.List(, 1), 1), True
End Sub