Option Explicit

Private Const CODEPAGE_1252 As Integer = 1252

' Rapport d'erreurs global
Dim sortedReport As String

' Variables globales pour stocker les erreurs
Dim contributorInitialsErrors As String
Dim dateErrors As String
Dim dateFormatErrors As String
Dim dateFormatPersonErrors As String
Dim dateProductionFormatErrors As String
Dim duplicateDataErrors As String
Dim duplicateIdErrors As String
Dim editeurImprimeurErrors As String
Dim fileNotFoundErrors As String
Dim formatErrors As String
Dim formattingErrors As String
Dim hyphensErrors As String
Dim idReferenceErrors As String
Dim missingIDErrors As String
Dim misspelledErrors As String
Dim multipleIDFormatErrors As String
Dim nameExistsErrors As String
Dim nameFormatErrors As String
Dim nameMatchingErrors As String
Dim numericErrors As String
Dim periodValidationErrors As String
Dim prefixErrors As String
Dim restrictedValueErrors As String
Dim reverseErrors As String
Dim spaceErrors As String
Dim urlErrors As String
Dim valueValidationErrors As String
Dim yearFormatErrors As String
Dim identifiantComment As String
Dim locationDateErrors As String
Dim eventDateErrors As String
Dim colPositionErrors As String, extraColumnErrors As String
Dim capitalizationErrors As String, mispelledColumnErrors As String
Dim linebreakErrors As String, correspondenceErrors As String
Dim extraSpacesErrors As String
Dim columnErrorReport As String

Function GenerateSortedColumnErrorReport() As String
    If mispelledColumnErrors <> "" Then columnErrorReport = columnErrorReport & "Colonnes mal orthographiées :" & vbCrLf & mispelledColumnErrors & vbCrLf
    If capitalizationErrors <> "" Then columnErrorReport = columnErrorReport & "Erreurs de majuscule/minuscule :" & vbCrLf & capitalizationErrors & vbCrLf
    If extraColumnErrors <> "" Then columnErrorReport = columnErrorReport & "Colonnes supplémentaires :" & vbCrLf & extraColumnErrors & vbCrLf
    If linebreakErrors <> "" Then columnErrorReport = columnErrorReport & "Erreurs de sauts de ligne :" & vbCrLf & linebreakErrors & vbCrLf
    If colPositionErrors <> "" Then columnErrorReport = columnErrorReport & "Colonnes à ajouter :" & vbCrLf & colPositionErrors & vbCrLf
    If extraSpacesErrors <> "" Then columnErrorReport = columnErrorReport & "Colonnes avec des espaces en trop :" & vbCrLf & extraSpacesErrors & vbCrLf
    If correspondenceErrors <> "" Then columnErrorReport = columnErrorReport & "Mauvaise correspondance :" & vbCrLf & correspondenceErrors & vbCrLf

    GenerateSortedColumnErrorReport = columnErrorReport
End Function

Sub ValidateAllSheets()
    Dim wbModel     As Workbook
    Dim wbData      As Workbook
    Dim wsData      As Worksheet
    Dim wsModel     As Worksheet
    Dim sheetName   As String
    Dim dataFile    As Variant
    Dim columnsValid As Boolean
    Dim reportFilePath As String
    
    dataFile = Application.GetOpenFilename("Excel Files (*.xlsx), *.xlsx", , "Sélectionnez le fichier de données")
    If dataFile = False Or dataFile = "" Then Exit Sub

    Set wbModel = ThisWorkbook
    Set wbData = Workbooks.Open(dataFile)

    ' Initialisation du rapport d'erreur des colonnes
    columnErrorReport = "Rapport de validation des données :" & vbCrLf & vbCrLf
    columnsValid = True

    ' Boucle sur chaque feuille du fichier de données pour valider les colonnes
    For Each wsData In wbData.Sheets
        sheetName = wsData.Name
        On Error Resume Next
        Set wsModel = wbModel.Sheets(sheetName)
        On Error GoTo 0

        If Not wsModel Is Nothing Then
            ' Validation des colonnes dans la feuille courante par rapport au modèle
            If Not ValidateColumnsWithReport(wsData, wsModel) Then columnsValid = False
        Else
            ' Enregistre les erreurs pour les feuilles manquantes
            columnErrorReport = columnErrorReport & "Aucune feuille correspondante trouvée dans le fichier modèle pour '" & sheetName & "'." & vbCrLf
            columnsValid = False
        End If
    Next wsData

    ' Génération du rapport d'erreur après validation de toutes les feuilles
    columnErrorReport = GenerateSortedColumnErrorReport()

    ' Sauvegarde du rapport en cas d'erreurs
    If Not columnsValid Then
        reportFilePath = ThisWorkbook.Path & "\" & Left(ThisWorkbook.Name, InStrRev(ThisWorkbook.Name, ".") - 1) & "_rapport_erreur.txt"
        Open reportFilePath For Output As #1
        Print #1, columnErrorReport
        Close #1
        MsgBox "Le rapport d'erreurs a été généré : " & reportFilePath, vbInformation
    End If
End Sub


