none
Dysfonctionnement des fichiers binaires VBA en lecture RRS feed

  • Question

  • Contexte :

    J'ai développé depuis dix ans sous vba (excel 2003 puis 2007) des utilitaires d'analyse de base de données utilisés pour mes besoins professionnels et ceux de mes clients, répondant à un objectif de rapidité pour une volumétrie importantes , avec des temps de réponse sur requêtes de 1 à 3 secondes indépendants de la taille des fichiers (parfois plusieurs millions de lignes).

    Le processus repose toujours sur deux modules (fichiers xlsm) :

    Un "Convertisseur" spécifique environnement client : Création d'une base de données standard VBA à partir des données extraites des systèmes d'information clients et enregistrement de la base standard VBA sous forme de fichier binaire

    Un "Lecteur" : Lecture du fichier binaire (chargement de la base VBA) + outils divers d'analyse par requêtes.

    Il va de soi que que la structure de la base VBA et les procédures de lecture / écriture du fichier binaire sont strictement identiques dans les deux modules. Ces modules ne contiennent aucune formule, Excel est utilisé comme simple interface utilisateur.

    Problème :

    Les binomes Convertisseurs / Lecteur créés depuis plus de 6 mois fonctionnent toujours.

    Ceux créés plus récemment se plantent à la lecture du fichier binaire.

    Curieusement, il suffit d'ouvrir la fenêtre VBA du lecteur, de couper le code lecture / écriture du fichier binaire, puis de le coller au même endroit et de lancer une compilation pour que cela fonctionne correctement.

    Je n'y comprends rien et j'ai perdu des journées entières à chercher en vain des solutions pour rendre opérationnelles des développements qui devaient être livrés pour la fin de l'année.

    Ci après extrait de la codification :

    Déclaration des variables:

    Option Explicit
    Option Base 1
    Option Compare Text
    
    'Base de données ZEC--------------------------
    
    Type HdlType 'Pointeurs
        Fst As Long
        Lst As Long
        Act As Long
    End Type
    
    Type TrackType 'Traceurs
        Prev As Long
        Next As Long
    End Type
    
    Type SldType
        MvD As Currency
        MvC As Currency
        Dr As Currency
        Cr As Currency
        DC As Currency
    End Type
    
    Type PointeurPostesType
        Dr As Integer
        Cr As Integer
    End Type
    
    Type FileInfosType 'Infos fichier
        Société As String
        Exercice As String
        CompVersion As String
        CompDate As Date
        CompAgreg As Boolean
        CompSpeed As Integer
        FECSize As Long
        CompSize As Long
        AddInns As String 'V3
    End Type
    
    Type AdressType 'Sous structure adresses pour comptes auxiliaires
        Nom As String
        CodePost As String
        Rue As String
        Ville As String
        Pays As String
    End Type
    
    Type DbHandlesType 'Pointeurs
        jP As HdlType 'Journaux
        jkP As HdlType 'Catégories de journaux
        eP As HdlType 'Ecritures
        cP As HdlType 'Plan de comptes généraux
        aP As HdlType 'Plan de comptes auxiliaires
    End Type
    
    Type EcrType 'Base de données écritures format ZEC
        'Champs extraits du FEC :
        JlCode As String
        EcrNum As Currency 'La portée du type Long est insuffisante
        EcrDate As Date
        CteNum As String
        AuxNum As String
        PceNum As String
        PceDate As Date
        EcrLib As String
        EMnt As Currency 'Montant euro Débit+ Crédit-
        EcrLet As Currency
        LetDate As String
        ValDate As String
        DevMnt As Currency
        DevCode As String
        'Champs propres au format ZEC
        CtePtr As Long
        CteLog As TrackType
        JlPtr As Long
        JlLog As TrackType
        JclPtr As Long 'V3
        AuxPtr As Long
        AuxLog As TrackType
        LNum As Long 'Lettrage interne
        EchDate As Date
        InterCo As String
        InScope As Boolean
    End Type
    
    Type JlType 'Table des journaux
        JlCode As String
        JlLib As String
        EcrPtr As HdlType
        JlClasPtr As Integer
        InScope As Boolean
    End Type
    
    Type JlClasType 'Table de classement des journaux par nature
        Clas As Integer
        Catégorie As String
        InScope As Boolean
    End Type
    
    Type PcgType 'Plan de comptes généraux
        CteNum As String
        ShortNC As Integer 'Numéro de compte à 4 chiffres
        CteLib As String
        EstCollectif As Boolean
        EcrPtr As HdlType
        Solde As SldType
        DevMnt As Currency
        DevCode As String
        EstLettré As Boolean
        Poste As PointeurPostesType
        InterCo As String
        EcrCnt As Long 'V3
        InScope As Boolean
    End Type
    
    Type PcaType 'Plan de comptes auxiliaires
        AuxNum As String
        Tiers As AdressType
        EcrPtr As HdlType
        Solde As SldType
        EcrCnt As Long 'V3
        DevMnt As Currency
        DevCode As String
        InScope As Boolean
    End Type
    
    'Base de données et tables internes-----------
    
    Type OptionsEditionType
        Séléctif As Boolean
        ParClasses As Boolean
        DteDébut As Date
        DteFin As Date
    End Type
    
    Type BufferType
        Rec As EcrType
        SoldeProg As Currency
        RAdr As Long
    End Type
    
    'Base de données ZEC--------------------------
    Public Db As DbHandlesType
    Public Info As FileInfosType
    Public Jl() As JlType 'Journaux
    Public jCl() As JlClasType 'Catégories de journaux
    Public Cg() As PcgType 'Comptes généraux
    Public Ca() As PcaType 'Comptes auxiliaires
    Public Ecr() As EcrType
    

    Lecture / Ecriture

    Option Explicit
    Option Base 1
    Option Compare Text
    
    Sub SaveZeCFile()
        Dim FPath As Variant
        Dim ZecFile As String
        Dim Prefix As Integer
        FPath = Application.GetSaveAsFilename
        If FPath = False Then
            Reset
            Exit Sub
        End If
        ZecFile = CStr(FPath)
        ZecFile = Left(ZecFile, Len(ZecFile) - 1) & ".zec"
        Open ZecFile For Binary Access Write As #1
        Prefix = 1 'Pointeurs
        Put #1, , Prefix
        Put #1, , Db
        Prefix = 2 'Journaux
        For Db.jP.Act = 1 To Db.jP.Lst
            Put #1, , Prefix
            Put #1, , Jl(Db.jP.Act)
        Next
        Prefix = 3 'Catégories de journaux
        For Db.jkP.Act = 1 To Db.jkP.Lst
            Put #1, , Prefix
            Put #1, , jCl(Db.jkP.Act)
        Next
        Prefix = 4 'Comptes généraux
        For Db.cP.Act = 1 To Db.cP.Lst 'Comptes généraux
            Put #1, , Prefix
            Put #1, , Cg(Db.cP.Act)
        Next
        Prefix = 5 'Comptes auxiliaires
        For Db.aP.Act = 1 To Db.aP.Lst
            Put #1, , Prefix
            Put #1, , Ca(Db.aP.Act)
        Next
        Prefix = 6 'Ecritures
        For Db.eP.Act = 1 To Db.eP.Lst
            Put #1, , Prefix
            Put #1, , Ecr(Db.eP.Act)
        Next
        Prefix = 7 'Infos fichier
        Put #1, , Prefix
        Put #1, , Info
        DoEvents
        Reset
    End Sub
    
    Sub ReadZeCFile()
        Dim FPath As Variant
        Dim ZecFile As String
        Dim Prefix As Integer
        FichierChargé = False
        FPath = Application.GetOpenFilename("Fichiers ZEC(*.zec), *.zec")
        If FPath = False Then
            Exit Sub
        End If
        ZecFile = CStr(FPath)
        Open ZecFile For Binary Access Read As #1
        Do
            Get #1, , Prefix
            Select Case Prefix
            Case Is = 1 'Pointeurs
                Get #1, , Db
                ReDim Jl(Db.jP.Lst)
                ReDim jCl(Db.jkP.Lst)
                ReDim Cg(Db.cP.Lst)
                ReDim Ca(Db.aP.Lst)
                ReDim Ecr(Db.eP.Lst)
                Db.jP.Act = 0
                Db.jkP.Act = 0
                Db.cP.Act = 0
                Db.aP.Act = 0
                Db.eP.Act = 0
            Case Is = 2 'Journaux
                Db.jP.Act = Db.jP.Act + 1
                Get #1, , Jl(Db.jP.Act)
            Case Is = 3 'Catégories de journaux
                Db.jkP.Act = Db.jkP.Act + 1
                Get #1, , jCl(Db.jkP.Act)
            Case Is = 4 'Comptes généraux
                Db.cP.Act = Db.cP.Act + 1
                Get #1, , Cg(Db.cP.Act)
            Case Is = 5 'Comptes auxiliaires
                Db.aP.Act = Db.aP.Act + 1
                Get #1, , Ca(Db.aP.Act)
            Case Is = 6 'Ecritures
                Db.eP.Act = Db.eP.Act + 1
                Get #1, , Ecr(Db.eP.Act)
            Case Is = 7 'Informations fichier
                Get #1, , Info
            End Select
        Loop While Not EOF(1)
        FichierChargé = True
        Reset
    End Sub
    

    Merci §

    mardi 30 décembre 2014 17:54