Question en programmation VBA (optimisation)

Alphonss

XLDnaute Nouveau
Bonjour,


1ere Question : o)
J'aimerais savoir si il est vrai qu'il y a une différence de vitesse d'éxécution entre ces 2 codes. Sur le site ou j'ai lu ceci il y était écrit que la vitesse d'éxécution du 2eme code était 1,3 fois plus rapide que le premier code. Cependant je trouve le 1er code beaucoup plus clair et lisible et vous pose donc la question si il est effectivement vrai que la vitesse d'éxécution de la macro est 1,3 fois plus rapide (ce qui n'est pas négligeable pour moi). Par ailleurs je remarque qu'il n'y a pas de "End If" à la fin du 2eme code. ESt-ce normal

'**************
'1er code
If (condition) Then
(instructions1)
Else
(instructions2)
End If
'**************

'****************************************
'2eme code
If (condition) Then (instructions1) Else (instructions2)
'****************************************
__________________________________________________________

2eme Question : o)
Ma 2eme question est de savoir en quoi ces 3 codes diffèrent-ils et lequel serait le mieux adapté pour augmenter la vitesse d'éxécution.
'*************************
'1er code
For j = 10 To 1 Step -1
If Cells(j, 1) = "A" Then
Rows(j).Delete Shift:=xlUp
End If
If Cells(j, 1) = "B" Then
Rows(j).Delete Shift:=xlUp
End If
Next j
'*************************

'*************************
'2eme code
For j = 10 To 1 Step -1
If Cells(j, 1) = "A" Then
Rows(j).Delete Shift:=xlUp
Else If Cells(j, 1) = "B" Then
Rows(j).Delete Shift:=xlUp
End If
Next j
'*************************

'**********************************
'3eme code
For j = 10 To 1 Step -1
If Cells(j, 1) = "A" Or Cells(j, 1) = "B" Then
Row(j).Delete Shift:=xlUp
End If
Next j
'**********************************

Voila Merci d'avance : o)

Alphons
 

Alphonss

XLDnaute Nouveau
Re : Question en programmation VBA (optimisation)

Re^^,

Après quelques tests, je me suis rendu compte qu'il n'y pas de changements notables au niveau de la vitesse d'éxécution pour les 2 structures de "If" par rapport à ma 1ere question. En revanche ma 2eme question reste entièrement ouverte et je suis vraiment intéressé par la réponse
 
Dernière édition:

skoobi

XLDnaute Barbatruc
Re : Question en programmation VBA (optimisation)

Bonjour Alphonss,

je dirais que les 2eme et 3eme ont des vitesse équivalentes. La 3eme a le mérite d'être un petit peut plus courte en écriture.
De toute façon la 1ere sera plus lente. Pourquoi?
Plusieurs structures de type
Code:
If ...... Then
.......
End If
If ...... Then
.......
End If
If ...... Then
.......
End If
seront analysées les une après les autres ce qui n'est pas le cas pour cette structure:
Code:
If ...... Then
.......
ElseIf .... Then
.........
ElseIf .... Then
 .........
 ElseIf .... Then
 .........
 End If
En effet, dès d'une des conditions est vrai, on sort de la structure.
Cela peut se constater en exécutant la macro en pas à pas (F8).
Donc là le code aura pris de l'avance sur le premier si je puis dire.
Bien sûr, dans une petite macro, les différences de temps d'exécution sont infimes.
Espérant avoir éclairé ta lanterne.
 
Dernière édition:

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Re : Question en programmation VBA (optimisation)

Bonjour,

Sur ces exemples, ce sont les opérations sur le tableur qui ralentissent (suppression de lignes).

Il faut placer ces instructions en début de programme:
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

En fin de programme:
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic

JB
 

Alphonss

XLDnaute Nouveau
Re : Question en programmation VBA (optimisation)

Re,

Merci JB mais en fait je n'ai copié q'un seul petit bout de mon code et encore je l'ai simplifié pour seulement savoir quelle est la structure du If la plus adapté et la plus rapide. Mon code comporte bien tes 4 lignes de codes pour le raffraichissement automatique de l'écran et pour le recalcul automatique. En tout cas merci quand même : o) Cependant j'ai encore 1 ou 2 petites questions.

1) Pourquoi les 2 codes utilisant des "ElseIf" ne fonctionnent-ils pas ? : problème de syntaxe j'imagine. L'erreur qu'il me propose est "Else sans If".
2) Quel serait le meilleur code c'est à dire le plus rapide en terme d'éxécution (si les 5 codes fonctionnait) ? C'est quand même étonnant que ce soit le plus long qui soit le plus rapide !

'_____________________________________________________________________________________________
'1er code : qui ne marche pas ! l'erreur qu'il me propose est : "Else sans If" (Temps éxécution : erreur)
Dim j As Long
For j = 65536 To 1 Step -1
If Cells(j, 1) = "Operator ID" Then Rows(j + 1).Delete Shift:=xlUp
ElseIf Cells(j, 1) = "Enable status" Then Rows(j).Delete Shift:=xlUp
ElseIf Cells(j, 1) = "Re-enable date" Then Rows(j).Delete Shift:=xlUp
ElseIf Cells(j, 1) = "Approval status" Then Rows(j).Delete Shift:=xlUp
ElseIf Cells(j, 1) = "Last changed" Then Rows(j).Delete Shift:=xlUp
ElseIf Cells(j, 1) = "Last sign-on" Then Rows(j).Delete Shift:=xlUp
ElseIf Cells(j, 1) = "Calculated pwd" Then Rows(j).Delete Shift:=xlUp
ElseIf Cells(j, 1) = "One-time password" Then Rows(j).Delete Shift:=xlUp
ElseIf Cells(j, 1) = "Active devices" Then Rows(j).Delete Shift:=xlUp
End If
Next j
'_____________________________________________________________________________________________

'_____________________________________________________________________________________________
'2eme code (Temps éxécution : 1,35 min)
Dim j As Long
For j = 65536 To 1 Step -1
If Cells(j, 1) = "Operator ID" Then
Rows(j + 1).Select
Selection.Delete Shift:=xlUp
End If
If Cells(j, 1) = "Enable status" Then
Rows(j).Select
Selection.Delete Shift:=xlUp
End If
If Cells(j, 1) = "Re-enable date" Then
Rows(j).Select
Selection.Delete Shift:=xlUp
End If
If Cells(j, 1) = "Approval status" Then
Rows(j).Select
Selection.Delete Shift:=xlUp
End If
If Cells(j, 1) = "Last changed" Then
Rows(j).Select
Selection.Delete Shift:=xlUp
End If
If Cells(j, 1) = "Last sign-on" Then
Rows(j).Select
Selection.Delete Shift:=xlUp
End If
If Cells(j, 1) = "Calculated pwd" Then
Rows(j).Select
Selection.Delete Shift:=xlUp
End If
If Cells(j, 1) = "One-time password" Then
Rows(j).Select
Selection.Delete Shift:=xlUp
End If
If Cells(j, 1) = "Active devices" Then
Rows(j).Select
Selection.Delete Shift:=xlUp
End If
Next j
'_____________________________________________________________________________________________

'_____________________________________________________________________________________________
'3eme code(Temps éxécution : 2,10 min)
Dim j As Long
For j = 65536 To 1 Step -1
If Cells(j, 1) = "Operator ID" Then Rows(j + 1).Delete Shift:=xlUp
If Cells(j, 1) = "Enable status" Then Rows(j).Delete Shift:=xlUp
If Cells(j, 1) = "Re-enable date" Then Rows(j).Delete Shift:=xlUp
If Cells(j, 1) = "Approval status" Then Rows(j).Delete Shift:=xlUp
If Cells(j, 1) = "Last changed" Then Rows(j).Delete Shift:=xlUp
If Cells(j, 1) = "Last sign-on" Then Rows(j).Delete Shift:=xlUp
If Cells(j, 1) = "Calculated pwd" Then Rows(j).Delete Shift:=xlUp
If Cells(j, 1) = "One-time password" Then Rows(j).Delete Shift:=xlUp
If Cells(j, 1) = "Active devices" Then Rows(j).Delete Shift:=xlUp
Next j
'_____________________________________________________________________________________________

'_____________________________________________________________________________________________
'4eme code(Temps éxécution : 2,10 min)
Dim j As Long
For j = 65536 To 1 Step -1
If Cells(j, 1) = "Operator ID" Then Rows(j + 1).Delete Shift:=xlUp
If Cells(j, 1) = "Enable status" Or Cells(j, 1) = "Re-enable date" Or Cells(j, 1) = "Approval status" Or Cells(j, 1) = "Last changed" Or Cells(j, 1) = "Last sign-on" Or Cells(j, 1) = "Calculated pwd" Or Cells(j, 1) = "One-time password" Or Cells(j, 1) = "Active devices" Then Rows(j).Delete Shift:=xlUp
Next j
'_____________________________________________________________________________________________

'_____________________________________________________________________________________________
'5eme code : qui ne marche pas encore à cause des ElseIf(Temps éxécution : erreur)
Dim j As Long
For j = 65536 To 1 Step -1
If Cells(j, 1) = "Operator ID" Then Rows(j + 1).Delete Shift:=xlUp
Elseif Cells(j, 1) = "Enable status" Or Cells(j, 1) = "Re-enable date" Or Cells(j, 1) = "Approval status" Or Cells(j, 1) = "Last changed" Or Cells(j, 1) = "Last sign-on" Or Cells(j, 1) = "Calculated pwd" Or Cells(j, 1) = "One-time password" Or Cells(j, 1) = "Active devices" Then Rows(j).Delete Shift:=xlUp
Next j
'_____________________________________________________________________________________________

Merci : o)

Alphons
 

Alphonss

XLDnaute Nouveau
Re : Question en programmation VBA (optimisation)

Re bonjour,

Après quelques test je me suis rendu compte que le temps d'éxcution de mon code variait selon si j'écrivais :

'_____________________________
'1er code
If Cells(j, 1) = "Operator ID" Then
Rows(j + 1).Select
Selection.
Delete Shift:=xlUp
End If
'_____________________________

OU
'_____________________________
'2eme code
If Cells(j, 1) = "Operator ID" Then
Rows(j + 1).Delete Shift:=xlUp
End If
'_____________________________

'______________________________________________________
'3eme code
If Cells(j, 1) = "Operator ID" Then Rows(j + 1).Delete Shift:=xlUp
'______________________________________________________

Etonnant car c'est le 1er code qui est le plus rapide. Le 2eme et le 3eme étant équivalent tout deux. Quelqu'un aurait-il l'amabilité de m'expliquer pourquoi c'est le 1er code qui a priori semble être le plus long et le plus lourd et qui pourtant est plus rapide.
Attention ! : o) mes 2 autres questions restes entièrement ouvertes :)

Merci d'avance


Alphons
 

Alphonss

XLDnaute Nouveau
Re : Question en programmation VBA (optimisation)

Re,

Tout à fait d'accord mais le seul souci c'est que ni la macro ni le document de départ ne m'appartient. Je suis dans une entreprise et je ne peux donc pas vous fournir le code dans son entier et je ne vois donc pas bien l'utilité de vous fournir un fichier attaché de 4-5 lignes. Je m'en excuse mais je ne peux déroger à la règle.
Cependant par exemple pour mes problèmes de "ElseIf" je pense que c'est surement un souci au niveau de la syntaxe mais je ne comprends pas car sur plusieurs sites internet j'ai retrouvé la même structure que j'ai utilisé. Voila enfin merci quand même si quelqu'un a une réponse à 1 de mes 3 questions il est le bienvenu^^ : o)

Bon aprem et peut être bon appétit pour certains


Alphons
 

MJ13

XLDnaute Barbatruc
Re : Question en programmation VBA (optimisation)

Re

c'est ton choiX mais celui qui veut le peut.

On ne te demande pas de données confidentielles mais juste quelques lignes bidons.

On pourra même faire une macro pour recopier 5000 fois 4 lignes.

Après, cela dépend du résultat souhaité!
 

skoobi

XLDnaute Barbatruc
Re : Question en programmation VBA (optimisation)

Bonjour Alphonss, salut Michel :),

1) Pourquoi les 2 codes utilisant des "ElseIf" ne fonctionnent-ils pas ? : problème de syntaxe j'imagine. L'erreur qu'il me propose est "Else sans If".
Effectivement. Il faut aller à la ligne après le Then.
D'une manière générale, si tu utilises une structure à plusieurs conditions (ElseIf), il faut aller à la ligne:
Code:
If ..... Then
........
ElseIf .... Then
......
EndIf
Si il y a qu'une condition, cela suffit:
Code:
If ...... Then ......

Après quelques test je me suis rendu compte que le temps d'éxcution de mon code variait selon si j'écrivais :

'_____________________________
'1er code
If Cells(j, 1) = "Operator ID" Then
Rows(j + 1).Select
Selection.
Delete Shift:=xlUp
End If
'_____________________________

OU
'_____________________________
'2eme code
If Cells(j, 1) = "Operator ID" Then
Rows(j + 1).Delete Shift:=xlUp
End If
'_____________________________

'_________________________________________________ _____
'3eme code
If Cells(j, 1) = "Operator ID" Then Rows(j + 1).Delete Shift:=xlUp
'_________________________________________________ _____

Etonnant car c'est le 1er code qui est le plus rapide. Le 2eme et le 3eme étant équivalent tout deux. Quelqu'un aurait-il l'amabilité de m'expliquer pourquoi c'est le 1er code qui a priori semble être le plus long et le plus lourd et qui pourtant est plus rapide.

Ne mets pas que des morceaux de code car ce que tu dis est fortement improbable, il doit y avoir autre chose genre
Code:
Application.ScreenUpdating = False
que tu as mis pour le premier mais pas dans les 2 autres.
 

Alphonss

XLDnaute Nouveau
Re : Question en programmation VBA (optimisation)

Oui merci pour la syntaxe des "ElseIf" maintenant ça marche. Dans l'ensemble j'ai donc plutôt avancé et je vous remercie. Cependant est-ce normal que ma vitesse d'éxécution soit la même que je mette 10 "If" de cette forme la :

If (condition) Then (instructions)
If (condition) Then (instructions)
If (condition) Then (instructions)
etc...

que si je mets :

If (condition) Then
(instructions)
ElseIf (condition) Then
(instructions)
ElseIf (condition) Then
(instructions)
etc...

Pour moi la 2eme forme devrait être beaucoup plus rapide puisque comme me la démontré skoobi dès qu'une condition est vérifiée, on sort de la structure. Mais expérimentalement la vitesse reste exactement la même : o(

Secundo : je vous joins le code en pièce jointe afin que vous puissiez peut être mieux comprendre mes attentes qui sont je pense que vous l'avez compris : o) d'augmenter la vitesse d'éxécution de ma macro en l'optimisant au maximum

Merci :)

Alphons
 

Pièces jointes

  • macroAlphons.zip
    1.3 KB · Affichages: 38

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Re : Question en programmation VBA (optimisation)

Pour gagner du temps sur la suppression de lignes, il faut utiliser d'autres méthodes que la méthode classique.

Voir PJ

JB
 

Pièces jointes

  • SupLignesFiltreElabore.xls
    36 KB · Affichages: 104

jp14

XLDnaute Barbatruc
Re : Question en programmation VBA (optimisation)

Bonjour le fil

Re,

'3eme code(Temps éxécution : 2,10 min)
Dim j As Long
For j = 65536 To 1 Step -1
If Cells(j, 1) = "Operator ID" Then Rows(j + 1).Delete Shift:=xlUp
If Cells(j, 1) = "Enable status" Then Rows(j).Delete Shift:=xlUp
If Cells(j, 1) = "Re-enable date" Then Rows(j).Delete Shift:=xlUp
If Cells(j, 1) = "Approval status" Then Rows(j).Delete Shift:=xlUp
If Cells(j, 1) = "Last changed" Then Rows(j).Delete Shift:=xlUp
If Cells(j, 1) = "Last sign-on" Then Rows(j).Delete Shift:=xlUp
If Cells(j, 1) = "Calculated pwd" Then Rows(j).Delete Shift:=xlUp
If Cells(j, 1) = "One-time password" Then Rows(j).Delete Shift:=xlUp
If Cells(j, 1) = "Active devices" Then Rows(j).Delete Shift:=xlUp
Next j


Alphons

Au lieu d'utiliser "if" on peut utiliser Select case
Code:
Select Case Cells(j, 1)
    Case "Operator ID"
        Rows(j + 1).Delete Shift:=xlUp
    Case "One-time password"
        Rows(j).Delete Shift:=xlUp
    Case "Enable status", "Re-enable date", "Approval status", "Last changed", "Last sign-on", "Calculated pwd"
        Rows(j).Delete Shift:=xlUp
End Select

Pour accélérer le code il faut mettre en premier la valeur que l'on retrouve le plus souvent.

JP
 

Alphonss

XLDnaute Nouveau
Re : Question en programmation VBA (optimisation)

Bonjour bonjour,


Merci pour vos réponses. J'ai encore quelques petits soucis avec ces nouvelles méthodes mais effectivement la vitesse d'éxécution de ma macro s'est sensiblement améliorée. Avec un peu d'acharnement je devrais y parvenir : o)

Encore merci et bonne journée


Alphons
 

Discussions similaires

Réponses
4
Affichages
414

Statistiques des forums

Discussions
314 562
Messages
2 110 729
Membres
110 909
dernier inscrit
François19