Optimisation de la durré d’une focntion
Résolu
mijean94
Messages postés
413
Date d'inscription
Statut
Membre
Dernière intervention
-
mijean94 Messages postés 413 Date d'inscription Statut Membre Dernière intervention -
mijean94 Messages postés 413 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Ma fonction marche bien mais est très longue.
Y a-t-il une solution pour aller plus vite ?
Voici ce qu'elle réalise :
Efface les plages qui sont avec un fond blanc et qui contiennent une information différente de ""
Merci pour l’aide
Bien cordialement
Ma fonction marche bien mais est très longue.
Y a-t-il une solution pour aller plus vite ?
Voici ce qu'elle réalise :
Efface les plages qui sont avec un fond blanc et qui contiennent une information différente de ""
Public Sub Vitesse() '
Dim lideb As Long, codeb As Long, lifin As Long, cofin As Long
Dim grille As Variant
Dim Plages As Range
Dim vcel As Variant
‘la cellule B2 contien les coordonnées de la zone à traiter sous la forme $X$X:$X$X .
grille = Range("B2").Value
lideb = Range(grille).Cells(1, 1).Row
codeb = Range(grille).Cells(1, 1).Column
lifin = Range(Split(grille, ":")(1)).Row
cofin = Range(Split(grille, ":")(1)).Column
Set Plages = Range(Cells(lideb, codeb), Cells(lifin, cofin))
Plages.Select
For Each vcel In Plages
If vcel.Interior.ColorIndex = 2 And vcel <> "" Then vcel.ClearContents
Next vcel
End Sub
Merci pour l’aide
Bien cordialement
3 réponses
-
Bonjour
Après les déclarations, écris déjà cette ligne
Application.screenupdating=false
qui fige le défilement de l'écran
la couleur 2 (blanc) n'est elle pas plutôt " aucune couleur" ?
sinon est elle une mise en forme conditionnelle de la valeur de la cellule ?
Michel-
Bonjour,
Merci l'aide et pour la proposition.
Après l’ajout de (Application.screenupdating=false ) la boucle dure environ 10 secondes de moins pour une même utilisation.
Faut-il mettre Application.screenupdating= true en fin de procédure ?
Q : la couleur 2 (blanc) n'est elle pas plutôt " aucune couleur" ? R : ça pourrait-être la cellule sans couleur. Es-que ça changerais quelque chose ?
Q : Sinon est-elle une mise en forme conditionnelle de la valeur de la cellule ? R : non , c’est la colorisation suite à un traitement qui pourrait mettre la cellule sous n’importe quelle forme.
Bien cordialement- Re,
Faut-il mettre Application.screenupdating= true en fin de procédure ?
Non, car tu rends la main au système à la fin de la macro (Source: Laurent Longre)
la couleur 2 (blanc) n'est elle pas plutôt " aucune couleur" ? R : ça pourrait-être la cellule sans couleur. Es-que ça changerais quelque chose ?
Oui , la macro est plus simple car il n'y aurait pas de test à faire sur la couleur car il y a une différence MSOffice entre blanc et sans couleur...
colorindex blanc=0
pas de couleur colorindex= -4142
----------
taille maxi de "plages" ?
Pour déterminer "plages"
peut-^tre +simplementadresse = Range("B2")
Set plages = Range(adresse) - Re,
Merci pour cette proposition de simplification que j'ai appliquée.
Pas de gain mais effectivement plus simple dans la compréhension.
Q :taille maxi de "plages" ? R: 300 lignes et 250 colonnes à partir de la cellule D4.
comment faudrait-il pratiquer si les cellule à effacer sont sans couleur ?
Bien cordialement
-
-
Bonjour à tous,
essaye de remplacer ta procédure par :Public Sub Vitesse() ' Dim contenu As Variant Dim Plages As Range 'la cellule B2 contien les coordonnées de la zone à traiter sous la forme $X$X:$X$X . Set Plages = Range([B2]) nblig = Plages.Rows.Count nbcol = Plages.Columns.Count contenu = Plages For i = 1 To nblig: For j = 1 To nbcol If Plages(i, j).Interior.ColorIndex = -4142 Then contenu(i, j) = "" Next j: Next i Range("D4").Resize(nblig, nbcol) = contenu End Sub
Cordialement-
Bonjour,
J'ai pas tous compris le fonctionnement mais le résultat est sans appel. 0,7 sec au lieu de 35 sec, même avec mes cellule en blanches, donc code -4142 remplacé par 2.
Merci beaucoup.
Bien cordialement- Bonsoir,
Tout est dans le passage par un tableau avec l'instruction contenu = Plages qui charge le contenu de Plages dans le tableau à 2 dimensions : contenu().
Le traitement est alors beaucoup plus rapide.
C'est un classique de l'accélération des traitements sur des Range().
Si tu veux plus de précisions, regarde dans le site de J. Boisgontier.
Cordialement
-
-
Peut-être en ajoutant Quick ou Speed quelque part ?