Optimisation de macro

Optimisation de macro - VB/VBA/VBS - Programmation

Marsh Posté le 20-05-2009 à 15:13:30    

Bonjour tout le monde,
 
Voila ma problématique :
Dans Excel 2003, je dois vérifier que dans ma feuille Données brutes l'id se trouvant dans la colonne B ne se trouve pas dans la feuille Stock colonne A.
 
Je suis vers dans la solution "formule dans les cellules" avec = SI(ESTNA(RECHERCHEV(... ça fonctionnait très bien mais recalculait tout le temps les formules dès que je faisais une modif ou une sauvegarde.
 
Donc je me suis dit, je vais faire une macro qui va mettre le résultat en dur dans mes cellules. Il me suffira de lancer la macro quand j'en ai besoin.
 
Mais c'est terriblement long ! (4500 lignes traitées en 10min)
 
Le fichier xls doit bien faire dans les 15mo, avec 15 000 lignes dans la feuille Données brutes et 12 000 dans Stock.
 
Auriez vous une idée d'optimisation de ma macro ou une solution autre pour que cette mise a jour soit plus rapide ?
 
Merci d'avance
 
Flu
 

Code :
  1. Application.ScreenUpdating = False
  2.     Application.DisplayStatusBar = True
  3.    
  4.     maxRowDB = Sheets("Données brutes" ).Cells(65536, 1).End(xlUp).Row
  5.    
  6.     maxRowStock = Sheets("Stock" ).Cells(65536, 1).End(xlUp).Row
  7.    
  8.     For i = 2 To maxRowDB
  9.         val1 = Sheets("Données brutes" ).Cells(i, 2)
  10.         trouve = False
  11.        
  12.         If i Mod 10 = 0 Then
  13.             DoEvents
  14.         End If
  15.        
  16.         Application.StatusBar = "Mis a jour ligne " & i & "..."
  17.        
  18.         For j = 2 To maxRowStock
  19.             If val1 = Sheets("Stock" ).Cells(j, 1) Then
  20.                 Sheets("Données brutes" ).Cells(i, 15) = "/!\"
  21.                 'MsgBox i & 15 & " : /!\"
  22.                 trouve = True
  23.                 Exit For
  24.             End If
  25.         Next
  26.         If Not trouve Then
  27.             Sheets("Données brutes" ).Cells(i, 15) = "REJOUE"
  28.             'MsgBox i & 15 & " : REJOUE"
  29.         End If
  30.     Next
  31.    
  32.     Application.ScreenUpdating = True


---------------
http://poemes.iceteapeche.com - http://www.simuland.net
Reply

Marsh Posté le 20-05-2009 à 15:13:30   

Reply

Marsh Posté le 20-05-2009 à 15:39:26    

Si tu connais le Java tu peux faire un programme dans ce langage. Avec la bonne librairie il est facile de manipuler des fichiers Excel. Et niveau performance ça n'a vraiment rien à voir avec le VBA qui est affreusement lent.
J'ai déjà réalisé un programme comme cela pour vérifier des fichiers aussi gros que les tiens. Pour certains, avec Java le temps nécessaire était jusqu'à 20 fois inférieur qu'avec VBA (mais il faut dire que les macros n'étaient pas très optimisées non plus).

Reply

Marsh Posté le 21-05-2009 à 07:10:37    

- Pour éviter le recalcul automatique de tes cellules, tu peux aller dans les options et décocher la case du calcul auto.
- Sinon, pour ton algo, je ne sais pas trop, j'aurais fait à peu près la même chose. Peut être que tu pourrais faire d'abord un tri sur tes colonnes iD pour éviter de devoir repartir systématiquement du haut de la liste dans ta deuxième table.
- Une dernière solution (que je n'ai jamais fait avec Excel, mais je pense que c'est possible), c'est faire une requête sql.


---------------
OtObOxBlOg - - - Etre seul à avoir tort  c'est plus difficile, mais c'est bien plus beau que d'avoir raison avec une bande de cons
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed