Question en programmation VBA (optimisation)

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

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
 
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:
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:
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
 
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
 
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
 
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
 
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é!
 
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.
 
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

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
 
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
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
4
Affichages
313
Réponses
8
Affichages
242
  • Question Question
Microsoft 365 Erreur UBound
Réponses
4
Affichages
165
Réponses
3
Affichages
216
  • Question Question
XL 2021 VBA excel
Réponses
4
Affichages
239
Réponses
2
Affichages
132
Réponses
8
Affichages
530
Réponses
10
Affichages
367
  • Question Question
Microsoft 365 Export données
Réponses
4
Affichages
697
Retour