Bonjour,
J'ai une base .mdb dans laquelle se trouve la table Ecr correspondant aux écritures comptables dont les champs sont les suivants :
DosQua, CodeJournal, Folio, PeriodeEcriture, JourEcriture, LigneFolio, Lib, Montant, NumUniq
Afin de pouvoir calculer un solde cumulé et un numéro d'écriture, j'exporte NumUniq et Montant dans un fichier Excel par requete, le travail sous Access se révélant difficile :
J'obtiens ainsi ce tableau (extrait de 15 lignes) pouvant contenir 95'000 lignes en fin d'exercice :
Code : Sélectionner tout - Visualiser dans une fenêtre à part SELECT NumUniq, Montant INTO [Excel 8.0;Database=FichierExcelSurBureau].[NumEcr] FROM Mvm ORDER BY DosQua, CodeJournal, Folio, PeriodeEcriture, JourEcriture, LigneFolio, Lib
NumUniq Montant 20384 2392178,69 20386 -2392178,69 20388 9770,89 20390 765,98 20392 1188,2 20394 -11725,07 20396 8922,17 20398 765,98 20400 1018,45 20402 -10706,6 20404 8922,17 20406 765,98 20408 1018,45 20410 -10706,6
Je calcul ensuite le cumul et le numéro d'écriture, la première ligne portant le numéro 1, les lignes suivantes porteront ce numéro tant que le cumul de la ligne précédente est différent de 0.
Lorsque la ligne précédente est égale à 0, la ligne actuelle correspond à une nouvelle écriture, le numéro est alors incrémenté. Nous obtenons ce résultat :
NumUniq Montant Cumul Ecr 20384 2392178,69 2392178,69 1 20386 -2392178,69 0 1 20388 9770,89 9770,89 2 20390 765,98 10536,87 2 20392 1188,2 11725,07 2 20394 -11725,07 0 2 20396 8922,17 8922,17 3 20398 765,98 9688,15 3 20400 1018,45 10706,6 3 20402 -10706,6 0 3 20404 8922,17 8922,17 4 20406 765,98 9688,15 4 20408 1018,45 10706,6 4 20410 -10706,6 0 4
Le problème est que la durée d'exécution est énorme, j'ai comparé la durée en lançant le traitement par VB.NET et par VBA et je suis choqué:
Pour 27'626 lignes : VB.NET=3 min 36 / VBA= 1 sec
Pour 58'220 lignes : VB.NET=9 min 20 / VBA= 5 sec
Le code est le même :
VB.NET
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 xlApp = New Excel.Application xlApp.DisplayAlerts = False OdbCnn.Close() wrbSrc = xlApp.Workbooks.Open(Filename:=strDsk & "\crn." & LCase(strDos) & "." & LCase(strAAA) & ".cpt.mvm.xls", UpdateLinks:=False) wrs = wrbSrc.Worksheets("NumEcr") wrs.Cells(1, 3).Value = "Cumul" wrs.Cells(1, 4).Value = "Ecr" ecr = 1 For i = 2 To wrs.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell).Row If i = 2 Then wrs.Cells(i, 3).Value = Math.Round(wrs.Cells(i, 2).Value, 2) Else wrs.Cells(i, 3).Value = Math.Round(wrs.Cells(i, 2).Value + wrs.Cells(i - 1, 3).Value, 2) End If If i > 2 Then If wrs.Cells(i - 1, 3).Value = 0 Then ecr = ecr + 1 End If End If wrs.Cells(i, 4).Value = ecr Next wrbSrc.Close(SaveChanges:=True) xlApp.DisplayAlerts = True
VBA
Avez-vous une solution pour que la durée d'exécution sous VB.NET se rapproche sensiblement de celle sous VBA ?
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 Set wrsVba = Worksheets("VBA") Set wrsCpr = Worksheets("Compar") datDeb = Time wrsVba.Cells(1, 3) = "Cumul" wrsVba.Cells(1, 4) = "NumEcr" ecr = 1 For i = 2 To wrsVba.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell).Row If i = 2 Then wrsVba.Cells(i, 3) = Round(wrsVba.Cells(i, 2), 2) Else wrsVba.Cells(i, 3) = Round(wrsVba.Cells(i, 2) + wrsVba.Cells(i - 1, 3), 2) End If If i > 2 And wrsVba.Cells(i - 1, 3) = 0 Then ecr = ecr + 1 End If wrsVba.Cells(i, 4) = ecr Next i datFin = Time i = wrsCpr.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell).Row + 1 wrsCpr.Cells(i, 1) = "VBA" wrsCpr.Cells(i, 2) = Format(Now, "MM/dd/yyyy") wrsCpr.Cells(i, 3) = Format(datDeb, "HH:mm:ss") wrsCpr.Cells(i, 4) = Format(datFin, "HH:mm:ss") wrsCpr.Cells(i, 5) = Format(datFin - datDeb, "HH:mm:ss")
Je joins un fichier contenant les deux exemples avec le module VBA au cas où.
Vous remerciant pour votre aide.
Partager