[VBA] Remplissage de cellules très long en temps

Remplissage de cellules très long en temps [VBA] - VB/VBA/VBS - Programmation

Marsh Posté le 19-01-2009 à 20:05:43    

Bonjour,
 
Dans une Macro Excel, j'ai besoin de remplir une colonne dans une boucle.
 
Mais l'instruction Range.Cells (i,2).Value = Valeur (i,2) met beaucoup de temps.
(valeur est un tableau interne)
 
 
Je mets 10 secondes à traiter les 100 lignes de mon fichier de test, alors que je pourrais en avoir des milliers en Prod.
 
Comment faire pour que cela soit plus rapide ?

Reply

Marsh Posté le 19-01-2009 à 20:05:43   

Reply

Marsh Posté le 19-01-2009 à 22:45:23    

Pas d'aide ?

Reply

Marsh Posté le 20-01-2009 à 09:12:18    

Il faut affecter tes valeurs d'un coup à toutes tes cellules.
Sélectionne une plage de cellules et utilise la syntaxe :
plage_cellules.value = tableau()
 
Ce sujet a déjà été discuté sur le forum, tu devrais pouvoir trouver des exemples.

Reply

Marsh Posté le 20-01-2009 à 09:17:08    

fannypoulain a écrit :

Bonjour,
 
Dans une Macro Excel, j'ai besoin de remplir une colonne dans une boucle.
 
Mais l'instruction Range.Cells (i,2).Value = Valeur (i,2) met beaucoup de temps.
(valeur est un tableau interne)
 
 
Je mets 10 secondes à traiter les 100 lignes de mon fichier de test, alors que je pourrais en avoir des milliers en Prod.
 
Comment faire pour que cela soit plus rapide ?


Tu ne fais que lire ton fichier et remplir excel ou il y a d'autres traitements ?
Parce que c'est assez énorme 10s pour 100 lignes...


---------------
Instagram - Mon PVT en Australie.
Reply

Marsh Posté le 20-01-2009 à 09:51:04    

Bonjour,
 
Merci pour votre aide.
C'est l'opération de remplissage des cellules qui prend 10 secondes (environ).

Reply

Marsh Posté le 20-01-2009 à 09:54:58    

On pourrait voir ton code ?
Je suis pas un pro du vba sous excel mais ça me semble vraiment exagéré comme temps de traitement.


---------------
Instagram - Mon PVT en Australie.
Reply

Marsh Posté le 20-01-2009 à 09:55:30    

Voici mon code :
 
For Lig = 1 To Nbrelig      
 
    Champs.Cells(Lig, 2) = Tableau(Lig, 2)         ' <--- très long
           
Next Lig

Reply

Marsh Posté le 20-01-2009 à 09:56:58    

J'ai chronométré, ça met bien 10 sec pour traiter une centaine de lignes !

Reply

Marsh Posté le 20-01-2009 à 10:05:11    

C'est bon, c'est résolu grâce à la remarque de tegu !
 
J'ai fait : Champs.Value = Tableau
et c'est immédiat !
 
Merci beaucoup tegu. :)

Reply

Marsh Posté le 20-01-2009 à 10:07:07    

Comment tu as isolé que ça vient de là ?
En faisant ça :

Code :
  1. Sub test()
  2. Dim VarTab(1 To 100, 1 To 3) As Integer
  3. Dim nb As Integer
  4. Dim i As Integer
  5. nb = 100
  6. For i = 1 To nb
  7.    VarTab(i, 2) = i
  8. Next i
  9.  
  10.  
  11. For i = 1 To nb
  12.    ActiveSheet.Cells(i, 2) = CInt(VarTab(i, 2))
  13. Next i
  14. End Sub


Ca se rempli instantanément chez moi.
Tu n'as pas un pc qui est très lent par hasard ?

 

Edit : bon ok tant pis.


Message édité par LePhasme le 20-01-2009 à 11:02:40

---------------
Instagram - Mon PVT en Australie.
Reply

Marsh Posté le 20-01-2009 à 10:07:07   

Reply

Marsh Posté le 20-01-2009 à 10:20:25    

Bonjour,
 
A mettre eb début de macro
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
 
 
A mettre en fin de macro
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
 
 
Application.ScreenUpdating = ne met pas à jour l'écran à chaque changement dans une cellule
 
Application.Calculation = ne recalcule pas tout à chaque changement dans une cellule
 
Je pense que ça va réduire le temps

Reply

Marsh Posté le 20-01-2009 à 10:53:00    

Application.Calculation résoud aussi le problème !
Je vais prendre cette solution là. Comme ça je n'ai pas à modifier le code.
 
Merci pyrof !


Message édité par fannypoulain le 20-01-2009 à 11:22:16
Reply

Marsh Posté le 21-01-2009 à 19:44:56    

Si tu utilises les Offset c'est beaucoup plus rapide....
 
Exemple :
 
sheets("sheet1" ).select
 
set rng=sheets("sheet1" ).range("A1" )
 
i=0
j=0
 
rng.offset(i,j).select   ' optionnel c'est juste pour voir ou tu pointe
 
Var1=rng.offset(i,j).value  ' je prend la valeur en A1
 
Var2=rng.offset(i,j+1).value ' Je prend la valeur en B1
 
rng.offset(i,J+3)=Var1+Var2  ' Je met le résultat en C1
 
 
...etc... et tu te prends moins la tête !
 

Reply

Marsh Posté le 21-01-2009 à 19:46:17    

Oups !
 
la derniere ligne
 
rng.offset(i,J+3).value=Var1+Var2  ' Je met le résultat en C3
 
 

Reply

Sujets relatifs:

Leave a Replay

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