Optimisation code VBA pour accélérer le processus
Fermé
dianedg
Messages postés
22
Date d'inscription
mercredi 5 mars 2014
Statut
Membre
Dernière intervention
19 juillet 2016
-
15 juil. 2016 à 16:28
eriiic Messages postés 24600 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 21 octobre 2024 - 20 juil. 2016 à 00:45
eriiic Messages postés 24600 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 21 octobre 2024 - 20 juil. 2016 à 00:45
A voir également:
- Vba optimisation
- Optimisation pc - Accueil - Utilitaires
- Optimisation découpe panneau gratuit - Télécharger - Outils professionnels
- Optimisation windows 10 - Guide
- Vba attendre 1 seconde ✓ - Forum VB / VBA
- Vba récupérer valeur cellule ✓ - Forum VB / VBA
2 réponses
Bonjour,
avez-vous pensé à mettre en début de macro (apres sub () )
Application.ScreenUpdating = False
et en fin de macro (avant end Sub)
Application.ScreenUpdating = true
Ca peut faire gagner énormément de temps sur l'exécution d'une macro.
avez-vous pensé à mettre en début de macro (apres sub () )
Application.ScreenUpdating = False
et en fin de macro (avant end Sub)
Application.ScreenUpdating = true
Ca peut faire gagner énormément de temps sur l'exécution d'une macro.
eriiic
Messages postés
24600
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
21 octobre 2024
7 239
Modifié par eriiic le 15/07/2016 à 21:30
Modifié par eriiic le 15/07/2016 à 21:30
Bonjour,
lire cellule par cellule est très chronophage.
Il faut lire toutes les données en une fois dans une variable tableau, et inversement pour écrire.
Ex succinct :
Ca ira 100 fois plus vite.
Par contre pour relever la couleur pas d'autre possibilité que de lire les cellules.
eric
En essayant continuellement, on finit par réussir.
Donc plus ça rate, plus on a de chances que ça marche.(les Shadoks)
En plus du merci (si si, ça se fait !!!), penser à mettre en résolu. Merci
lire cellule par cellule est très chronophage.
Il faut lire toutes les données en une fois dans une variable tableau, et inversement pour écrire.
Ex succinct :
Dim datas ' Variant 'lire datas = Range("A1:E10") 'modifier datas(5, 3) = 150 'ligne,colonne) 'écrire Range("A1:E10") = datas = Range("A1:E10")
Ca ira 100 fois plus vite.
Par contre pour relever la couleur pas d'autre possibilité que de lire les cellules.
eric
En essayant continuellement, on finit par réussir.
Donc plus ça rate, plus on a de chances que ça marche.(les Shadoks)
En plus du merci (si si, ça se fait !!!), penser à mettre en résolu. Merci
dianedg
Messages postés
22
Date d'inscription
mercredi 5 mars 2014
Statut
Membre
Dernière intervention
19 juillet 2016
1
19 juil. 2016 à 23:33
19 juil. 2016 à 23:33
Merci Eriiic, j'ai testé avec la macro ci-dessous. ça fonctionne, mais ça n'accélère pas tant que ça (encore 45 sec, sans compter la copie des couleurs qui n'a plus lieu).
Est-ce que l'on peut faire un tableau des worksheet (car la macro boucle sur toutes les worksheets du fichiers, actuellement 3 mais jusqu'à 9 possible).
Merci pour ton aide.
Diane
Est-ce que l'on peut faire un tableau des worksheet (car la macro boucle sur toutes les worksheets du fichiers, actuellement 3 mais jusqu'à 9 possible).
Merci pour ton aide.
Diane
Dim compt1 As Long, compt2 As Long Dim PlageV As Variant For Each Freezer In ActiveWorkbook.Worksheets '>>>>>>>> puis-je faire des worksheet un tableau également ?? PlageV = Freezer.Range("C5:L63").Value 'Boucle For compt1 = LBound(PlageV, 1) To UBound(PlageV, 1) For compt2 = LBound(PlageV, 2) To UBound(PlageV, 2) If PlageV(compt1, compt2) <> Empty Then If PlageV(compt1, compt2) <> "Rack ID" Then 'Copie les valeurs du freezer interface Workbooks(strFilename).Worksheets(1).Range("B" & LinB).Value = PlageV(compt1, compt2) 'copie le nom du freezer Workbooks(strFilename).Worksheets(1).Range("A" & LinB).Value = Freezer.Name LinB = LinB + 1 Else End If End If Next compt2 Next compt1 Next End With
eriiic
Messages postés
24600
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
21 octobre 2024
7 239
20 juil. 2016 à 00:45
20 juil. 2016 à 00:45
Bonjour,
ben oui, tu as traité la lecture mais tu continues à écrire cellule par cellule.
Il faut écrire dans un tableau. Le même si c'est pour remplacer certaines données ou un que tu déclares.
Comme apparement il ne sera pas trop long tu le dimensionnes à la taille maxi que tu risques d'avoir besoin.
Et ensuite l'inscrire en une fois : ta_plage = ton_tableau
Tu es obligé de faire feuille par feuille.
eric
ben oui, tu as traité la lecture mais tu continues à écrire cellule par cellule.
Il faut écrire dans un tableau. Le même si c'est pour remplacer certaines données ou un que tu déclares.
Comme apparement il ne sera pas trop long tu le dimensionnes à la taille maxi que tu risques d'avoir besoin.
Et ensuite l'inscrire en une fois : ta_plage = ton_tableau
Tu es obligé de faire feuille par feuille.
eric
15 juil. 2016 à 17:32
J'ai mis:
Set xl = New Excel.Application
xl.Visible = False
La macro tourne via Access, je n'ouvre pas directement de fichier excel.
Je vais ajouter ce que vous proposer également.
15 juil. 2016 à 17:36
D'autres suggestions ?
15 juil. 2016 à 17:51
Il faudra attendre la réponse d'un expert alors.
Bonne soirée,