Règles Vba pour simplification du code

Darnel

XLDnaute Impliqué
Bonjour à tous

N'étant pas très aguéri en vb, j'ai fais un fichier avec du code, en partie eu par le biai de l'enregistreur de macro que j'ai ensuite simplifier (très peu cependant car j'ai peu de connaissances à ce niveau), , et l'autre partie est composée de morceau que certain d'entre vous m'ont aidé à réaliser ( je remercie pour l'occasion et à la volée José, Jean marie, brigitte, monique, MdF, gislain, porcinet, ETC ... et les autres, qu'ils m'excusent si je les ait oublier)
Le truc maintenant, c'est que j'aimerai réduire le nombre de select, afin d'accelerer l'execution des macros.
J'en vien donc a ma question :

Pour les selects (déjà ça) quels sont les règles à suivre (dans quel cas est il indispensable, quand ne l'est il pas?, comment compiler deux lignes du genre :
Sheets("feuil1").Select
Range("A1").Select
etc etc
Car j'ai essayer différents trucs sans succes, genre

Sheets("feuil1").Range("A1").Select

Donc voila, si quelqu'un peu me faire un petit cours, ou me réorienter, c'est cool.
A+
 

Gorfael

XLDnaute Barbatruc
Re : Règles Vba pour simplification du code

Salut Darnel et les autres
Pour les selects (déjà ça) quels sont les règles à suivre (dans quel cas est il indispensable, quand ne l'est il pas?, comment compiler deux lignes du genre :
Sheets("feuil1").Select
Range("A1").Select
etc etc
Je ne peux pas te donner de cours, parce que je suis comme toi, je tatonne.
Pour les feuilles, un peu de réflexion permet généralement de regrouper les traitements par feuille : il faut éviter de sauter de l'une à l'autre.

Quand je fais une macro automatique, en règle générale, je double l'opération en changeant la méthode. ex : gras en A1, italique en B2. Similaire, mais un peu différent

après, je compare les codes, et j'essaie de supprimer (par une mise en commentaire) de toutes les parties qui n'ont pas changées. ça permet d'épurer pas mal

ou une série d'opérations
"AAAAA" en A1
une autre série d'opérations
"BBBBB" en A1
etc..
ça permet de savoir à quelles opérations attribuer le code.

Pour les "select" : excel en met à tout bout de champ. Plus de 90% des opérations peuvent s'en passer
c'est comme les With : je ne les utilise que quand il me semble que c'est interessant.
Code:
Sub Macro1()
    Sheets("F2").Select
    Range("A1").Select
    Selection.Copy
    Sheets("F1").Select
    ActiveSheet.Paste
    Sheets("F2").Select
    Range("B2").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("F1").Select
    Range("B2").Select
    ActiveSheet.Paste
End Sub
on peut réduire en regardant l'aide
Code:
Sub Macro1()
    'Sheets("F2").Select
    'Range("A1").Select
    'Selection.Copy
    'Sheets("F1").Select
    'ActiveSheet.Paste
    With Sheets("F2")
        .Range("A1").Copy Destination:=Sheets("F1").Range("A1")
        .Range("B2").Copy Destination:=Sheets("F1").Range("B2")
    End With
    'Sheets("F2").Select
    'Range("B2").Select
    'Application.CutCopyMode = False
    'Selection.Copy
    'Sheets("F1").Select
    'Range("B2").Select
    'ActiveSheet.Paste
End Sub
Je fais pareil pour les codes que je récupère (souvent de ceux que tu as cité, mais d'autres aussi).
Je regarde comment ils ont fait : Le code est pratiquement pur (hormis certaines habitudes) et donc tu verras que les Select y sont très rares.

Et surtout, je n'hésite pas à poser des questions sur leurs codes : pour l'instant, pas un seul des forumeurs que j'ai questionné ne m'a pas répondu. ça veut pas dire que ça les a pas fait rigoler certaines fois :)

Mais comme disait fucius qui avait oublié d'être con : avoir une lacune n'est pas grave, c'est de ne pas vouloir la combler qui l'est !

Mon code évolu sans arrêt. Mais je n'applique jamais un code que je ne comprends pas. Le but n'est pas de faire plaisir à celui qui me l'a donné en l'employant bêtement. C'est de lui demander des explications, et s'il ne me convient pas, lui dire ne le vexera pas : ne pas lui répondre, si. Et de toute façon, même si je n'aime pas utiliser telle ou telle instruction, le simple fait de voir une autre approche permet souvent de résoudre des problèmes "insolubles".

Tout ça pour dire que je regarde pratiquement tous les sujets macro ou formule et que si je ne participe pas (souvent pas assez rapide :) ) je décortique les méthodes employées, et si des fois ça donne mal au crâne, ça fait toujours progresser

A+
 

jeromegmc

XLDnaute Occasionnel
Re : Règles Vba pour simplification du code

Salut à tous,

Pour remplacer :

Sheets("feuil1").Select
Range("F8").Select
ActiveCell.FormulaR1C1 = "45"
Range("F9").Select


Je conseil d'utiliser "With":

With Sheets("feuil1")
.Range("F8").FormulaR1C1 = "45"
....
....
end with


Ca te permet de savoir sur quelle feuille tu travailles en plus.
 

Darnel

XLDnaute Impliqué
Re : Règles Vba pour simplification du code

Merci à vous deux

Je n'ai jamais utilisé with; mais je sens que je vais pouvoir simplifier deux trois trucs comme ça

Gorfael, je suis comme toi, les codes que j'ai eu sur le site m'ont été expliqués, mais je lutte sur deux trois trucs faits par l'enregistreur.
Enfin, en ce qui concerne l'aide vb, je ne l'ai pas sur mon post car poste pro tout verouillé de partout.

Merci et A+
 

Gorfael

XLDnaute Barbatruc
Re : Règles Vba pour simplification du code

Darnel à dit:
Merci à vous deux

Je n'ai jamais utilisé with; mais je sens que je vais pouvoir simplifier deux trois trucs comme ça

Gorfael, je suis comme toi, les codes que j'ai eu sur le site m'ont été expliqués, mais je lutte sur deux trois trucs faits par l'enregistreur.
Enfin, en ce qui concerne l'aide vb, je ne l'ai pas sur mon post car poste pro tout verouillé de partout.

Merci et A+
Re...
L'aide Excel : déjà ne pas l'installer veut dire que c'est fait en standard : c'est le style d'informatichien qui veut pas se fouler.
Quoique l'aide Excel... ça doit être un collégue à Gaston Lagaff : pour avoir une info, il faut prévoir le casque spéléo, les 3 jours de vivres et la boussole, et avoir de la chance ;)

Si t'as des codes récalcitrant, mets-les, on essaiera de les expliquer

A+
 

porcinet82

XLDnaute Barbatruc
Re : Règles Vba pour simplification du code

Bonjour a tous,

Tout d'abord, je voulais dire a Gorfael que pour quelqu'un qui tatonne, il se debrouille plutot pas mal.

Sinon, pour Darnel, je suis comme toi a la fac, pas d'aide non plus, c'est vraiment chiant car des fois ca aiderai bien. Sinon pour ce qui est de ton Sheets("feuil1").Range("A1").Select qui ne fonctionne pas, j'avais moi aussi posé la question a mes debut et l'un des ténors du forum (je me rappel plus exactement lequel, il y en a tellement) m'avais proposé la solution suivante (que je transmet a mon tour) : Application.Goto Sheets("Feuil1").Range("A1")

Pour ce qui est des Select, beaucoup de choses ont deja ete dites, et comme la si bien dis Gorfael, Excel en met a toutes les sauces alors qu'il ne sert a rien du tout de selectionner la cellule avant d'appliquer un code dessus. Perso, je ne pense pas taper loin en disant que j'utilise le Select seulement lorsque j'effectue un copier/coller (que j'essai d'ailleur d'eviter) ou alors quand je travail sur une Selection, auquel cas j'utilise un With Selection

Je crois que c'est tout, si il y a des bouts de codes que tu penses simplifiable, mets les sur le forum (si ils ne font pas 50 lignes biens sur) et ont essaira de t'aider a les simplifier un peu.

@+
 

Darnel

XLDnaute Impliqué
Re : Règles Vba pour simplification du code

Re à tous

Pour gorfael, je suis en alternance dans une grosse boite ou on ne peu rien faire sur un PC pour éviter les prog perso et les abus (genre msn) et autre.

Pour le reste, porcinet, tu as répondu à ma question, tout comme gorfael.
Je cherche à simplifier d'abord tous les trucs type select car je sais que c'est pas terrible. Le truc c'est que mon fichier comporte un paquet de lignes de code et que ce n'est pas fantastique de tout mettre sur le forum ( je sais pas combien de lignes il y a mais à vu de nez,ca doit dépasser les 200)
Il y a des codes que je ne pense pas améliorer car ça tourne tel que (tout fonctionne) et qu'il me faudrait presque autant de temps à tout simplifier que de temps qu'il m'a fallu pour faire le fichier.

Enfin, j'apprendrai mieu avec des réponses comme les votre qu'avec des corrections faites sur le forum.
pour ce qui est des with, je ne comprend pas bien le principe...

que signiefient ils... autant je comprend les dim as ..., les if end if etc...
Mais je ne vois pas bien ce que peu renvoyer comme instruction With.


Si vous pouvez m'eclairer car j'aime bien savoir comment un truc fonctionne...:eek:

Merci encore
 

Darnel

XLDnaute Impliqué
Re : Règles Vba pour simplification du code

Re à vous :

Puisque vous me l'avez proposer, finalement, il y a des choses pour lesquelles je ne suis pas sur d'avoir le code le plus court...

Type : Sheets("Données résils").Protect DrawingObjects:=True, Contents:=True, Scenarios:=True

Il me semble que comme tout est en position : True, je doit pouvoir me contenter d'un simple :Sheets("Données résils").Protect

Qu'en pensez vous?

à l'inverse, si il n'y en a qu'un en False genre :
Sheets("Données résils").Protect DrawingObjects:=True, Contents:=False, Scenarios:=True
puis je me contenter de : Sheets("Données résils").Protect, Contents:=False
?

Enfin, comment raccourcir un code comme celui ci :
Range("E3").Select
ActiveCell.FormulaR1C1 = _
"=VLOOKUP(R2C5,Données!R2C2:R65536C80,47,FALSE)"


merci
 
Dernière édition:

Gorfael

XLDnaute Barbatruc
Re : Règles Vba pour simplification du code

Darnel à dit:
Re à vous :

Puisque vous me l'avez proposer, finalement, il y a des choses pour lesquelles je ne suis pas sur d'avoir le code le plus court...

Type : Sheets("Données résils").Protect DrawingObjects:=True, Contents:=True, Scenarios:=True

Il me semble que comme tout est en position : True, je doit pouvoir me contenter d'un simple :Sheets("Données résils").Protect

Qu'en pensez vous?

à l'inverse, si il n'y en a qu'un en False genre :
Sheets("Données résils").Protect DrawingObjects:=True, Contents:=False, Scenarios:=True
puis je me contenter de : Sheets("Données résils").Protect, Contents:=False
?

Enfin, comment raccourcir un code comme celui ci :
Range("E3").Select
ActiveCell.FormulaR1C1 = _
"=VLOOKUP(R2C5,Données!R2C2:R65536C80,47,FALSE)"


merci
Re...
C'était pas un critique contre toi : nombre de personnes qui gérent les micros dans les boîtes feraient bien d'utiliser ce qu'ils mettent à disposition. Une aide n'a jamais permis de véroler un micro.
Soit ils bloquent la construction de macros, et je peux le comprendre, soit ils installent l'aide (que ce clown de Billy met en option). Sinon, c'est qu'ils n'ont pas de "conscience professionnelle".

Bon, j'ai craché mon venin on passe aux trucs interessants
Range("E3").Select
ActiveCell.FormulaR1C1 = _
"=VLOOKUP(R2C5,Données!R2C2:R65536C80,47,FALSE)"
Code:
Range("E3").FormulaR1C1 = _
        "=VLOOKUP(R2C5,Données!R2C2:R65536C80,47,0)"

Pour le reste : en gros, Excel redéfinit l'intégralité des paramètres à chaque instruction. Ce qui ne bouge pas d'une instruction à l'autre, ce sont les paramètres par défaut et le 3/4 du temps, ils suffisent

Moi pour protéger j'utilise
Sheets("feuille").protect
ou
Sheets("feuille").protect "AAAA"
quand il faut un mot de passe

Quand à dire qu'on peut négliger les TRUE ou les FALSE, ça dépend trop de l'instruction. Un exemple de code qui m'énerve les nerffffs :
Code:
Sub Macro3()
    With Selection.Font
        .Name = "Arial"
        .FontStyle = "Italique"
        .Size = 10
        .Strikethrough = False
        .Superscript = False
        .Subscript = False
        .OutlineFont = False
        .Shadow = False
        .Underline = xlUnderlineStyleNone
        .ColorIndex = xlAutomatic
    End With
    Selection.Borders(xlDiagonalDown).LineStyle = xlNone
    Selection.Borders(xlDiagonalUp).LineStyle = xlNone
    With Selection.Borders(xlEdgeLeft)
        .LineStyle = xlContinuous
        .Weight = xlThick
        .ColorIndex = xlAutomatic
    End With
    With Selection.Borders(xlEdgeTop)
        .LineStyle = xlContinuous
        .Weight = xlThick
        .ColorIndex = xlAutomatic
    End With
    With Selection.Borders(xlEdgeBottom)
        .LineStyle = xlContinuous
        .Weight = xlThick
        .ColorIndex = xlAutomatic
    End With
    With Selection.Borders(xlEdgeRight)
        .LineStyle = xlContinuous
        .Weight = xlThick
        .ColorIndex = xlAutomatic
    End With
    Selection.Borders(xlInsideVertical).LineStyle = xlNone
    Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
    Range("D21").Select
End Sub
Question : qu'est-ce que j'ai fait :encadrer une sélection et la mettre en italique. Donc, je peux supprimer de mon code tout ce qui ne concerne pas ces action. comme dans l'encadrement, j'ai changer la taille des traits, mais pas la couleur, ça donne
Code:
Sub Macro3()
    With Selection
        .Font.FontStyle = "Italique"

        .Borders(xlEdgeLeft).Weight = xlThick        
        .Borders(xlEdgeTop).Weight = xlThick
        .Borders(xlEdgeBottom).Weight = xlThick
        .Borders(xlEdgeRight).Weight = xlThick
        .ColorIndex = xlAutomatic
    End With
End Sub
en gros, tout ce que je ne modifie pas, j'ai pas besoin de le remettre

A+

Si tu veux, tu peux mettre ton code sur un module, tu mets une série d'étoiles en commentaires sur les codes que tu ne comprends pas et si on ne peut pas forcément simplifier, on pourra sans doute te donner des pistes
 

TETRAM

XLDnaute Nouveau
Re : Règles Vba pour simplification du code

Bonjour à vous tous,

Je suis un utilisateur basic de VB et beaucoups de mon code sort de l'enregistreur.
Et je ne prends pas le temps de chercher à simplifier.

Enfin tout ça pour vous dire bravo discussion super interresante
et rien qu'en suprimant mes select je vois la différence.
 

TETRAM

XLDnaute Nouveau
Re : Règles Vba pour simplification du code

RE:
Pour ma part j'utilise énormément le code suivant car j'intégre des données d'un formulaire.

Sheets("Business Document").Select
Range("J5").Select
Selection.Copy
Sheets("Tarification").Select
Range("D3").Select
ActiveSheet.Paste
Selection.UnMerge

Pensez-vous qu'il soit possible de le simplifier??
 

Darnel

XLDnaute Impliqué
Re : Règles Vba pour simplification du code

Re

Merci à toi

Puisque tu en parle j'en ai un dans le genre

Il est comme ça :
Code:
Range("B18:D18").Select
    ActiveSheet.Unprotect
    With Selection.Validation
        .Delete
        .Add Type:=xlValidateInputOnly, AlertStyle:=xlValidAlertStop, Operator _
        :=xlBetween
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = ""
        .InputMessage = ""
        .ErrorMessage = ""
        .ShowInput = True
        .ShowError = True
    End With
    ActiveCell.FormulaR1C1 = "=Fichesynthèse!RC"
    Range("B18:D18").Select
    With Selection.Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="=clauses"
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = ""
        .InputMessage = ""
        .ErrorMessage = ""
        .ShowInput = True
        .ShowError = True
    End With
        Range("E18").Select
    With Selection.Validation
        .Delete
        .Add Type:=xlValidateInputOnly, AlertStyle:=xlValidAlertStop, Operator _
        :=xlBetween
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = ""
        .InputMessage = ""
        .ErrorMessage = ""
        .ShowInput = True
        .ShowError = True
    End With
    ActiveCell.FormulaR1C1 = "=Fichesynthèse!RC"
    Range("E18").Select
    With Selection.Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="=clauses"
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = ""
        .InputMessage = ""
        .ErrorMessage = ""
        .ShowInput = True
        .ShowError = True
    End With
        Range("F18:H18").Select
    With Selection.Validation
        .Delete
        .Add Type:=xlValidateInputOnly, AlertStyle:=xlValidAlertStop, Operator _
        :=xlBetween
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = ""
        .InputMessage = ""
        .ErrorMessage = ""
        .ShowInput = True
        .ShowError = True
    End With
    ActiveCell.FormulaR1C1 = "=Fichesynthèse!RC"
    Range("F18:H18").Select
    With Selection.Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="=clauses"
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = ""
        .InputMessage = ""
        .ErrorMessage = ""
        .ShowInput = True
        .ShowError = True
    End With

Par contre, j'ai pas vraiment compris ce que je peux retirer

Je pense à ça :

Code:
Range("B18:D18").Select
    ActiveSheet.Unprotect
    With Selection.Validation
        .Delete
        .Add Type:=xlValidateInputOnly, AlertStyle:=xlValidAlertStop, Operator _
            End With
    ActiveCell.FormulaR1C1 = "=Fichesynthèse!RC"
    Range("B18:D18").Select
    With Selection.Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="=clauses"
            End With
        Range("E18").Select
    With Selection.Validation
        .Delete
        .Add Type:=xlValidateInputOnly, AlertStyle:=xlValidAlertStop, Operator _
           End With
    ActiveCell.FormulaR1C1 = "=Fichesynthèse!RC"
    Range("E18").Select
    With Selection.Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="=clauses"
            End With
        Range("F18:H18").Select
    With Selection.Validation
        .Delete
        .Add Type:=xlValidateInputOnly, AlertStyle:=xlValidAlertStop, Operator _
    End With
    ActiveCell.FormulaR1C1 = "=Fichesynthèse!RC"
    Range("F18:H18").Select
    With Selection.Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="=clauses"
            End With

Si tu peux me dire ca que tu en pense stp

EDIT: Bonjour TETRAM, je ne t'avais pas vu
 

Kobaya

XLDnaute Occasionnel
Re : Règles Vba pour simplification du code

salut TETRAM, Darnel, Gorfael,

TETRAM,

une fois simplifié, ton code donne ceci:
Code:
Sheets("Business Document").Select
Range("J5").Copy
Sheets("Tarification").Select
Range("D3").Select
ActiveSheet.Paste
Selection.UnMerge
Y'a pas grand chose à gratter :D en fait...

Darnel,
pour ton code sur la Validation, je me fierai volontiers à ce qu'a dit Gorfael :
en gros, tout ce que je ne modifie pas, j'ai pas besoin de le remettre
 

TETRAM

XLDnaute Nouveau
Re : Règles Vba pour simplification du code

Bonjour Kobaya,

Merci donc en fait si selection suis select on peut supprimé les deux..
c déjà un bon début je dois pouvoir gagner un bon 60 lignes voir plus sur ce code.

je vais continué à investiguer pour gagner ce que je peux.
 

Statistiques des forums

Discussions
312 211
Messages
2 086 299
Membres
103 173
dernier inscrit
Cerba95