Malicious Office (OLE) / .XLS — malware analysis report

Static analysis result for SHA-256 5b14bbd82ce10c2d…

MALICIOUS

Office (OLE) / .XLS

871.5 KB Created: 2006-11-29 14:10:37 Authoring application: Microsoft Excel First seen: 2026-05-10
MD5: 896bf2f4243b8c42c62d4f0580b24835 SHA-1: f571aecb667f44101e0b0d68536886b4c0383e9f SHA-256: 5b14bbd82ce10c2d692f072c1bd9d1a579558721efeb3bc8f08fa7b043091e65
122 Risk Score

Malware Insights

MITRE ATT&CK
T1059.005 Visual Basic T1547.001 Registry Run Keys / Startup Folder

The file is an Excel spreadsheet containing a large VBA macro. Heuristics indicate the macro is capable of self-replication and AV tampering. The macro's code, though truncated, shows functions for managing toolbars and potentially establishing persistence via registry keys. The presence of a benign URL does not detract from the malicious nature indicated by the macro's behavior.

Heuristics 4

  • VBA macros detected medium 2 related findings OLE_VBA_MACROS
    Document contains VBA macro code
  • VBA macro-virus self-replication / AV tampering critical OLE_VBA_MACRO_VIRUS_REPLICATION
    VBA macro programmatically rewrites VBA project code through the VBE object model (CodeModule/VBComponents InsertLines/DeleteLines/AddFromString or OrganizerCopy) to copy itself into the global template and other open documents, and/or disables Office macro-virus protection (Options.VirusProtection = False). This is the defining behavior of the W97M document macro-virus family — self-replicating code with no benign document use, independent of any AV signature.
    Matched line in script
                .DeleteLines StartLine:=1, Count:=.CountOfLines
  • CreateObject call high OLE_VBA_CREATEOBJ
    CreateObject call
    Matched line in script
        Set c_dicEditionSiteProduction = CreateObject("Scripting.Dictionary")
  • Embedded URL info EMBEDDED_URL
    One or more URLs were extracted from the document. The URL itself is not a detection — see the per-URL labels for which channel (macro, JS, link annotation, document body, ...) reached each URL.
    URL http://activex.microsoft.com/controls/vb6/mscomct2.cab In document text (OLE body)

Extracted artifacts 1

Files carved from inside the sample during analysis.

FilenameKindSourceSize
macros.bas vba-macro oletools.olevba.extract_macros (decoded VBA source) 113241 bytes
SHA-256: 11a61e7e715369dfd4b2ec206123c1d113057f5a3f2e90a81cacbc3c35a129e8
Preview script
First 1,000 lines of the extracted script
Attribute VB_Name = "Feuil2"
Attribute VB_Base = "0{00020820-0000-0000-C000-000000000046}"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = True
Attribute VB_TemplateDerived = False
Attribute VB_Customizable = True

Attribute VB_Name = "ThisWorkbook"
Attribute VB_Base = "0{00020819-0000-0000-C000-000000000046}"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = True
Attribute VB_TemplateDerived = False
Attribute VB_Customizable = True
' ================================================================================================================
' Suppression barre d'outil à la fermeture du classeur
' ================================================================================================================
Private Sub Workbook_BeforeClose(Cancel As Boolean)
        SupprimerBarreOutils (STR_NOM_BARRE)
End Sub

' ================================================================================================================
' Création de la barre d'outil à l'activation du classeur
' ================================================================================================================
Private Sub Workbook_WindowActivate(ByVal Wn As Window)
    ' Affichage de la barre d'outil propre au classeur
    AfficherBarreOutil
End Sub

' ================================================================================================================
' Suppression barre d'outil à la désactivation du classeur
' ================================================================================================================
Private Sub Workbook_WindowDeactivate(ByVal Wn As Window)
    ' Suppression de la barre d'outil
    SupprimerBarreOutils (STR_NOM_BARRE)
End Sub


Attribute VB_Name = "Feuil1"
Attribute VB_Base = "0{00020820-0000-0000-C000-000000000046}"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = True
Attribute VB_TemplateDerived = False
Attribute VB_Customizable = True

Attribute VB_Name = "Feuil3"
Attribute VB_Base = "0{00020820-0000-0000-C000-000000000046}"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = True
Attribute VB_TemplateDerived = False
Attribute VB_Customizable = True

Attribute VB_Name = "Feuil4"
Attribute VB_Base = "0{00020820-0000-0000-C000-000000000046}"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = True
Attribute VB_TemplateDerived = False
Attribute VB_Customizable = True

Attribute VB_Name = "ReportingDetail"
Attribute VB_Base = "0{FCFB3D2A-A0FA-1068-A738-08002B3371B5}"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Attribute VB_TemplateDerived = False
Attribute VB_Customizable = False
'## Maj TFA 2009

Option Explicit

' Maille Reporting
' 1) Reseau
' 2) Gamme
' 3) Produit

Private c_strReseau As String
Private c_strGamme As String
Private c_strProduit As String
Private c_strCodeFiliere As String

Private c_vntDepotFinPrevu As Variant           ' Remise en poste - Date de fin prévue (initiale)(Synthèse: COL_DepotFinPrevu)
Private c_blnDepotFinPrevuOK As Boolean

Private c_vntDepotDebutReel As Variant          ' Remise en poste - Date début réelle (Synthèse: COL_DepotDebutReel)
Private c_vntDepotFinReel As Variant            ' Remise en poste - Date fin (Synthèse: COL_DepotFinReel)
Private c_blnDepotFinReelOK As Boolean

Private c_lngNbPagesEstime As Long             ' Edition - volume estimé (Synthèse: COL_NbEditionEstime)
Private c_lngNbPagesAttendu As Long             ' Edition - volume attendu (Synthèse: COL_NbEditionAttendu)
Private c_lngEditionNbPagesRealise As Long      ' Edition - volume réalisé (Synthèse: COL_NbEditionRealise)
Private c_lngNbPlisEstime As Long               ' Mise sous plis - Nb plis attendu (Synthèse: COL_NbPlisEstime)
Private c_lngNbPlisAttendu As Long              ' Mise sous plis - Nb plis attendu (Synthèse: COL_NbPlisAttendu)
Private c_lngPlisNbPlisRealise As Long          ' Mise sous plis - Nb Plis réel (Synthèse: COL_PlisNbPlisRealise)
Private c_lngDepotNbPlisReel As Long            ' Remise en poste - Nb plis remis en poste (réel) (Synthèse: COL_DepotNbPlisReel)

Private c_dblAvancementEdition As Double
Private c_dblAvancementMiseSousPlis As Double
Private c_dblAvancementRemisePoste As Double

Private c_blnIsEstimation As Boolean            ' Indicateur de calcul avec les volumes estimés
Private c_blnIsReliquats As Boolean             ' Indicateur de présence de reliquats


' === Reseau        (LET/GET)

Property Let Reseau(Valeur As String)
    c_strReseau = Valeur
End Property

Property Get Reseau() As String
    Reseau = c_strReseau
End Property

' === Gamme        (LET/GET)

Property Let Gamme(Valeur As String)
    c_strGamme = Valeur
End Property

Property Get Gamme() As String
    Gamme = c_strGamme
End Property

' === Produit        (LET/GET)

Property Let Produit(Valeur As String)
    c_strProduit = Valeur
End Property

Property Get Produit() As String
    Produit = c_strProduit
End Property

' === Code Filière        (LET/GET)

Property Let CodeFiliere(Valeur As String)
    c_strCodeFiliere = Valeur
    
    CorrigerVolumetrie
End Property

Property Get CodeFiliere() As String
    CodeFiliere = c_strCodeFiliere
End Property

' === Remise en poste - Date de fin prévue           (LET/GET)

Property Let DepotFinPrevu(Valeur As Variant)
    ' Alimentée lorsque toutes les dates de fin sont renseignées pour les mailles de suivi.
    ' Elle correspond à la plus grande des dates de fin des mailles de suivi.
    If IsDate(Valeur) Then
        If c_vntDepotFinPrevu = Empty Then
            c_vntDepotFinPrevu = Valeur
        Else
            If c_vntDepotFinPrevu < Valeur Then
                c_vntDepotFinPrevu = Valeur
            End If
        End If
    Else
        Me.DepotFinPrevuOK = False
    End If
End Property

Property Get DepotFinPrevu() As Variant
    If c_blnDepotFinPrevuOK And c_vntDepotFinPrevu <> Empty Then
        ' Toutes les dates de fin sont renseignées
        DepotFinPrevu = c_vntDepotFinPrevu
    Else
        DepotFinPrevu = Empty
    End If
End Property

' === Remise en poste - Indicateur Date de fin prévue renseignée           (LET/GET)
Property Let DepotFinPrevuOK(Indicateur As Boolean)
    c_blnDepotFinPrevuOK = Indicateur
End Property

Property Get DepotFinPrevuOK() As Boolean
    DepotFinPrevuOK = c_blnDepotFinPrevuOK
End Property

' === Remise en poste - Date de début réelle          (LET/GET)

Property Let DepotDebutReel(Valeur As Variant)
    ' Alimentée lorsqu'au moins une date de début est renseignée pour une maille de suivi.
    ' Elle correspond à la plus petite des dates de début des mailles de suivi.
    If IsDate(Valeur) Then
        If c_vntDepotDebutReel = Empty Then
            c_vntDepotDebutReel = Valeur
        Else
            If Valeur < c_vntDepotDebutReel Then
                c_vntDepotDebutReel = Valeur
            End If
        End If
    End If
End Property

Property Get DepotDebutReel() As Variant
    If c_vntDepotDebutReel = Empty Then
        DepotDebutReel = Empty
    Else
        DepotDebutReel = c_vntDepotDebutReel
    End If
End Property

' === Remise en poste - Date de fin réelle           (LET/GET)

Property Let DepotFinReel(Valeur As Variant)
    ' Alimentée lorsque toutes les dates de fin sont renseignées pour les mailles de suivi.
    ' Elle correspond à la plus grande des dates de fin des mailles de suivi.
    If IsDate(Valeur) Then
        If c_vntDepotFinReel = Empty Then
            c_vntDepotFinReel = Valeur
        Else
            If c_vntDepotFinReel < Valeur Then
                c_vntDepotFinReel = Valeur
            End If
        End If
    Else
        Me.DepotFinReelOK = False
    End If
End Property

Property Get DepotFinReel() As Variant
    If c_blnDepotFinReelOK And c_vntDepotFinReel <> Empty Then
        ' Toutes les dates de fin sont renseignées
        DepotFinReel = c_vntDepotFinReel
    Else
        DepotFinReel = Empty
    End If
End Property

' === Remise en poste - Indicateur Date de fin réelle renseignée           (LET/GET)
Property Let DepotFinReelOK(Indicateur As Boolean)
    c_blnDepotFinReelOK = Indicateur
End Property

Property Get DepotFinReelOK() As Boolean
    DepotFinReelOK = c_blnDepotFinReelOK
End Property

' === Nombre de pages estimé       (LET/GET / SET)

Property Let NbPagesEstime(Nombre As Long)
    c_lngNbPagesEstime = c_lngNbPagesEstime + Nombre
End Property

Property Get NbPagesEstime() As Long
    NbPagesEstime = c_lngNbPagesEstime
End Property

Sub SetNbPagesEstime(Nombre As Long)
    c_lngNbPagesEstime = Nombre
End Sub


' === Nombre de pages attendu       (LET/GET / SET)

Property Let NbPagesAttendu(Nombre As Long)
    c_lngNbPagesAttendu = c_lngNbPagesAttendu + Nombre
End Property

Property Get NbPagesAttendu() As Long
    NbPagesAttendu = c_lngNbPagesAttendu
End Property

Sub SetNbPagesAttendu(Nombre As Long)
    c_lngNbPagesAttendu = Nombre
End Sub

' === Edition - Nombre de pages réalisées       (LET/GET / SET)

Property Let EditionNbPagesRealise(Nombre As Long)
    c_lngEditionNbPagesRealise = c_lngEditionNbPagesRealise + Nombre
End Property

Property Get EditionNbPagesRealise() As Long
    EditionNbPagesRealise = c_lngEditionNbPagesRealise
End Property

Sub SetEditionNbPagesRealise(Nombre As Long)
    c_lngEditionNbPagesRealise = Nombre
End Sub

' === Nombre de plis estimé        (LET/GET / SET)

Property Let NbPlisEstime(Nombre As Long)
    c_lngNbPlisEstime = c_lngNbPlisEstime + Nombre
End Property

Property Get NbPlisEstime() As Long
    NbPlisEstime = c_lngNbPlisEstime
End Property

Sub SetNbPlisEstime(Nombre As Long)
    c_lngNbPlisEstime = Nombre
End Sub

' === Nombre de plis attendu        (LET/GET / SET)

Property Let NbPlisAttendu(Nombre As Long)
    c_lngNbPlisAttendu = c_lngNbPlisAttendu + Nombre
End Property

Property Get NbPlisAttendu() As Long
    NbPlisAttendu = c_lngNbPlisAttendu
End Property

Sub SetNbPlisAttendu(Nombre As Long)
    c_lngNbPlisAttendu = Nombre
End Sub

' === Mise sous plis - Nombre de plis réalisé             (LET/GET / SET)

Property Let PlisNbPlisRealise(Nombre As Long)
    c_lngPlisNbPlisRealise = c_lngPlisNbPlisRealise + Nombre
End Property

Property Get PlisNbPlisRealise() As Long
    PlisNbPlisRealise = c_lngPlisNbPlisRealise
End Property

Sub SetPlisNbPlisRealise(Nombre As Long)
    c_lngPlisNbPlisRealise = Nombre
End Sub

' === Remise en poste - Nombre de plis réel           (LET/GET / SET)

Property Let DepotNbPlisReel(Nombre As Long)
    c_lngDepotNbPlisReel = c_lngDepotNbPlisReel + Nombre
End Property

Property Get DepotNbPlisReel() As Long
    If Me.PlisNbPlisRealise < c_lngDepotNbPlisReel Then
        DepotNbPlisReel = Me.PlisNbPlisRealise
    Else
        DepotNbPlisReel = c_lngDepotNbPlisReel
    End If
End Property

Sub SetDepotNbPlisReel(Nombre As Long)
    c_lngDepotNbPlisReel = Nombre
End Sub

' === Pourcentage d'avancement de l'édition     (LET/GET)

Property Let AvancementEdition(Nombre As Double)
    c_dblAvancementEdition = Nombre
End Property

Property Get AvancementEdition() As Double
    AvancementEdition = c_dblAvancementEdition
End Property

' === Pourcentage d'avancement de la mise sous plis     (LET/GET)

Property Let AvancementMiseSousPlis(Nombre As Double)
    c_dblAvancementMiseSousPlis = Nombre
End Property

Property Get AvancementMiseSousPlis() As Double
    AvancementMiseSousPlis = c_dblAvancementMiseSousPlis
End Property

' === Pourcentage d'avancement de la remise en poste     (LET/GET)

Property Let AvancementRemisePoste(Nombre As Double)
    c_dblAvancementRemisePoste = Nombre
End Property

Property Get AvancementRemisePoste() As Double
    AvancementRemisePoste = c_dblAvancementRemisePoste
End Property

' === Calcul avec les volumes estimés     (LET/GET)

Property Let IsEstimation(Indicateur As Boolean)
    c_blnIsEstimation = Indicateur
End Property

Property Get IsEstimation() As Boolean
    IsEstimation = c_blnIsEstimation
End Property

' === Présence de reliquats     (LET/GET)

Property Let IsReliquats(Indicateur As Boolean)
    c_blnIsReliquats = Indicateur
End Property

Property Get IsReliquats() As Boolean
    IsReliquats = c_blnIsReliquats
End Property

' === Maille de reporting
Function GetMailleReporting() As String
    GetMailleReporting = Me.Reseau & Me.Gamme & Me.Produit
End Function


' === Nb de pages attendu ou estimé

Function GetNbPagesAttenduOuEstime() As Long
    If Me.IsEstimation Then
        GetNbPagesAttenduOuEstime = Me.NbPagesEstime
    Else
        GetNbPagesAttenduOuEstime = Me.NbPagesAttendu
    End If
End Function

' === Nb de plis attendu ou estimé

Function GetNbPlisAttenduOuEstime() As Long
    If Me.IsEstimation Then
        GetNbPlisAttenduOuEstime = Me.NbPlisEstime
    Else
        GetNbPlisAttenduOuEstime = Me.NbPlisAttendu
    End If
End Function


' === Calcul des pourcentages d'avancement

Sub CalculerAvancement()
    If Me.GetNbPagesAttenduOuEstime <> 0 Then
        Me.AvancementEdition = Me.EditionNbPagesRealise / Me.GetNbPagesAttenduOuEstime
    Else
        Me.AvancementEdition = 0
    End If
    If Me.GetNbPlisAttenduOuEstime <> 0 Then
        Me.AvancementMiseSousPlis = Me.PlisNbPlisRealise / Me.GetNbPlisAttenduOuEstime
    Else
        Me.AvancementMiseSousPlis = 0
    End If
    If Me.GetNbPlisAttenduOuEstime <> 0 Then
        Me.AvancementRemisePoste = Me.DepotNbPlisReel / Me.GetNbPlisAttenduOuEstime
    Else
        Me.AvancementRemisePoste = 0
    End If
End Sub

Sub AjouterDetail(Detail As ReportingDetail)

    Me.DepotFinPrevu = Detail.DepotFinPrevu
    Me.DepotDebutReel = Detail.DepotDebutReel
    Me.DepotFinReel = Detail.DepotFinReel
    Me.NbPagesEstime = Detail.NbPagesEstime
    Me.NbPagesAttendu = Detail.NbPagesAttendu
    Me.EditionNbPagesRealise = Detail.EditionNbPagesRealise
    Me.NbPlisEstime = Detail.NbPlisEstime
    Me.NbPlisAttendu = Detail.NbPlisAttendu
    Me.PlisNbPlisRealise = Detail.PlisNbPlisRealise
    Me.DepotNbPlisReel = Detail.DepotNbPlisReel

End Sub

Private Sub CorrigerVolumetrie()
    If dicDonneesExternes.Exists(Me.CodeFiliere) Then
        If dicDonneesExternes(Me.CodeFiliere).VolumetriePrevue = "O" Then
            Me.IsEstimation = True
        Else
            Me.IsEstimation = False
        End If
        If dicDonneesExternes(Me.CodeFiliere).Reliquats = "O" Then
            Me.IsReliquats = True
        Else
            Me.IsReliquats = False
        End If
    End If
End Sub

Private Sub Class_Initialize()
    Me.DepotFinPrevuOK = True
    Me.DepotFinReelOK = True
    Me.IsEstimation = False
    Me.IsReliquats = False
End Sub


Attribute VB_Name = "SuiviConso"
Attribute VB_Base = "0{FCFB3D2A-A0FA-1068-A738-08002B3371B5}"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Attribute VB_TemplateDerived = False
Attribute VB_Customizable = False
Option Explicit

Private c_strChaine As String
Private c_strCodeFiliere As String
Private c_strVersion As String

Private c_datDateMaj As Date
Private c_vntPilDateHeureFluxDispo As Variant
Private c_vntFeuVertPDK As Variant
Private c_lngNbPagesAttendu As Long
Private c_lngNbPlisAttendu As Long
' Suivi de l'édition
Private c_dicEditionSiteProduction As Object
Private c_lngEditionNbPagesRealise As Long
Private c_vntEditionDebutPrevu As Variant
Private c_vntEditionDebutReel As Variant
Private c_vntEditionFinReel As Variant
Private c_blnEditionFinReelOK As Boolean
' Suivi de la mise sous plis
Private c_lngPlisNbPlisRealise As Long
Private c_vntPlisDebutPrevu As Variant
Private c_vntPlisDebutReel As Variant
Private c_vntPlisFinReel As Variant
Private c_blnPlisFinReelOK As Boolean
Private c_lngPlisBAC1NbAnnexes As Long
Private c_lngPlisBAC2NbAnnexes As Long
Private c_lngPlisBAC3NbAnnexes As Long
Private c_lngPlisBAC4NbAnnexes As Long
Private c_dicPlisBAC1CodeAnnexe As Object
Private c_dicPlisBAC2CodeAnnexe As Object
Private c_dicPlisBAC3CodeAnnexe As Object
Private c_dicPlisBAC4CodeAnnexe As Object
' Suivi de la remise en Depot
'## Maj TFA 2009
'Private c_lngDepotNbPlisRealise As Long
Private c_lngDepotNbPlisPrevu As Long
Private c_lngDepotNbPlisReel As Long
'## Fin Maj TFA 2009
Private c_vntDepotDebutPrevu As Variant     ' ## Maj TFA 2009
Private c_vntDepotFinPrevu As Variant
Private c_blnDepotFinPrevuOK As Boolean
Private c_vntDepotDebutReel As Variant
Private c_vntDepotFinReel As Variant
Private c_blnDepotFinReelOK As Boolean

Private c_blnIsAnnulationPartielle As Boolean    ' Au moins un fichier annulé
Private c_blnIsAnnulationComplete  As Boolean    ' Tous les fichiers annulés

' === Chaîne     (LET/GET)

Property Let Chaine(Valeur As String)
    c_strChaine = Valeur
End Property

Property Get Chaine() As String
    Chaine = c_strChaine
End Property

' === Code filière       (LET/GET)

Property Let CodeFiliere(Valeur As String)
    c_strCodeFiliere = Valeur
End Property

Property Get CodeFiliere() As String
    CodeFiliere = c_strCodeFiliere
End Property

' === Version       (LET/GET)

Property Let Version(Valeur As String)
    c_strVersion = Valeur
End Property

Property Get Version() As String
    Version = c_strVersion
End Property

' === Date de mise à jour           (LET/GET)

Property Let DateMaj(Valeur As Variant)
    If IsDate(Valeur) Then
        If c_datDateMaj = Empty Then
            c_datDateMaj = Valeur
        Else
            If c_datDateMaj < Valeur Then
                c_datDateMaj = Valeur
            End If
        End If
    End If
End Property

Property Get DateMaj() As Variant
    If c_datDateMaj = Empty Then
        DateMaj = Empty
    Else
        DateMaj = c_datDateMaj
    End If
End Property

' === Date M.A.D. du flux sur l'outil de pilotage             (LET/GET)

Property Let PilDateHeureFluxDispo(Valeur As Variant)
    ' Alimentée lorsqu'au moins une date de début est renseignée pour l'un des fichiers à consolider.
    ' Elle correspond à la plus petite des dates de début des fichiers à consolider
    If IsDate(Valeur) Then
        If c_vntPilDateHeureFluxDispo = Empty Then
            c_vntPilDateHeureFluxDispo = Valeur
        Else
            If Valeur < c_vntPilDateHeureFluxDispo Then
                c_vntPilDateHeureFluxDispo = Valeur
            End If
        End If
    End If
End Property

Property Get PilDateHeureFluxDispo() As Variant
    If c_vntPilDateHeureFluxDispo = Empty Then
        PilDateHeureFluxDispo = Empty
    Else
        PilDateHeureFluxDispo = c_vntPilDateHeureFluxDispo
    End If
End Property

' === Feu vert Predica pour la production             (LET/GET)

Property Let FeuVertPDK(Valeur As Variant)
    ' Alimentée lorsqu'au moins une date de début est renseignée pour l'un des fichiers à consolider.
    ' Elle correspond à la plus petite des dates de début des fichiers à consolider
    If IsDate(Valeur) Then
        If c_vntFeuVertPDK = Empty Then
            c_vntFeuVertPDK = Valeur
        Else
            If Valeur < c_vntFeuVertPDK Then
                c_vntFeuVertPDK = Valeur
            End If
        End If
    End If
End Property

Property Get FeuVertPDK() As Variant
    If c_vntFeuVertPDK = Empty Then
        FeuVertPDK = Empty
    Else
        FeuVertPDK = c_vntFeuVertPDK
    End If
End Property

' === Nombre de pages attendu       (LET/GET)

Property Let NbPagesAttendu(Nombre As Long)
    c_lngNbPagesAttendu = c_lngNbPagesAttendu + Nombre
End Property

Property Get NbPagesAttendu() As Long
    NbPagesAttendu = c_lngNbPagesAttendu
End Property

' === Nombre de plis attendu        (LET/GET)

Property Let NbPlisAttendu(Nombre As Long)
    c_lngNbPlisAttendu = c_lngNbPlisAttendu + Nombre
End Property

Property Get NbPlisAttendu() As Long
    NbPlisAttendu = c_lngNbPlisAttendu
End Property

' === Site d'édition                (SET/GET)

Sub SetEditionSiteProduction(Valeur As String)
    If Valeur <> Empty Then
        If Not (c_dicEditionSiteProduction.Exists(Valeur)) Then
            c_dicEditionSiteProduction.Add Item:=Valeur, Key:=Valeur
        End If
    End If
End Sub

Function GetEditionSiteProduction() As String
    Dim vntEditionSiteProductionTab As Variant
    Dim i As Integer
    
    GetEditionSiteProduction = Empty
    vntEditionSiteProductionTab = c_dicEditionSiteProduction.Keys

    If c_dicEditionSiteProduction.Count > 0 Then
        For i = 0 To c_dicEditionSiteProduction.Count - 1
            If i > 0 Then
                GetEditionSiteProduction = GetEditionSiteProduction & vbLf
            End If
            GetEditionSiteProduction = GetEditionSiteProduction & c_dicEditionSiteProduction(vntEditionSiteProductionTab(i))
        Next
    End If
End Function

' === Edition - Nombre de pages réalisées       (LET/GET)

Property Let EditionNbPagesRealise(Nombre As Long)
    c_lngEditionNbPagesRealise = c_lngEditionNbPagesRealise + Nombre
End Property

Property Get EditionNbPagesRealise() As Long
    EditionNbPagesRealise = c_lngEditionNbPagesRealise
End Property

' === Edition - Date de début prévu             (LET/GET)

Property Let EditionDebutPrevu(Valeur As Variant)
    ' Alimentée lorsqu'au moins une date de début est renseignée pour l'un des fichiers à consolider.
    ' Elle correspond à la plus petite des dates de début des fichiers à consolider
    If IsDate(Valeur) Then
        If c_vntEditionDebutPrevu = Empty Then
            c_vntEditionDebutPrevu = Valeur
        Else
            If Valeur < c_vntEditionDebutPrevu Then
                c_vntEditionDebutPrevu = Valeur
            End If
        End If
    End If
End Property

Property Get EditionDebutPrevu() As Variant
    If c_vntEditionDebutPrevu = Empty Then
        EditionDebutPrevu = Empty
    Else
        EditionDebutPrevu = c_vntEditionDebutPrevu
    End If
End Property

' === Edition - Date de début réelle            (LET/GET)

Property Let EditionDebutReel(Valeur As Variant)
    ' Alimentée lorsqu'au moins une date de début est renseignée pour l'un des fichiers à consolider.
    ' Elle correspond à la plus petite des dates de début des fichiers à consolider
    If IsDate(Valeur) Then
        If c_vntEditionDebutReel = Empty Then
            c_vntEditionDebutReel = Valeur
        Else
            If Valeur < c_vntEditionDebutReel Then
                c_vntEditionDebutReel = Valeur
            End If
        End If
    End If
End Property

Property Get EditionDebutReel() As Variant
    If c_vntEditionDebutReel = Empty Then
        EditionDebutReel = Empty
    Else
        EditionDebutReel = c_vntEditionDebutReel
    End If
End Property

' === Edition - Date de fin             (LET/GET)

Property Let EditionFinReel(Valeur As Variant)
    ' Alimentée lorsque toutes les dates de fin sont renseignées pour les fichiers à consolider.
    ' Elle correspond à la plus grande des dates de fin des fichiers à consolider.
    If IsDate(Valeur) Then
        If c_vntEditionFinReel = Empty Then
            c_vntEditionFinReel = Valeur
        Else
            If c_vntEditionFinReel < Valeur Then
                c_vntEditionFinReel = Valeur
            End If
        End If
    Else
        c_blnEditionFinReelOK = False
    End If
End Property

Property Get EditionFinReel() As Variant
    If c_blnEditionFinReelOK And c_vntEditionFinReel <> Empty And Me.EditionNbPagesRealise = Me.NbPagesAttendu Then
        ' Toutes les dates de fin sont renseignées et le volumé réalisé correspond au volume attendu
        EditionFinReel = c_vntEditionFinReel
    Else
        EditionFinReel = Empty
    End If
End Property

' === Mise sous plis - Nombre de plis réalisé             (LET/GET)

Property Let PlisNbPlisRealise(Nombre As Long)
    c_lngPlisNbPlisRealise = c_lngPlisNbPlisRealise + Nombre
End Property

Property Get PlisNbPlisRealise() As Long
    PlisNbPlisRealise = c_lngPlisNbPlisRealise
End Property

' === Mise sous plis - Date de début prévue            (LET/GET)

Property Let PlisDebutPrevu(Valeur As Variant)
    ' Alimentée lorsqu'au moins une date de début est renseignée pour l'un des fichiers à consolider.
    ' Elle correspond à la plus petite des dates de début des fichiers à consolider
    If IsDate(Valeur) Then
        If c_vntPlisDebutPrevu = Empty Then
            c_vntPlisDebutPrevu = Valeur
        Else
            If Valeur < c_vntPlisDebutPrevu Then
                c_vntPlisDebutPrevu = Valeur
            End If
        End If
    End If
End Property

Property Get PlisDebutPrevu() As Variant
    If c_vntPlisDebutPrevu = Empty Then
        PlisDebutPrevu = Empty
    Else
        PlisDebutPrevu = c_vntPlisDebutPrevu
    End If
End Property

' === Mise sous plis - Date de début réelle            (LET/GET)

Property Let PlisDebutReel(Valeur As Variant)
    ' Alimentée lorsqu'au moins une date de début est renseignée pour l'un des fichiers à consolider.
    ' Elle correspond à la plus petite des dates de début des fichiers à consolider
    If IsDate(Valeur) Then
        If c_vntPlisDebutReel = Empty Then
            c_vntPlisDebutReel = Valeur
        Else
            If Valeur < c_vntPlisDebutReel Then
                c_vntPlisDebutReel = Valeur
            End If
        End If
    End If
End Property

Property Get PlisDebutReel() As Variant
    If c_vntPlisDebutReel = Empty Then
        PlisDebutReel = Empty
    Else
        PlisDebutReel = c_vntPlisDebutReel
    End If
End Property

' === Mise sous plis - Date de fin            (LET/GET)

Property Let PlisFinReel(Valeur As Variant)
    ' Alimentée lorsque toutes les dates de fin sont renseignées pour les fichiers à consolider.
    ' Elle correspond à la plus grande des dates de fin des fichiers à consolider.
    If IsDate(Valeur) Then
        If c_vntPlisFinReel = Empty Then
            c_vntPlisFinReel = Valeur
        Else
            If c_vntPlisFinReel < Valeur Then
                c_vntPlisFinReel = Valeur
            End If
        End If
    Else
        c_blnPlisFinReelOK = False
    End If
End Property

Property Get PlisFinReel() As Variant
    If c_blnPlisFinReelOK And c_vntPlisFinReel <> Empty And Me.PlisNbPlisRealise = Me.NbPlisAttendu Then
        ' Toutes les dates de fin sont renseignées et le volumé réalisé correspond au volume attendu
        PlisFinReel = c_vntPlisFinReel
    Else
        PlisFinReel = Empty
    End If
End Property

' === Mise sous plis - BAC 1 Nombre d'annexes            (LET/GET)

Property Let PlisBAC1NbAnnexes(Nombre As Long)
    c_lngPlisBAC1NbAnnexes = c_lngPlisBAC1NbAnnexes + Nombre
End Property

Property Get PlisBAC1NbAnnexes() As Long
    PlisBAC1NbAnnexes = c_lngPlisBAC1NbAnnexes
End Property

' === Mise sous plis - BAC 2 Nombre d'annexes            (LET/GET)

Property Let PlisBAC2NbAnnexes(Nombre As Long)
    c_lngPlisBAC2NbAnnexes = c_lngPlisBAC2NbAnnexes + Nombre
End Property

Property Get PlisBAC2NbAnnexes() As Long
    PlisBAC2NbAnnexes = c_lngPlisBAC2NbAnnexes
End Property

' === Mise sous plis - BAC 3 Nombre d'annexes            (LET/GET)

Property Let PlisBAC3NbAnnexes(Nombre As Long)
    c_lngPlisBAC3NbAnnexes = c_lngPlisBAC3NbAnnexes + Nombre
End Property

Property Get PlisBAC3NbAnnexes() As Long
    PlisBAC3NbAnnexes = c_lngPlisBAC3NbAnnexes
End Property

' === Mise sous plis - BAC 4 Nombre d'annexes            (LET/GET)

Property Let PlisBAC4NbAnnexes(Nombre As Long)
    c_lngPlisBAC4NbAnnexes = c_lngPlisBAC4NbAnnexes + Nombre
End Property

Property Get PlisBAC4NbAnnexes() As Long
    PlisBAC4NbAnnexes = c_lngPlisBAC4NbAnnexes
End Property

' === Mise sous plis - BAC 1 Code annexe            (SET/GET)

Sub SetPlisBAC1CodeAnnexe(Valeur As String)
    If Valeur <> Empty Then
        If Not (c_dicPlisBAC1CodeAnnexe.Exists(Valeur)) Then
            c_dicPlisBAC1CodeAnnexe.Add Item:=Valeur, Key:=Valeur
        End If
    End If
End Sub

Function PlisBAC1CodeAnnexe() As String
    Dim vntPlisBAC1CodeAnnexeTab As Variant
    Dim i As Integer
    
    PlisBAC1CodeAnnexe = Empty
    vntPlisBAC1CodeAnnexeTab = c_dicPlisBAC1CodeAnnexe.Keys

    If c_dicPlisBAC1CodeAnnexe.Count > 0 Then
        For i = 0 To c_dicPlisBAC1CodeAnnexe.Count - 1
            If i > 0 Then
                PlisBAC1CodeAnnexe = PlisBAC1CodeAnnexe & vbLf
            End If
            PlisBAC1CodeAnnexe = PlisBAC1CodeAnnexe & c_dicPlisBAC1CodeAnnexe(vntPlisBAC1CodeAnnexeTab(i))
        Next
    End If
End Function

' === Mise sous plis - BAC 2 Code annexe            (SET/GET)

Sub SetPlisBAC2CodeAnnexe(Valeur As String)
    If Valeur <> Empty Then
        If Not (c_dicPlisBAC2CodeAnnexe.Exists(Valeur)) Then
            c_dicPlisBAC2CodeAnnexe.Add Item:=Valeur, Key:=Valeur
        End If
    End If
End Sub

Function PlisBAC2CodeAnnexe() As String
    Dim vntPlisBAC2CodeAnnexeTab As Variant
    Dim i As Integer
    
    PlisBAC2CodeAnnexe = Empty
    vntPlisBAC2CodeAnnexeTab = c_dicPlisBAC2CodeAnnexe.Keys

    If c_dicPlisBAC2CodeAnnexe.Count > 0 Then
        For i = 0 To c_dicPlisBAC2CodeAnnexe.Count - 1
            If i > 0 Then
                PlisBAC2CodeAnnexe = PlisBAC2CodeAnnexe & vbLf
            End If
            PlisBAC2CodeAnnexe = PlisBAC2CodeAnnexe & c_dicPlisBAC2CodeAnnexe(vntPlisBAC2CodeAnnexeTab(i))
        Next
    End If
End Function

' === Mise sous plis - BAC 3 Code annexe            (SET/GET)

Sub SetPlisBAC3CodeAnnexe(Valeur As String)
    If Valeur <> Empty Then
        If Not (c_dicPlisBAC3CodeAnnexe.Exists(Valeur)) Then
            c_dicPlisBAC3CodeAnnexe.Add Item:=Valeur, Key:=Valeur
        End If
    End If
End Sub

Function PlisBAC3CodeAnnexe() As String
    Dim vntPlisBAC3CodeAnnexeTab As Variant
    Dim i As Integer
    
    PlisBAC3CodeAnnexe = Empty
    vntPlisBAC3CodeAnnexeTab = c_dicPlisBAC3CodeAnnexe.Keys

    If c_dicPlisBAC3CodeAnnexe.Count > 0 Then
        For i = 0 To c_dicPlisBAC3CodeAnnexe.Count - 1
            If i > 0 Then
                PlisBAC3CodeAnnexe = PlisBAC3CodeAnnexe & vbLf
            End If
            PlisBAC3CodeAnnexe = PlisBAC3CodeAnnexe & c_dicPlisBAC3CodeAnnexe(vntPlisBAC3CodeAnnexeTab(i))
        Next
    End If
End Function

' === Mise sous plis - BAC 4 Code annexe            (SET/GET)

Sub SetPlisBAC4CodeAnnexe(Valeur As String)
    If Valeur <> Empty Then
        If Not (c_dicPlisBAC4CodeAnnexe.Exists(Valeur)) Then
            c_dicPlisBAC4CodeAnnexe.Add Item:=Valeur, Key:=Valeur
        End If
    End If
End Sub

Function PlisBAC4CodeAnnexe() As String
    Dim vntPlisBAC4CodeAnnexeTab As Variant
    Dim i As Integer
    
    PlisBAC4CodeAnnexe = Empty
    vntPlisBAC4CodeAnnexeTab = c_dicPlisBAC4CodeAnnexe.Keys

…