IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

[VBA - ACCESS] Temps exécution exportation


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de binouzzz19
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    385
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 385
    Par défaut [VBA - ACCESS] Temps exécution exportation
    Bonjour tout le monde !

    Je développe une application access, et dedans j'ai la possibilité de faire une exportation. Le problème c'est que le client dit que cette opération est trop longue. Sachant que je doit donc exporter un peu plus de 2400 enregistrements dans un fichier texte sous un format spécial.

    Je vous mets le code, afin que vous compreniez mieux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
     
     
    Public Function GenerationExport(Nomtable As String, Chemin As String) As Boolean
        On Error GoTo CodeErreur
     
        Dim sngDepart As Single
        Dim sngArrivee As Single
     
        sngDepart = Timer
     
        ' enregistrement servira à stocker l'enregistrement à écrire
        ' CadreEspace servira pour cadrer et formater les données
        Dim enregistrement, CadreEspace As String
        enregistrement = ""
        CadreEspace = ""
     
        '-----------------------------------------------------------------
        ' Teste si la table Query existe
        Dim i, y As Integer
        Dim Position As Long
        Dim tableexiste As Boolean
        tableexiste = False
        For i = 0 To CurrentDb.TableDefs.Count - 1
            If CurrentDb.TableDefs(i).Name = Nomtable Then
                tableexiste = True
                Exit For
            End If
        Next i
     
        ' Si la table n'existe pas on sort avec la sortie à faux
        If tableexiste = False Then
            GenerationExport = False
            Exit Function
        End If
        '-----------------------------------------------------------------
     
     
        'Si la table existe on continue
        'On crée le recordset à utiliser
        Dim oRst As Adodb.Recordset
        Dim cnx As Adodb.Connection
    '    Dim SQL As String
        'On utilise la database courante
        Set cnx = CurrentProject.Connection
        Set oRst = New Adodb.Recordset
     
        ' On crée le numéro de fichier
        Dim iNumFichier As Integer
        ' On attribue un numéro de fichier non utilisé
        iNumFichier = FreeFile
        ' Ouverture du fichier en écriture
        Open Chemin For Output As iNumFichier
     
        'On ouvre le recordset
        oRst.Open Nomtable, cnx
        ' On parcourt chaque enregistrement de la table
        Position = 1
     
        While Not oRst.EOF
            ' Pour chaque champ de la table
            ' /!\ On commence par le 1 car on ne veut pas inclure le premier champ jusqu'au dernier champ
            For i = 1 To CurrentDb.TableDefs(Nomtable).Fields.Count - 1
                ' On ajoute à la string enregistrement le champ sélectionné de l'enregistrement sélectionné
                ' Et ceci au bon format
                ' On crée une chaîne ayant des blancs de la taille du champ
                CadreEspace = Space(CurrentDb.TableDefs(Nomtable).Fields(i).Size)
                If Not IsNull(oRst.Fields(i).Value) Then
                    ' Dans cette chaîne, on cadre à gauche la valeur du champ actuel de l'enregistrement actuel
                    LSet CadreEspace = CStr(oRst.Fields(i).Value)
                    ' Et on ajoute cette chaîne dans l'enregistrement
                End If
                enregistrement = enregistrement + CadreEspace
            Next i
     
            ' On ajoute l'enregistrement au fichier
            Print #iNumFichier, enregistrement
     
            ' On vide la string enregistrement
            enregistrement = ""
            'Définit le texte à afficher et la valeur actuelle de la jauge.
            Application.SysCmd acSysCmdUpdateMeter, Position
            Position = Position + 1
            ' On passe à l'enregistrement suivant
            oRst.MoveNext
        Wend
     
        ' Une fois tous les enregistrements passés
        ' On ferme le recordset et le fichier connexion
        oRst.Close
        cnx.Close
        Set oRst = Nothing
        Set cnx = Nothing
     
        ' On ferme le fichier
        Close #iNumFichier
     
        ' Et on retourne True pour dire que l'opération s'est bien déroulée
        GenerationExport = True
     
        sngArrivee = Timer
        MsgBox "Temps écoulé = " & sngArrivee - sngDepart & " secondes", vbInformation, "Chronomètre"
        sngDepart = 0
        sngArrivee = 0
     
        Exit Function
     
    ' En cas d'erreur, on renvoie false
    CodeErreur:
        MsgBox Err.Description
        GenerationExport = False
    End Function

    Ma question est donc : Comment améliorer le temps d'exécution de mon exportation. J'avais pensé a mettre des recordset mais je ne pense pas que cela va changer grand chose. Je pense que le temps assez long vient de ma copie de chaque ligne sur le fichier (pour chaque enregistrement), qu'en pensez-vous ?

    Mon timer m'indique que la copie des 2400 enregistrements (environ) met 2min et 7sec.

    Merci d'avance.

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    hum, je t'aurais proposé de fonctionner plutôt avec
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Membre chevronné Avatar de binouzzz19
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    385
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 385
    Par défaut
    Merci de ta réponse ... mais ...

    A la place du print ?

    Peut-on mettre le fichier au format voulu avec cette commande aussi ?

    Je vais me documenter de ce coté là

  4. #4
    Membre chevronné Avatar de binouzzz19
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    385
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 385
    Par défaut
    Bon, j'ai regardé pas mal sur le net mais aucun des exports ne se fait sous un format spécial.

    En effet, lorsque j'exporte mes données, il faudrait qu'il y ait des espaces (de la longueur du champ de table) puis selon si le champ est null ou pas, cadrer la valeur à gauche tout en laissant les espaces sur la droite si la valeur du champ est inférieure à la taille de celui-ci.

    Extrait du code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    While Not oRst.EOF
            ' Pour chaque champ de la table
            ' /!\ On commence par le 1 car on ne veut pas inclure le premier champ jusqu'au dernier champ
            For i = 1 To CurrentDb.TableDefs(Nomtable).Fields.Count - 1
                ' On ajoute à la string enregistrement le champ sélectionné de l'enregistrement sélectionné
                ' Et ceci au bon format
                ' On crée une chaîne ayant des blancs de la taille du champ
                CadreEspace = Space(CurrentDb.TableDefs(Nomtable).Fields(i).Size)
                If Not IsNull(oRst.Fields(i).Value) Then
                    ' Dans cette chaîne, on cadre à gauche la valeur du champ actuel de l'enregistrement actuel
                    LSet CadreEspace = CStr(oRst.Fields(i).Value)
                    ' Et on ajoute cette chaîne dans l'enregistrement
                End If
                enregistrement = enregistrement + CadreEspace
            Next i
     
            ' On ajoute l'enregistrement au fichier
            Print #iNumFichier, enregistrement
     
            ' On vide la string enregistrement
            enregistrement = ""
            'Définit le texte à afficher et la valeur actuelle de la jauge.
            Application.SysCmd acSysCmdUpdateMeter, Position
            Position = Position + 1
            ' On passe à l'enregistrement suivant
            oRst.MoveNext
        Wend
    As-tu une solution ?

  5. #5
    Membre chevronné Avatar de binouzzz19
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    385
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 385
    Par défaut
    Bon j'ai finalement réussi, cf http://www.developpez.net/forums/sho...d.php?t=427072

    Et le temps d'exécution est très convaincant, 4min avant contre 1seconde après !! Alors je dis oui !!! ^^

    Allez Résolu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Exporter les données d'un formulaire avec VBA Access
    Par alainb dans le forum VBA Access
    Réponses: 5
    Dernier message: 10/01/2008, 16h33
  2. [VBA Access] Export Table sous Excel avec fenetre de dialogue
    Par trihanhcie dans le forum VBA Access
    Réponses: 4
    Dernier message: 13/07/2007, 14h14
  3. Réponses: 5
    Dernier message: 26/05/2007, 13h46
  4. Réponses: 7
    Dernier message: 11/03/2007, 09h35
  5. VBA Access - Temps d'exécution
    Par kissmytoe dans le forum Access
    Réponses: 17
    Dernier message: 03/03/2006, 08h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo