[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:
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.