Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2016 méthode clear et range trop grand

sebastien450

XLDnaute Occasionnel
Bonjour,
J'ai la macro suivant qui fonctionne mais bien sur ne convient pas pour une plage de donnée aussi importante.
Comment faire ? Un tableau géant ? =)

VB:
Application.ScreenUpdating = False: Application.EnableEvents = False: Application.Calculation = xlCalculationManual
Dim Cel As Range

    For Each Cel In Range("D5:EHL222") ' definir le range
    If Cel.Interior.ColorIndex <> 43 Then Cel.Clear ' si pas en vert => out
    Next
Application.EnableEvents = True: Application.ScreenUpdating = True: Application.Calculation = xlCalculationAutomatic

Merci à vous,
 

eriiic

XLDnaute Barbatruc
Bonjour,

'ne convient pas' ne veut pas dire grand chose...
Si c'est une histoire de vitesse, agrandi un range de chaque cellule concernée avec UInion() et fait un .Clear unique à la fin.
eric
 

Staple1600

XLDnaute Barbatruc
Bonjour le fil, sebastien450, eriiiic

Dans les versions récentes d'Excel, on peut utiliser le filtre automatique pour filtrer sur une couleur.
On peut donc le piloter par VBA et effacer la plage filtrée selon la couleur.
 

job75

XLDnaute Barbatruc
Bonsoir sebastien450, eriiiic, JM,

La méthode Union pédale dans la choucroute si la plage est constituée de plusieurs centaines ou milliers de zones disjointes.

Il faut décharger régulièrement la plage :
VB:
Sub a()
Dim decharge&, c As Range, P As Range, n&
decharge = 100 'modifiable
With Application: .ScreenUpdating = False: .EnableEvents = False: .Calculation = xlCalculationManual: End With
For Each c In Range("D5:EHL222")
    If c.Interior.ColorIndex <> 43 Then n = n + 1: Set P = Union(IIf(P Is Nothing, c, P), c)
    If n = decharge Then P.Clear: Set P = Nothing: n = 0
Next
If n Then P.Clear
Application.Calculation = xlCalculationAutomatic: Application.EnableEvents = True
End Sub
A+
 
Dernière édition:

sebastien450

XLDnaute Occasionnel
Bonjour,
En effet je n'ai pas été explicite mais il s'agit d'une durée d'exécution.
J'avoue ne pas comprendre la méthode Union, pourtant je la voit depuis bien longtemps...

J'ai une première question sur le code : Pourquoi ne pas avoir mis le code suivant en tout début d'exécution

VB:
With Application: .ScreenUpdating = False: .EnableEvents = False: .Calculation = xlCalculationManual: End With

Et enfin , pourquoi rappeler le code suivant juste avant la fermeture :
Code:
If n Then P.Clear

merci pour votre aide,
 

job75

XLDnaute Barbatruc
1 : en général au début des macros on déclare et initialise les variables, ici decharge est un paramètre

2 : parce que des cellules ont été comptées et n'ont pas été effacées dans la boucle car n < decharge.
 

eriiic

XLDnaute Barbatruc
La méthode Union pédale dans la choucroute si la plage est constituée de plusieurs centaines ou milliers de zones disjointes.
Pour confirmer...
Je m'étais amusé à mesurer les temps pour 100 ajouts de cellules individuelles.
On voit qu'il croit constamment :


nbt
100​
0.008​
200​
0.016​
300​
0.039​
400​
0.063​
500​
0.109​
600​
0.148​
700​
0.203​
800​
0.266​
900​
0.344​
1000​
0.469​
et devient rapidement rédhibitoire.
On atteint la seconde vers 1500
eric
 

Discussions similaires

Réponses
7
Affichages
327
Réponses
28
Affichages
1 K
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…