Macro trop longue

Le
anfeus
Bonjour,
j'ai une macro qui applique la formule d'excel = gauche(cellulle, nbre de valeur).Le problème est que ma base de données contient 16 000 lignes et le code que j'ai trouvé met 1mn 30 pour effectuer la tâche. J'ai donc peur du temps que je mettrai lorsque j'aurais des bases de 50 000 lignes. Merci de me donner une astuce pour réduire le temps de ma macro .
Voici mon code :
Dim b as Single
b =Worksheets("BASE").Range("A:A").Cells.SpecialCells(xlCellTypeConstants).Count
For I = 2 To b
Range("B" & I).Select
ActiveCell.Formula = Left(Range("A" & I), 2)
Next I
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
isabelle
Le #22567621
bonjour anfeus,

en évitant les select

For I = 2 To b
Range("B" & I) = Left(Range("A" & I), 2)
Next I

si la modification des valeurs de la colonne B entraine un recalcule,
tu pourrait en début de macro mettre le calcul à manuel et arrêter le rafraichissement de l'écran,
sans oublier de rétablir le tout avant la fin de la macro.

Application.Calculation = xlManual
Application.ScreenUpdating = False

'action de la macro

Application.ScreenUpdating = True
Application.Calculation = xlAutomatic

isabelle

Le 2010-09-13 23:23, anfeus a écrit :
Bonjour,
j'ai une macro qui applique la formule d'excel = gauche(cellulle, nbre de
valeur).Le problème est que ma base de données contient 16 000 lignes et le
code que j'ai trouvé met 1mn 30 pour effectuer la tâche. J'ai donc peur du temps
que je mettrai lorsque j'aurais des bases de 50 000 lignes. Merci de me donner
une astuce pour réduire le temps de ma macro .
Voici mon code :
Dim b as Single
b
=Worksheets("BASE").Range("A:A").Cells.SpecialCells(xlCellTypeConstants).Count
For I = 2 To b
Range("B"& I).Select
ActiveCell.Formula = Left(Range("A"& I), 2)
Next I
Caetera
Le #22567721
j'ai une macro qui applique la formule d'excel = gauche(cellulle, nbre de
valeur).Le problème est que ma base de données contient 16 000 lignes et le
code que j'ai trouvé met 1mn 30 pour effectuer la tâche. J'ai donc peur du
temps
que je mettrai lorsque j'aurais des bases de 50 000 lignes. Merci de me donner
une astuce pour réduire le temps de ma macro .
Voici mon code :
Dim b as Single
b
=Worksheets("BASE").Range("A:A").Cells.SpecialCells(xlCellTypeConstants).Count
For I = 2 To b
Range("B" & I).Select
ActiveCell.Formula = Left(Range("A" & I), 2)
Next I



***********************

Aucun besoin de boucle et encore moins de select :

b = 16000
Range("B2:B" & b) = "=LEFT(RC[-1],2)"

Etc
anfeus
Le #22568181
isabelle a écrit le 14/09/2010 à 05h49 :
bonjour anfeus,

en évitant les select

For I = 2 To b
Range("B" & I) = Left(Range("A" & I), 2)
Next I

si la modification des valeurs de la colonne B entraine un recalcule,
tu pourrait en début de macro mettre le calcul à manuel et
arrêter le rafraichissement de l'écran,
sans oublier de rétablir le tout avant la fin de la macro.

Application.Calculation = xlManual
Application.ScreenUpdating = False

'action de la macro

Application.ScreenUpdating = True
Application.Calculation = xlAutomatic

isabelle

Le 2010-09-13 23:23, anfeus a écrit :
Bonjour,
j'ai une macro qui applique la formule d'excel = gauche(cellulle, nbre de
valeur).Le problème est que ma base de données contient 16 000
lignes et le
code que j'ai trouvé met 1mn 30 pour effectuer la tâche. J'ai
donc peur du temps
que je mettrai lorsque j'aurais des bases de 50 000 lignes. Merci de me donner
une astuce pour réduire le temps de ma macro .
Voici mon code :
Dim b as Single
b
=Worksheets("BASE").Range("A:A").Cells.SpecialCells(xlCellTypeConstants).Count
For I = 2 To b
Range("B"& I).Select
ActiveCell.Formula = Left(Range("A"& I), 2)
Next I




merci , pour ta réponse isabelle , je passe d'1minute 30 à 10 secondes.
Caetera
Le #22568311
"anfeus"

merci , pour ta réponse isabelle , je passe d'1minute 30 à 10 secondes.



Et la mienne ?
Elle sent le pâté ?
anfeus
Le #22568541
Caetera a écrit le 14/09/2010 à 11h28 :
"anfeus" a écrit dans le message
de news:


merci , pour ta réponse isabelle , je passe d'1minute 30 à 10
secondes.




Et la mienne ?
Elle sent le pâté ?


Non pas du tout , je l'ai testé et elle a mis 12 secondes.Du coup , j'ai travaillé avec celle d'Isabelle. Merci pour ta réponse CAETERA .
Caetera
Le #22568831
"anfeus"

Non pas du tout , je l'ai testé et elle a mis 12 secondes.




IMPOSSIBLE !
La méthode que je t'ai indiqué est (à peu près) 40 fois plus rapide !

La preuve là :
http://www.cijoint.fr/cjlink.php?file=cj201009/cijJcG7Zui.xls

Sur ma bécane...
Isabelle = (environ) 1250 millisecondes
Caetera = (environ) 30 millisecondes

Etc
isabelle
Le #22569271
c'est vrai Caetera, ton code est 10 fois plus rapide,
mais les propositions pour améliorer la vitesse du code:
- éviter les select
- mettre le calcul à manuel
- arrêter le rafraichissement de l'écran
seront surement utile dans d'autre situation

ps/ anfeus, si tu veut seulement les valeurs en colonne B
sur la proposition de Caetera tu peut ajouter la ligne suivante,

Range("B2:B" & b) = "=LEFT(RC[-1],2)"
Range("B2:B" & b) = Range("B2:B" & b).Value ' transformer les formules en valeur

isabelle


Le 2010-09-14 08:08, Caetera a écrit :
"anfeus"

Non pas du tout , je l'ai testé et elle a mis 12 secondes.




IMPOSSIBLE !
La méthode que je t'ai indiqué est (à peu près) 40 fois plus rapide !

La preuve là :
http://www.cijoint.fr/cjlink.php?file=cj201009/cijJcG7Zui.xls

Sur ma bécane...
Isabelle = (environ) 1250 millisecondes
Caetera = (environ) 30 millisecondes

Etc


Caetera
Le #22569381
"isabelle" i6o09s$t73$
c'est vrai Caetera, ton code est 10 fois plus rapide,
mais les propositions pour améliorer la vitesse du code:
- éviter les select
- mettre le calcul à manuel
- arrêter le rafraichissement de l'écran



Ces règles la étaient évidemment sous-entendues puisque ce sont des règles
génériques (non spécifiques à ce cas précis)
Mais, dans ce cas, et dans l'exemple joint, il était bon de ne pas les utiliser
pour bien montrer les gains en temps d'éxécution en n'utilisant pas une boucle

Etc
Jacquouille
Le #22572271
Bonjour
J'aime cette théorie....
Quoique, même en ayant le doigt prêt sur le mulot, je ne suis pas certain de
la différence lorsqu'il faudra cliquer sur quelque chose à l'étape suivante.
Je me suis toujours marré à la lecture de ces milisecondes, alors que l'on
reste pantois du résultat pendant 5 min .....devant son écran à se demander
ce que l'on va faire. -)

--
Bien amicalmement,
"Le vin est au repas ce que le parfum est à la femme."

Jacquouille (MPFE).

"Caetera" i6noiu$blg$
"anfeus"

Non pas du tout , je l'ai testé et elle a mis 12 secondes.




IMPOSSIBLE !
La méthode que je t'ai indiqué est (à peu près) 40 fois plus rapide !

La preuve là :
http://www.cijoint.fr/cjlink.php?file=cj201009/cijJcG7Zui.xls

Sur ma bécane...
Isabelle = (environ) 1250 millisecondes
Caetera = (environ) 30 millisecondes

Etc


Publicité
Poster une réponse
Anonyme