OPTIMISER MACRO

KTM

XLDnaute Impliqué
salut cher Forum
j'ai une table qui comporte 23 colonnes et 4500 lignes sur laquelle je dois travailler.
j'ai élaboré la macro si dessous qui doit supprimer les colonnes Q,R,S et supprimer toutes les données de cette table sauf les entêtes
le probleme est que la macro met des minutes à s'exécuter.
je ne sais pas si cette lenteur est due a mon PC ( Dual Core 4G de RAM) ou si c'est l'architecture de ma macro qui en est la cause.
Je voudrais que vous aidiez a optimiser la macro si possible.

Application.ScreenUpdating = False
Dim a As Integer
Sheets("E").select
Columns("Q:S").Delete Shift:=xlToLeft
a = Sheets("E").Range("A" & Rows.Count).End(xlUp).Row
Sheets("E").Range("A2:T" & a).Delete
Application.ScreenUpdating = True
 

Staple1600

XLDnaute Barbatruc
Re

Non, testes ce code sur un classeur vierge avec une feuille nommée E.
Sur mon PC, la suppression est quasi-immédiate.
Code:
Sub Macro1()
PretTest
MsgBox "RAZ Feuille E?", vbOKOnly
With Sheets("E")
.Columns("Q:S").Delete Shift:=xlToLeft
.Rows("2:" & Rows.Count - 1).Clear
End With
End Sub
Private Sub PretTest()
'Cette macro crée une base fictive
[A1] = "ITEM1"
[A1].AutoFill Destination:=Range("A1:T1"), Type:=xlFillDefault
[A2:T5000] = "=ROW()*COLUMN()"
[A2:T5000].Value = [A2:T5000].Value
End Sub
 

eriiic

XLDnaute Barbatruc
Bonjour,

Essaie la complète :
VB:
' appel : OptimiseVBA sh, True [, False]
Sub OptimiseVBA(sh As Worksheet, ok As Boolean, Optional events As Boolean = False)
    ' sh : feuille à traiter
    ' ok : True : suspendre recalculs, False : rétablir recalculs
    ' noEvents : True : suspendre événements, False : rétablir événements
    With Application
        .Calculation = IIf(ok, xlCalculationManual, xlCalculationAutomatic)
        .EnableEvents = events Or Not ok
        .EnableAnimations = Not ok
    End With
    With sh
        .DisplayPageBreaks = Not ok
        .EnableCalculation = Not ok ' feuille avec données sources contenues dans des fichiers csv ou txt externes.
        ' >=2007: calcul formats conditionnels. = True entraine le recalcul de toutes les formules de la feuille
        If Val(Application.Version) >= 12 Then .EnableFormatConditionsCalculation = Not ok
    End With
End Sub
Tu appelles la fonction avec True avant de supprimer, avec False à la fin.
eric
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re

eriiiic
Je viens de tester ton code sur Excel 2013
Et j'ai une erreur d’exécution 13, incompatibilité de type sur cette ligne
If Application.Version >= 12 Then .EnableFormatConditionsCalculation = Not ok

Je l'ai donc mis en commentaire pour finir le test.

Et sur mon classeur de test avec ma macro de suppression du message#6, je ne perçois pas visuellement de différence de vitesse d’exécution (si on ajoute ou pas OptimiseVBA)
Et toi?
 
Dernière édition:

eriiic

XLDnaute Barbatruc
Bonjour,

Rassures-moi,la macro du post#6 supprime bien les données quasi-instantanément, non ?
Elle sert juste à désactiver/réactiver le maximum d'options pouvant influencer la vitesse comme tu l'as constaté ensuite.
Si tu testes sur un classeur vierge ça me parait normal de n'avoir aucune amélioration.

Pour EnableFormatConditionsCalculation j'excluerai cette version si ça se confirme.
Ca a sans doute été remplacé par autre chose, je rechercherai. A voir ce que ça donne sur les versions suivantes qui seront sans doute concernées.
eric
 

Staple1600

XLDnaute Barbatruc
Bonjour

eriiiic
Je parlais de ma macro, celle que j'ai postée au post#6
Je voulais savoir si sur ton PC aussi la suppression est "immédiate" ?
Mon classeur de test était vierge mais plus quand la macro PretTest a fait son office ;)
D'ou mes interrogations précédentes
Car avec ou sans OptimiseVBA, chez moi, la suppression des données (donc 5000 lignes) est quasi-immédiate.

Contrairement à qu'observe KTM.

PS: Sur Excel 2013, EnableFormatConditionsCalculation est toujours disponible
Et j'ai testé ton code comme suit avec mon code, quand l'erreur se produit
Code:
Sub Test()
OptimiseVBA Sheets("E"), True
With Sheets("E")
.Columns("Q:S").Delete Shift:=xlToLeft
.Rows("2:" & Rows.Count - 1).Clear
End With
OptimiseVBA Sheets("E"), False
End Sub
Et ce sur une feuille sur laquelle j'avais précédemment exécuté PreTest pour "remplir" la feuille.
 

eriiic

XLDnaute Barbatruc
Je n'avais pas prêté attention que tu avais une proc séparée qui construisait une feuille.
Oui, chez moi (2010) c'est quasi instantané aussi.

PS: Sur Excel 2013, EnableFormatConditionsCalculation est toujours disponible
Et j'ai testé ton code comme suit avec mon code, quand l'erreur se produit
Ah, j'avais déjà modifié mon code... :)
C'est quelle erreur que tu obtiens ?
J'ai dans l'idée que la gestion SDI ne doit pas y être étrangère, mais ça risque d'être coton à démêler sans avoir cette version.
Par curiosité ce n'est pas en ayant une autre feuille d'active des fois ?
eric
 

eriiic

XLDnaute Barbatruc
Ben c'est complètement idiot, elle est folle ta machine :)
Peut-être que 2013 ne fait plus la conversion automatique dans ce cas, bizarre.
Et avec :
VB:
If CLng(Application.Version) >= 12 Then .EnableFormatConditionsCalculation = Not ok
?
Sinon si tu peux découper en 2 lignes pour confirmer la partie qui fait l'erreur 13 stp
 

Discussions similaires

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 196
Messages
2 086 101
Membres
103 116
dernier inscrit
kutobi87