XL 2016 Optimisation d'une boucle

thivame

XLDnaute Junior
Bonjour a vous,
J'ai créé une boucle dans un onglet afin de récupérer des informations et les mettre sur un autre onglet si ça rempli deux conditions.
Celle ci fonctionne mais est assez lente pour "seulement" 250 lignes.
A votre avis est il possible de l'optimiser ?
Private Sub CommandButton1_Click()

Sheets("les entrées").Range("a6:w500") = Clear

'Application.ScreenUpdating = False

'Application.EnableEvents = False



Dim nom As String

nom = Sheets("les entrées").Range("i1")

derniereligne = Sheets(nom).Cells(Rows.Count, 1).End(xlUp).Row

Sheets("les entrées").Range("a6:w500") = Clear

If Sheets("les entrées").Range("c3") <> "" And Sheets("les entrées").Range("f3") <> "" Then

MsgBox "il faut choisir : soit manifestation soit evenement"

Sheets("les entrées").Range("c3") = Clear

Sheets("les entrées").Range("f3") = Clear

Exit Sub

End If



For i = 5 To derniereligne



If Sheets(nom).Range("d" & i).Value = Sheets("les entrées").Range("C3").Value And Year(Sheets(nom).Range("F" & i)) = Sheets("les entrées").Range("l1") Then





Worksheets("les entrées").Range("B" & Rows.Count).End(xlUp).Offset(1, 0) = Sheets(nom).Range("ab" & i).Value

Worksheets("les entrées").Range("b" & Rows.Count).End(xlUp).Offset(0, 1) = Sheets(nom).Range("c" & i).Value

Worksheets("les entrées").Range("b" & Rows.Count).End(xlUp).Offset(0, 2) = Sheets(nom).Range("b" & i).Value

Worksheets("les entrées").Range("b" & Rows.Count).End(xlUp).Offset(0, 3) = Sheets(nom).Range("e" & i).Value

Worksheets("les entrées").Range("b" & Rows.Count).End(xlUp).Offset(0, 4) = Sheets(nom).Range("d" & i).Value

Worksheets("les entrées").Range("b" & Rows.Count).End(xlUp).Offset(0, 5) = Sheets(nom).Range("w" & i).Value

Worksheets("les entrées").Range("b" & Rows.Count).End(xlUp).Offset(0, 6) = Sheets(nom).Range("f" & i).Value

Worksheets("les entrées").Range("b" & Rows.Count).End(xlUp).Offset(0, 7) = Sheets(nom).Range("h" & i).Value

Worksheets("les entrées").Range("b" & Rows.Count).End(xlUp).Offset(0, 8) = Sheets(nom).Range("j" & i).Value

Worksheets("les entrées").Range("b" & Rows.Count).End(xlUp).Offset(0, 9) = Sheets(nom).Range("l" & i).Value

Worksheets("les entrées").Range("b" & Rows.Count).End(xlUp).Offset(0, 10) = Sheets(nom).Range("n" & i).Value

Worksheets("les entrées").Range("b" & Rows.Count).End(xlUp).Offset(0, 11) = Sheets(nom).Range("p" & i).Value

Worksheets("les entrées").Range("b" & Rows.Count).End(xlUp).Offset(0, 12) = Sheets(nom).Range("r" & i).Value

Worksheets("les entrées").Range("b" & Rows.Count).End(xlUp).Offset(0, 13) = Sheets(nom).Range("t" & i).Value

Worksheets("les entrées").Range("b" & Rows.Count).End(xlUp).Offset(0, 14) = Sheets(nom).Range("v" & i).Value

Worksheets("les entrées").Range("b" & Rows.Count).End(xlUp).Offset(0, 15) = Sheets(nom).Range("g" & i).Value

Worksheets("les entrées").Range("b" & Rows.Count).End(xlUp).Offset(0, 16) = Sheets(nom).Range("z" & i).Value

Worksheets("les entrées").Range("b" & Rows.Count).End(xlUp).Offset(0, 18) = Sheets(nom).Range("af" & i).Value
End If

Next

'Application.ScreenUpdating = True

'Application.EnableEvents = True

End Sub
Merci par avance pour votre aide
 

thivame

XLDnaute Junior
quand je dis que j'ai fait une erreur avec le code .clear, c'est qie lorsque j'ai testé ma ligne avec le .clear, j'ai justement oublié de mettre le "."..d'ou l'erreur.
Mais sinon tout se passe bien avec le "=" et avec le "." comme décrit dans le message 13.
J'ia deja utilisé le ClearContents et j'ai exactement le meme résultat qu'avec le "=clear".
Comme dit plus haut c'est peut etre normal avec le excel 2016.
 

Dranreb

XLDnaute Barbatruc
C'est vrai, j'aurais pu me contenter de vous conseiller de mettre Option Explicit en tête de vos modules, ce qui, en dehors de faciliter les mises au point, permet de comprendre bien plus de choses. Mais, quelque part, ne pas le mettre revient à exprès ne rien vouloir comprendre à rien.
 

ChTi160

XLDnaute Barbatruc
Re
Chez moi j'ai toujours Option explicit en tête de Module (ça me Vient de @+Thierry )
D'où #5 , #12
Pourquoi me répondre ?
C'est vrai, j'aurais pu me contenter de vous conseiller de mettre Option Explicit en tête de vos modules
je ne suis pas contre cette façon de faire "Arrêtez de ne rien comprendre à rien" mais que ce soit ciblé !
Cordialement
Jean marie
 

thivame

XLDnaute Junior
bonsoir Dranreb,
effectivement je n'ai pas "option explicit" sur ma page...
De ce fait si je viens sur le fofo demander de l'aide c'est que forcement je n'ai pas la science infuse, mais a première vu c'est mal vu de ne pas être doué...et vous avez tout compris tout de suite sans évolution ni aide..
Je suis content pour vous que vous soyez né avec la science infuse

Je vous souhaite donc une bonne soirée.
cordialement
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Thivame, Chti, Dranreb,
Le véritable souci n'est pas, je pense, la présence ou l'absence de "Option Explicit" mais à mes yeux d'un "bug" du VBA.
En VBA les variables ne peuvent porter le nom de mots clés.
Par ex IF=3 ou FOR=2 seront refusés dès l'écriture.
Or Clear=3 ne pose aucun problème à l'écriture, ni même à l'exécution. Ce qui est contraire aux règles de nommage, d'où mon idée que c'est plus un bug qu'autre chose.
 

Dranreb

XLDnaute Barbatruc
Non, il n'y a aucun bogue de VBA à ce sujet. La restriction ne s'applique qu'aux vrais mots clés du langage, or il y en a finalement assez peu.
Elle ne s'applique pas au noms des variables Public, Sub, Functions, méthodes ni propriétés d'objets définis par les bibliothèques en référence, même pas ceux de la VBA.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Parce qu'on n'a aucune compréhension de comment ça marche et qu'on ne peut donc pas être sûr qu'autre chose d'aussi absurde marchera. Au lieu de Clear mettez Empty tout simplement ou utilisez la méthode ClearContents. Avec Option Explicit en tête votre = Clear ne marchera plus de toute façon, il vous dira Erreur de compilation: variable non définie.
 

ChTi160

XLDnaute Barbatruc
Re
Pour une bonne pratique du vba , il est essentiel de mettre "options explicit " en tête de module .tu peux même dans vbe choisir dans les options de le mettre systématiquement. cela oblige a la déclaration des variables ... Certains m'aiment pas ...
Bonne continuation
Jean marie
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonsoir,
1- "Option explicit" vous oblige à déclarer les variables par un Dim.
Ainsi ensuite si vous faites une erreur de syntaxe ou encore d'autres problèmes de type, le VBA vous donnera une erreur. Ce qui fait gagner du temps.
Ceci dit le VBA est permissif, et vous n'êtes pas obligé de mettre Option explicit, ni même de déclarer vos variables. Mais c'est à vos risques et périls.
2- ",pourqoi est ce mal de mettre"range =clear" En fait là vous utilisez Clear comme une variable. Même si apparemment le VBA l'accepte, il vaut mieux l'éviter ne serait ce que pour la compréhension du code. Généralement Clear est utilisé par le VBA comme dans .Clear ou .CLearcontents ...
Utiliser un mot clé comme variable rendra votre code incompréhensible pour beaucoup de lecteurs.
Même si, là encore, le VBA vous le permet.

NB: Option explicit peut devenir systématique dans votre code. Il vous suffit dans l'éditeur VBA de faire Outils/Option et de cocher la bonne case :
1702159777790.png

Ainsi quand vous crérez un module, cette ligne sera insérer automatiquement en première ligne.
 

thivame

XLDnaute Junior
bonjour,
Merci ChTi160.
Merci Sylvanu pour ces réponses, sans condescendance, du pourquoi utiliser l' " option explicit "au lieu de l'implicit .
Cependant, j'ai du mal à comprendre quelque chose (et oui je suis novice dans le Vba,désolé Dranreb) : si j'utilise "clear" comme variable, n'aurais je dû indiquer quelque chose du genre "clear= ...."
alors que pas du tout, je dis juste "range("a1") = clear " et j'avoue que j'ai toujours fait comme cela .
Au moins maintenant je sais que ce n'est pas conseillé.


 

ChTi160

XLDnaute Barbatruc
Bonjour thivame
Et bien ta variable n'est pas déclarée puisque pas d'Option Explicit" , elle est donc de type. Variant ce qui veut dire qu'elle peut contenir aussi bien du numérique que du texte,que rien lol etc
Donc si tu ne lui affectes pas de valeur , elle est vide , si tu mets par ecemple Dim Clear as Byte ,
Puis Clear = 1 , ta plage Range("A1") sera rempli par un 1 .
Alors que sans déclaration ta variable Clear sera EmpTy ,Vide ,"", .Donc Range("A1")=Clear vide ta cellule A1.
Regarde , si ce n'est fait "Option Explicit"
Regarde du côté de déclaration des variables .types de variables etc
Bonne journée
Jean mariee
 
Dernière édition:

Discussions similaires