Optimisation de la durré d’une focntion

Résolu/Fermé
mijean94 Messages postés 394 Date d'inscription mercredi 16 décembre 2015 Statut Membre Dernière intervention 8 novembre 2021 - Modifié par crapoulou le 5/12/2016 à 00:13
mijean94 Messages postés 394 Date d'inscription mercredi 16 décembre 2015 Statut Membre Dernière intervention 8 novembre 2021 - 5 déc. 2016 à 21:09
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 ""
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
A voir également:

3 réponses

michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
Modifié par michel_m le 5/12/2016 à 08:50
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
0
mijean94 Messages postés 394 Date d'inscription mercredi 16 décembre 2015 Statut Membre Dernière intervention 8 novembre 2021 10
5 déc. 2016 à 10:38
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
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303 > mijean94 Messages postés 394 Date d'inscription mercredi 16 décembre 2015 Statut Membre Dernière intervention 8 novembre 2021
Modifié par michel_m le 5/12/2016 à 12:07
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 +simplement
adresse = Range("B2")
Set plages = Range(adresse)
0
mijean94 Messages postés 394 Date d'inscription mercredi 16 décembre 2015 Statut Membre Dernière intervention 8 novembre 2021 10 > michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023
5 déc. 2016 à 13:47
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
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303 > mijean94 Messages postés 394 Date d'inscription mercredi 16 décembre 2015 Statut Membre Dernière intervention 8 novembre 2021
Modifié par michel_m le 5/12/2016 à 14:08
déjà dans ta plage

fais des test cellule vide ou avec une donnée avec cette macro

Sub essai()
Msgbox Range("B3").Interior.ColorIndex '("B3" pour l'exemple !)
End Sub

si on a -4142 cellule non colorée
si on a 2 couleur blanche
0
mijean94 Messages postés 394 Date d'inscription mercredi 16 décembre 2015 Statut Membre Dernière intervention 8 novembre 2021 10 > michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023
5 déc. 2016 à 15:42
re,

j'ai pas bien compris l'objectif de cette demande ?

Pour le test, actuellement je trouve bien 2 sur les cellules à supprimer.

Dans tous les cas mes cellule à effacer sont de couleur blanches, mais je peut faire en sorte qu'elles soient non colorées.

Bien cordialement
0
JvDo Messages postés 1978 Date d'inscription mercredi 27 juillet 2005 Statut Membre Dernière intervention 28 septembre 2020 856
Modifié par JvDo le 5/12/2016 à 17:36
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
0
mijean94 Messages postés 394 Date d'inscription mercredi 16 décembre 2015 Statut Membre Dernière intervention 8 novembre 2021 10
5 déc. 2016 à 19:28
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
0
JvDo Messages postés 1978 Date d'inscription mercredi 27 juillet 2005 Statut Membre Dernière intervention 28 septembre 2020 856 > mijean94 Messages postés 394 Date d'inscription mercredi 16 décembre 2015 Statut Membre Dernière intervention 8 novembre 2021
5 déc. 2016 à 20:58
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
0
mijean94 Messages postés 394 Date d'inscription mercredi 16 décembre 2015 Statut Membre Dernière intervention 8 novembre 2021 10 > JvDo Messages postés 1978 Date d'inscription mercredi 27 juillet 2005 Statut Membre Dernière intervention 28 septembre 2020
5 déc. 2016 à 21:09
Re,

Merci encore pour toutes ces précisions ci précieuses ? je vais prendre le temps de regarder ce site car le résultat est formidable.

Bien cordialement
0
Raymond PENTIER Messages postés 58387 Date d'inscription lundi 13 août 2007 Statut Contributeur Dernière intervention 16 avril 2024 17 087
5 déc. 2016 à 02:14
Peut-être en ajoutant Quick ou Speed quelque part ?
-4
mijean94 Messages postés 394 Date d'inscription mercredi 16 décembre 2015 Statut Membre Dernière intervention 8 novembre 2021 10
5 déc. 2016 à 10:40
bonjour,

j'ai essayé avec Rapidman mais ça ne marche pas ?

Bien cordialement
0
Raymond PENTIER Messages postés 58387 Date d'inscription lundi 13 août 2007 Statut Contributeur Dernière intervention 16 avril 2024 17 087 > mijean94 Messages postés 394 Date d'inscription mercredi 16 décembre 2015 Statut Membre Dernière intervention 8 novembre 2021
Modifié par Raymond PENTIER le 5/12/2016 à 18:09
Dommage !
Tu as observé qu'il y a 4 CCMistes qui n'ont pas le même sens de l'humour que toi et moi ?
Amitiés.
0