|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Membre régulier
![]() Inscription : mai 2006 Messages : 272 ![]() |
Bonjour à tous
Je cherche a simplifier un code d'une proceduer sur un bouton ok d'une userform car j'ai un temps d'attente entre chaque saisie ce qui n'est pas l'ideal pour de la saisie. J'ai essyé de supprimer au maximum les select, mais apres je bloc. Voici mon code: Code :
|
||
|
|
00
|
|
|
#2 |
![]() ![]() Alain GerardConsultant informatique Inscription : mai 2005 Messages : 3 675 ![]() |
Bonjour,
En dehors de l'indentation fantaisiste de ton code (qui n'a pas d'influence sur la vitesse d'exécution, j'en conviens mais qui n'invite pas à l'analyser) et de l'utilisation de ActiveCell, tu peux essayer Code :
Application.Calculation = xlCalculationManual Code :
Application.Calculation = xlCalculationAutomatic Sans garantie
__________________
N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres! Pensez aussi à voter pour les réponses qui vous ont aidés. ------------ Je dois beaucoup de mes connaissances à mes erreurs! |
|
|
00
|
|
|
#3 | ||
|
Membre régulier
![]() Inscription : mai 2006 Messages : 272 ![]() |
Merci AlainTech
Oui aparemment ça fonctionne mieux, par contre tu me parle de Activecell, je suis certainement d'accord avec toi mais comment je pourrais les supprimer. Parceque je ne vois pas comment je pourrais coder autrement, je ne suis pas un pro en VBA et je suis toujours preneur de conseille pour pouvoir m'ameliorer. J'ai dejà retravailler le une petite partie du code comme ceci mais c'est pas forcement bien. Code :
Si tu as des suggestions je suis preneur. |
||
|
|
00
|
|
|
#4 |
![]() ![]() Alain GerardConsultant informatique Inscription : mai 2005 Messages : 3 675 ![]() |
Bonjour,
Déjà, bien pour l'indentation. C'est nettement plus lisible. Petit conseil: Les variables étant définies au lancement de l'application, il vaut mieux regrouper les définitions en début de procédure. Pour ma part, je les définis une par ligne en les classant por ordre alphabétique. Ca me permet de les retrouver facilement. Mais ce n'est qu'une façon personnelle de travailler. Pour ton ActiveCell, on ne sait pas ce qui la détermine. Est-ce une action de l'utilisateur ou une autre action de ton programme?
__________________
N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres! Pensez aussi à voter pour les réponses qui vous ont aidés. ------------ Je dois beaucoup de mes connaissances à mes erreurs! |
|
|
00
|
|
|
#5 | ||
|
Membre régulier
![]() Inscription : mai 2006 Messages : 272 ![]() |
Pour Activecell c'est la procedure d'activation de la userform qui positionne est selectionne la premiere cellule d'entrée de saisie dans le tableau.
Je met le code de la procedure, j'en ai profité pour classer mes variables a ta façon dit moi si c'est bien comme cela que tu vois les choses. Code :
|
||
|
|
00
|
|
|
#6 | ||
|
Nouveau Membre du Club
![]() Inscription : mai 2006 Messages : 32 ![]() |
Bonjour,
Je m'immisce un peu dans la converse... On peut sans doute optimiser et clarifier le code de la manière ci dessous mais il est probable que ce sont les call qui ralentissent le plus l'exécution. Le code modifié (attention, bien que j'ai essayé de faire propre, je ne peux pas tester : sans garantie c'est l'idée qui compte...) Code :
Si nécessaire préférer des conversions explicites plutôt que la méthode bourrin : blabla = CLng(Longueur) plutôt que : blabla.Value = longueur.Text A+ |
||
|
|
00
|
|
|
#7 | ||
![]() ![]() Alain GerardConsultant informatique Inscription : mai 2005 Messages : 3 675 ![]() |
Encore un petit conseil pour une programmation "propre".
Placer en début de chaque module pour forcer à déclarer toutes les variables. Ca peut être fait automatiquement en cochant "Déclaration des variables obligatoire" dans les options de l'éditeur VBA. Puisque ta cellule de destination est définie dans une procédure et utilisée dans une autre, je te conseille de placer un en début de module de ton UserForm (sous le Option Explicit). Ensuite, remplace Code :
Code :
Set rDest = Range("D65536").End(xlUp).Offset(1, -1) Il reste un détail à régler: définir un objet Worksheet pour la feuille de destination. Crois-tu pouvoir y arriver? C'est assez important pour avoir un code stable car Range("D65536") ne dit pas sur quelle feuille on travaille et on est reparti pour devoir utiliser un Select pour que ça fonctionne.
__________________
N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres! Pensez aussi à voter pour les réponses qui vous ont aidés. ------------ Je dois beaucoup de mes connaissances à mes erreurs! |
||
|
|
00
|
|
|
#8 | ||
|
Membre régulier
![]() Inscription : mai 2006 Messages : 272 ![]() |
Ok AlainTech,
J'ai essayé sans le tester completement de faire ceci, par contre je n'ai pas su faire aurtrement quand utilisant un ActiveSheet pour situer la feuille. il ya peut etre un autre moyen, j'avais pensé à ThisWorkSheet mais ça n'avait pas l'air d'etre reconnu quand je l'ai taper dans un module. Code :
Et sinon merci galopin01 pour ton code qui est tres interressant, du fait d'utiliser des variables plutot que "ActiveCell.Offset...". Par contre je n'ai pas compris quand tu parle de conversion explicite, si tu peux me mettre un exemple un peu plus precis, car pour le moment je ne vois pas comment je peux me passer de mes .value et .text |
||
|
|
00
|
|
|
#9 |
![]() ![]() Alain GerardConsultant informatique Inscription : mai 2005 Messages : 3 675 ![]() |
Indubitablement!
Quant à ActiveSheet, encore une fois, c'est une question de choix. Si tu veux que l'utilisateur choisisse (et donc sélectionne) la feuille de travail, tu dois utiliser ActiveSheet. Par contre, si c'est toi qui l'impose, tu connais son nom d'onglet. Si tu veux que ton code fonctionne sur toutes les versions d'Excel et quel que soit le nombre de lignes remplies, je te conseille de remplacer Code :
Set rDest = wFeuil.Range("D65536").End(xlUp).Offset(1, -1) Code :
Set rDest = wFeuil.Cells(wFeuil.Rows.Count, 4).End(xlUp).Offset(1, -1) Il faut éviter de laisser VB prendre des décisions à notre place car il nous réserve parfois des surprises. Le meilleur exemple est la conversion implicite de dates. En Excel, concernant le contenu des cellules, il y a une différence fondamentale entre le . Value et le .Text. VB.Net évolue dans le sens de ne plus accepter les conversions implicite et de forcer le programmeur à tout définir.
__________________
N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres! Pensez aussi à voter pour les réponses qui vous ont aidés. ------------ Je dois beaucoup de mes connaissances à mes erreurs! |
|
|
20
|
|
|
#10 | |
![]() ![]() Didier GONARDFormateur Développeur Office - indépendant Inscription : février 2008 Messages : 2 353 ![]() |
Citation:
tout à fait d'accord et même fondamentalement utile :http://www.developpez.net/forums/d11...apres-virgule/ http://www.developpez.net/forums/d87...fichier-texte/ cordialement, Didier
__________________
Didier Gonard Ps : Pour noter positivement ou négativement un post, vous pouvez cliquer sur les pouces en bas à droite ! Tutoriels : Voir la liste de mes tutoriels et mon site pro sur ma Page DVP N'oubliez pas de mettre : ..quand c'est le cas !
|
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com