Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Macro trop longue

9 réponses
Avatar
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

9 réponses

Avatar
isabelle
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
Avatar
Caetera
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
Avatar
anfeus
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.
Avatar
Caetera
"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é ?
Avatar
anfeus
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 .
Avatar
Caetera
"anfeus" a écrit dans le message de news:


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
Avatar
isabelle
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" a écrit dans le message de news:


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


Avatar
Caetera
"isabelle" a écrit dans le message de news:
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
Avatar
Jacquouille
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" <EtiennePloufCahé@wanadoo.fr> a écrit dans le message de news:
i6noiu$blg$
"anfeus" a écrit dans le message de news:


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