VBA rapide ou non ???

Résolu/Fermé
wire less Messages postés 230 Date d'inscription lundi 5 octobre 2009 Statut Membre Dernière intervention 29 août 2018 - Modifié par pijaku le 23/01/2015 à 07:58
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 - 23 janv. 2015 à 12:20
Bonjour,
j'ai trouvé un script super pour supprimer toutes les apostrophes d'une page excel :

Sub Apostrophe()

 For Each cell In ActiveSheet.UsedRange
  If cell.PrefixCharacter <> "" Then
   cell.Formula = cell.Formula
  End If

End sub


Mon problème est que pour ce même script, si je l'exécute dans une macro ... le script va mettre plusieurs minutes à s'exécuter.

Si j'interrompe l'exécution et que je la relance, l'exécution est quasi instantanée

Quelqu'un aurait-il une idée ??



Private Sub CommandButton1_Click()
    Call programme_1
End Sub

Sub programme_1
End sub

Sub programme_2
End sub

Sub programme_3
End sub

Sub Apostrophe
End sub




A voir également:

2 réponses

eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 257
Modifié par eriiic le 22/01/2015 à 12:43
Bonjoiur,

C'est plus rapide la 2nde fois car ce qui est déjà fait n'est plus à faire.

Cette version sera plus rapide dans certains cas :
Sub Apostrophe()
    Dim cell As Range
        Application.ScreenUpdating = False
    For Each cell In ActiveSheet.UsedRange.SpecialCells(xlCellTypeConstants, xlTextValues)
        If cell.PrefixCharacter <> "" Then
            cell.Formula = cell.Formula
        End If
    Next cell
End Sub

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
0
wire less Messages postés 230 Date d'inscription lundi 5 octobre 2009 Statut Membre Dernière intervention 29 août 2018 5
22 janv. 2015 à 14:28
Merci Eriiic.
"C'est plus rapide la 2nde fois car ce qui est déjà fait n'est plus à faire. "
:-/ Malheureusement c'est pas si simple !

Lorsque j'exécute la macro depuis mon bouton de commande, je voie en temps réel les lignes de mon tableau Excel se mettre à jour.

J'appuie sur "Escape" , je vais dans le déboguer VBA et je relance le scripte ... et VRAOUM ... l'exécution se fini quasiment instantanément ! (au lieu d'une minute si je ne fait rien)
0
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 257
22 janv. 2015 à 16:09
Quid de la version que je te propose ?
Et as-tu des formules utilisant les cellules appelées à être modifiées ?
0
wire less Messages postés 230 Date d'inscription lundi 5 octobre 2009 Statut Membre Dernière intervention 29 août 2018 5
22 janv. 2015 à 16:50
Oui, j'utilise bien la version que tu m'as proposé.

C'est effectivement plus rapide. Mais je n'arrive pas à comprendre pourquoi le fait d'interrompre le script puis de le relancer le rend plus rapide !!

Bon, sinon, 1 minute c'est pas la mort (bien que je ne sois qu'au début de ma macro et que je dois encore implémenter des fonction)

thx
0
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 257
22 janv. 2015 à 18:35
Je te l'ai dit ce qui est fait n'est plus à faire.
Ecrire dans une cellule est très gourmand et là ce n'est fait que si c'est nécessaire.
Maintenant tu peux encore réduire en restreignant à la plage où tu es susceptible de rencontrer ces '.
Sinon ne répond aux questions que si tu veux...

eric
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 757
Modifié par pijaku le 23/01/2015 à 08:24
Bonjour,
Mes meilleurs voeux pour 2015.

Pour compléter la réponse d'Eriiic (salutations, comment va? je te sens un peu tendu en ce moment, non?), VBA n'est pas rapide. Ca c'est un fait acquis, tout le monde le sait.

Il existe néanmoins des "astuces" pour accélérer l'exécution d'une fonction.
La première Eriiic te l'a donnée : désactiver le rafraichissement de l'écran :
Application.ScreenUpdating = False

Une deuxième piste, également évoquée par Eriiic, consiste à ne pas agir directement sur les cellules (Ecrire dans une cellule est très gourmand). Il te faut à ce moment connaitre un minimum de choses sur les variables tableaux.
Le principe :
- stocker les données de ta feuille dans une variable tableau,
- modifier les données dans cette variable,
- restituer les données dans la feuille.

De plus, tu dis : bien que je ne sois qu'au début de ma macro et que je dois encore implémenter des fonction
Je te recommande donc fortement d'aller te renseigner sur ce type de variable. Si tu as d'autres traitements à réaliser, pour accélérer la procédure, il ne faut pas boucler 15 fois sur les données pour faire 15 traitements, mais boucler une fois et appliquer les 15 traitements avant restitution...

Bonne continuation.

🎼 Cordialement,
Franck 🎶
0
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 257
23 janv. 2015 à 12:20
Salut pijaku,

Un post de 2 lignes avec 2 questions courtes et une seule réponse c'est clair que ça désespère...
Bonne journée :-)
eric
0