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.