Temps macro

nextrevolution

XLDnaute Occasionnel
Bonjour à tous,

J'ai une macro qui me permet de compter combien de cellule sont identique. Le probléme la macro est assez longue à être executer (environ 20 secondes sur mon vieux pc) et j'ai besoin que ca soit pas plus long que quelques seconde.

Y a t'il un moyen de l'améliorer?

Code:
Sub compter()
Dim plage As Range
Dim cel As Range
Dim n As Long


Set plage = Application.Sheets("présence").Range("z1:z65536")
For Each cel In plage
If cel.Value = Sheets("présence").Range("e1") Then
n = n + 1 'compteur
End If
Next
Label41 = n
End Sub

En vous remerciant pour les différents réponses que vous pouvez m'apporter.
 

Pierrot93

XLDnaute Barbatruc
Re : Temps macro

Bonjour,

peut être pas utile de lire toutes les lignes, simplement de la ligne 1 à la dernière ligne non vide de la colonne z, définis la plage ainsi :

Code:
With Sheets("présence")
    Set plage = .Range("z1:z" & .Range("z65536").End(xlUp).Row)
End With

bonne fin d'après midi
@+
 
C

Compte Supprimé 979

Guest
Re : Temps macro

Salut NextRevolution,

Pour raccourcir le temps, tu peux déjà travaillé sur une zone moins longue
sans passer par une variable objet
Code:
Sub compter()
Dim Cel as Range, DerLig as long
Dim n As Long
 
DerLig = Sheets("présence").Range("Z" & Rows.Count).End(xlup).row
For Each Cel In Sheets("présence").Range("Z1:Z" & DerLig)
  If Cel.Value = Sheets("présence").Range("e1") Then
    n = n + 1 'compteur
  End If
Next
Label41 = n
End Sub

A tester ;)

A+

Edit : oups, salut Pierrot93 ;)
 

Cousinhub

XLDnaute Barbatruc
Re : Temps macro

Bonsoir,

Bonsoir Pierrot et Bruno :):)

pour raccourcir encore :

Code:
Sub compter()
Dim plage As Range
Dim n As Long

With Sheets("présence")
    Set plage = .Range("Z1:Z" & .[Z65000].End(xlUp).Row)
    n = Application.CountIf(plage, .[E1])
End With
Label41 = n
End Sub
 

gwenlorin

XLDnaute Occasionnel
Re : Temps macro

Bonjour,

J'ai ajouté des lignes pour avoir une estimation de la durée d'éxécution (tient compte de l'horloge du processeur).

Au final sur la base du code de bhbh :

Code:
Private Declare Function QueryPerformanceCounter Lib "Kernel32" (X As Currency) As Boolean
Private Declare Function QueryPerformanceFrequency Lib "Kernel32" (X As Currency) As Boolean

Sub compter()
Dim plage As Range
Dim n As Long

QueryPerformanceCounter Debut

With Sheets("présence")
    Set plage = .Range("Z1:Z" & .[Z65000].End(xlUp).Row)
    n = Application.CountIf(plage, .[E1])
End With

QueryPerformanceCounter Fin
QueryPerformanceFrequency Freq
Label41 = n

MsgBox "Durée de la procédure = " & Format(((Fin - Debut) / Freq), "0.00") & " s"
End Sub
 
Dernière édition:

gwenlorin

XLDnaute Occasionnel
Re : Temps macro

bonsoir bhbh,
je viens de relire mon code et en fait ... moi non plus j'y arrive pas :eek:

Je crois que je suis aller un peu vite et n'avais pas tenu compte de ton "CountIf" qui se suffit à lui-même.

j'ai modifié mon post précédent en gardant juste le temps d'éxécution
 
Dernière édition:

nextrevolution

XLDnaute Occasionnel
Re : Temps macro

Bonjour gwenlorin, bhbh, brunoM45 et pierrot93

Merci pour toutes vos réponses, maintenant le temps de procédure est de 0.00 seconde lol. Dans ma macro j'ai pas vraiment besoin de savoir le temps mais je garde de coté cette macro qui peux un jour mettre utile.

Encore merci à vous tous.

Par hasard pourriez vous m'aider sur ce post?

https://www.excel-downloads.com/threads/recherche-vba.123042/

Bonne journée
 

Discussions similaires

Réponses
2
Affichages
172
Réponses
1
Affichages
194
Réponses
7
Affichages
391