Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Sub très lente - comment optimiser

5 réponses
Avatar
J
Bonjour à tous
Dans un fichier d'une soixantaine de feuilles je récupère quelques données sur
chaque feuille que je colle dans une feuille appelée "Etat".
Avant optimisation ma sub tournait en 45 secondes, après en 35, mais c'est bien
long :-[
Quelqu'un aurait une idée??
merci
J@@ (Je n'aurai pas accès au forum pendant les 18 prochaines heures, merci
d'être patient pour le retour)

'******
Sub RecupDonnees()
Dim Feuille As Worksheet
Dim ActivationEvents As Long
Dim ModeRecalcul As Long

Sheets("Etat").Select
ActiveSheet.Unprotect
Range("B5:N58").ClearContents

Application.ScreenUpdating = False
ModeRecalcul = Application.Calculation
Application.Calculation = xlCalculationManual
ActivationEvents = Application.EnableEvents
Application.EnableEvents = False

For Each Feuille In ActiveWorkbook.Worksheets
If Feuille.Name <> "ALIRE" _
And Feuille.Name <> "Etat" Then
With Feuille
Worksheets("Etat").Range("B100").End(xlUp)(2).Value = .Name
Worksheets("Etat").Range("C100").End(xlUp)(2).Value = .[B27]
Worksheets("Etat").Range("D100").End(xlUp)(2).Value = .[B29]
Worksheets("Etat").Range("E100").End(xlUp)(2).Value = .[B28]
Worksheets("Etat").Range("F100").End(xlUp)(2).Value = .[B31]
Worksheets("Etat").Range("G100").End(xlUp)(2).Value = .[C27]
Worksheets("Etat").Range("H100").End(xlUp)(2).Value = .[C29]
Worksheets("Etat").Range("I100").End(xlUp)(2).Value = .[C28]
Worksheets("Etat").Range("J100").End(xlUp)(2).Value = .[C33]
Worksheets("Etat").Range("K100").End(xlUp)(2).Value = .[D27]
Worksheets("Etat").Range("L100").End(xlUp)(2).Value = .[D29]
Worksheets("Etat").Range("M100").End(xlUp)(2).Value = .[D28]
Worksheets("Etat").Range("N100").End(xlUp)(2).Value = .[D33]
End With
End If
Next Feuille

Application.EnableEvents = ActivationEvents
Application.Calculation = ModeRecalcul

ActiveSheet.Protect
End Sub
'******

5 réponses

Avatar
MichDenis
3 suggestions :
A )
Cette syntaxe est supérieur en rapidité à ceci :
.[B27] -> tu devrais utiliser ce type de syntaxe .Range("B27")

B ) Si tes enregistrements ont lieu sur la même ligne pour tous les
éléments d'une même boucle, pourquoi ne pas utiliser une variable
au lieu de réévaluer la cellule suivante disponible sur la colonne

Dim Ligne as Long
Ligne = Worksheets("Etat").Range("B100").End(xlUp)(2).Value
Et pour tes écritures dans la boucle pour chacun des items :
Worksheets("Etat").Range("B" & ligne) = .Name

C ) Remplace Worksheets("Etat"). par une variable
dim Sh as Worksheet
Set Sh = Worksheets("Etat")
Et dans ton code, tu remplaces ceci
Worksheets("Etat").Range("B100").End(xlUp)(2).Value = .Name
Par
Sh.Range("B" & ligne) = .Name




"J@@"

nce.com> a écrit dans le message de news: %
Bonjour à tous
Dans un fichier d'une soixantaine de feuilles je récupère quelques données sur
chaque feuille que je colle dans une feuille appelée "Etat".
Avant optimisation ma sub tournait en 45 secondes, après en 35, mais c'est bien
long :-[
Quelqu'un aurait une idée??
merci
J@@ (Je n'aurai pas accès au forum pendant les 18 prochaines heures, merci
d'être patient pour le retour)

'******
Sub RecupDonnees()
Dim Feuille As Worksheet
Dim ActivationEvents As Long
Dim ModeRecalcul As Long

Sheets("Etat").Select
ActiveSheet.Unprotect
Range("B5:N58").ClearContents

Application.ScreenUpdating = False
ModeRecalcul = Application.Calculation
Application.Calculation = xlCalculationManual
ActivationEvents = Application.EnableEvents
Application.EnableEvents = False

For Each Feuille In ActiveWorkbook.Worksheets
If Feuille.Name <> "ALIRE" _
And Feuille.Name <> "Etat" Then
With Feuille
Worksheets("Etat").Range("B100").End(xlUp)(2).Value = .Name
Worksheets("Etat").Range("C100").End(xlUp)(2).Value = .[B27]
Worksheets("Etat").Range("D100").End(xlUp)(2).Value = .[B29]
Worksheets("Etat").Range("E100").End(xlUp)(2).Value = .[B28]
Worksheets("Etat").Range("F100").End(xlUp)(2).Value = .[B31]
Worksheets("Etat").Range("G100").End(xlUp)(2).Value = .[C27]
Worksheets("Etat").Range("H100").End(xlUp)(2).Value = .[C29]
Worksheets("Etat").Range("I100").End(xlUp)(2).Value = .[C28]
Worksheets("Etat").Range("J100").End(xlUp)(2).Value = .[C33]
Worksheets("Etat").Range("K100").End(xlUp)(2).Value = .[D27]
Worksheets("Etat").Range("L100").End(xlUp)(2).Value = .[D29]
Worksheets("Etat").Range("M100").End(xlUp)(2).Value = .[D28]
Worksheets("Etat").Range("N100").End(xlUp)(2).Value = .[D33]
End With
End If
Next Feuille

Application.EnableEvents = ActivationEvents
Application.Calculation = ModeRecalcul

ActiveSheet.Protect
End Sub
'******
Avatar
J
Incroyable
Ce message *vient* de s'afficher sous mes yeux ébahis : le Dim 14 à 16:42, heure
locale!!
Non seulement ma proc est lente, mais mon Thunderbird aussi :-{
Je tire l'échelle.
J@@

MichDenis wrote:
3 suggestions :
A )
Cette syntaxe est supérieur en rapidité à ceci :
..[B27] -> tu devrais utiliser ce type de syntaxe .Range("B27")

B ) Si tes enregistrements ont lieu sur la même ligne pour tous les
éléments d'une même boucle, pourquoi ne pas utiliser une variable
au lieu de réévaluer la cellule suivante disponible sur la colonne

Dim Ligne as Long
Ligne = Worksheets("Etat").Range("B100").End(xlUp)(2).Value
Et pour tes écritures dans la boucle pour chacun des items :
Worksheets("Etat").Range("B" & ligne) = .Name

C ) Remplace Worksheets("Etat"). par une variable
dim Sh as Worksheet
Set Sh = Worksheets("Etat")
Et dans ton code, tu remplaces ceci
Worksheets("Etat").Range("B100").End(xlUp)(2).Value = .Name
Par
Sh.Range("B" & ligne) = .Name




"J@@"

nce.com> a écrit dans le message de news: %
Bonjour à tous
Dans un fichier d'une soixantaine de feuilles je récupère quelques données sur
chaque feuille que je colle dans une feuille appelée "Etat".
Avant optimisation ma sub tournait en 45 secondes, après en 35, mais c'est bien
long :-[
Quelqu'un aurait une idée??
merci
J@@ (Je n'aurai pas accès au forum pendant les 18 prochaines heures, merci
d'être patient pour le retour)

'******
Sub RecupDonnees()
Dim Feuille As Worksheet
Dim ActivationEvents As Long
Dim ModeRecalcul As Long

Sheets("Etat").Select
ActiveSheet.Unprotect
Range("B5:N58").ClearContents

Application.ScreenUpdating = False
ModeRecalcul = Application.Calculation
Application.Calculation = xlCalculationManual
ActivationEvents = Application.EnableEvents
Application.EnableEvents = False

For Each Feuille In ActiveWorkbook.Worksheets
If Feuille.Name <> "ALIRE" _
And Feuille.Name <> "Etat" Then
With Feuille
Worksheets("Etat").Range("B100").End(xlUp)(2).Value = .Name
Worksheets("Etat").Range("C100").End(xlUp)(2).Value = .[B27]
Worksheets("Etat").Range("D100").End(xlUp)(2).Value = .[B29]
Worksheets("Etat").Range("E100").End(xlUp)(2).Value = .[B28]
Worksheets("Etat").Range("F100").End(xlUp)(2).Value = .[B31]
Worksheets("Etat").Range("G100").End(xlUp)(2).Value = .[C27]
Worksheets("Etat").Range("H100").End(xlUp)(2).Value = .[C29]
Worksheets("Etat").Range("I100").End(xlUp)(2).Value = .[C28]
Worksheets("Etat").Range("J100").End(xlUp)(2).Value = .[C33]
Worksheets("Etat").Range("K100").End(xlUp)(2).Value = .[D27]
Worksheets("Etat").Range("L100").End(xlUp)(2).Value = .[D29]
Worksheets("Etat").Range("M100").End(xlUp)(2).Value = .[D28]
Worksheets("Etat").Range("N100").End(xlUp)(2).Value = .[D33]
End With
End If
Next Feuille

Application.EnableEvents = ActivationEvents
Application.Calculation = ModeRecalcul

ActiveSheet.Protect
End Sub
'******




Avatar
Francois L
Incroyable
Ce message *vient* de s'afficher sous mes yeux ébahis : le Dim 14 à
16:42, heure locale!!
Non seulement ma proc est lente, mais mon Thunderbird aussi :-{


Bonsoir,

Ton Thunderbird, il interroge quel serveur de news ?

--
François L

Avatar
J
Bonsoir François
Mon Tbird interroge directement le serveur de MS en NNTP, à ce qu'il me semble :
news.microsoft.com
mais c'est ma 1ère fois que cela m'arrive.
C'est juste gênant car mon absence de réponse me fait passer pour un indélicat,
alors que nenni, point ne suis...
@+
J@@


Francois L wrote:
Incroyable
Ce message *vient* de s'afficher sous mes yeux ébahis : le Dim 14 à
16:42, heure locale!!
Non seulement ma proc est lente, mais mon Thunderbird aussi :-{


Bonsoir,

Ton Thunderbird, il interroge quel serveur de news ?



Avatar
FxM
Bonjour J@@,

Tu n'es pas seul : le phénomène s'est produit hier pour un autre
message. Je penche pour un serveur qui tousse ou un envoi tardif de la
part de l'utilisateur.

@+
FxM


Bonsoir François
Mon Tbird interroge directement le serveur de MS en NNTP, à ce qu'il me
semble :
news.microsoft.com
mais c'est ma 1ère fois que cela m'arrive.
C'est juste gênant car mon absence de réponse me fait passer pour un
indélicat, alors que nenni, point ne suis...
@+
J@@


Francois L wrote:
Incroyable
Ce message *vient* de s'afficher sous mes yeux ébahis : le Dim 14 à
16:42, heure locale!!
Non seulement ma proc est lente, mais mon Thunderbird aussi :-{


Bonsoir,

Ton Thunderbird, il interroge quel serveur de news ?