OVH Cloud OVH Cloud

Plusieurs sub ou une grosse ?

6 réponses
Avatar
plexus
Bonjour =E0 tous,
Aimant =E0 compliquer un peu tout, ( j'apprends en m=EAme temps ), je me
suis mis en t=EAte qu'il vallait mieux une seule grosse macro que
plusieurs petites .

1/ est-ce vrai ?

2/ je veux effacer plusieurs trucs dans plusieurs feuilles, Or bien
que ce soit toujours les m=EAme feuilles qui soient concern=E9es elles ne
le sont pas toutes en m=EAme temps, donc au lieu de faire la m=E9thode
simple d'une sub pour chaque feuille et d'appeler les diverses sub
j'ai fait celle l=E0 :

Sub vide (ParamArray bte() As Variant)

Application.ScreenUpdating =3D False

For i =3D 0 To UBound(bte)

Select Case bte(i)

Case "feuil1"
MsgBox "feuil1"
'*Effacer PdP*

Case "feuil 2"
MsgBox "synth"
'**Efface "feuil2"**

Case "feuil3"
MsgBox "feuil3"
'***Efface "feuil3"***

Case "feuil4"
MsgBox "feuil4"
'***Efface "feuil4"***

End Select
Next i
Application.ScreenUpdating =3D True

Exit Sub
End Sub

Sub eff()
Call vide("feuil1", "feuil3")
End Sub

Voil=E0, tout ceci fonctionne tr=E8s bien, sauf que je me dis qu'au final
une boucle n'est pas si =E9l=E9gant que cela
et que des sub videfeuil1, videfeuil2, etc.. seraient plus efficaces
et moins gourmande m=EAme si je dois r=E9p=E9ter la d=E9finition des variab=
les
de chacune =E0 chaque fois.

C'=E9tait juste histoire d'avoir votre avis sur la question,
Merci,

6 réponses

Avatar
anonymousA
Bonjour,

il est plus facile de maintenir une application quand elle est composée
de petites routines sachnat que bien sur, "petites" est un adjectif
subjectif. En gros, je dirais que si une proc fait plus de 150 lignes,
elle ne peut plus être considérée comme petite. il y a certainement de
l'appel à des sou-routines à faire.
PAr ailleurs,si des action ssont répétitives, il y a tout interet à ce
que ce soit une sous-routine qui le fasse par appel de la routine
principale.
Ceci dit, il n'y a pas de loi, la seule limite de VBA étant que le
module ne dépasse pas 64KOctets ( mesurée s'il est exporté au format text).

A+
Bonjour à tous,
Aimant à compliquer un peu tout, ( j'apprends en même temps ), je me
suis mis en tête qu'il vallait mieux une seule grosse macro que
plusieurs petites .

1/ est-ce vrai ?

2/ je veux effacer plusieurs trucs dans plusieurs feuilles, Or bien
que ce soit toujours les même feuilles qui soient concernées elles ne
le sont pas toutes en même temps, donc au lieu de faire la méthode
simple d'une sub pour chaque feuille et d'appeler les diverses sub
j'ai fait celle là :

Sub vide (ParamArray bte() As Variant)

Application.ScreenUpdating = False

For i = 0 To UBound(bte)

Select Case bte(i)

Case "feuil1"
MsgBox "feuil1"
'*Effacer PdP*

Case "feuil 2"
MsgBox "synth"
'**Efface "feuil2"**

Case "feuil3"
MsgBox "feuil3"
'***Efface "feuil3"***

Case "feuil4"
MsgBox "feuil4"
'***Efface "feuil4"***

End Select
Next i
Application.ScreenUpdating = True

Exit Sub
End Sub

Sub eff()
Call vide("feuil1", "feuil3")
End Sub

Voilà, tout ceci fonctionne très bien, sauf que je me dis qu'au final
une boucle n'est pas si élégant que cela
et que des sub videfeuil1, videfeuil2, etc.. seraient plus efficaces
et moins gourmande même si je dois répéter la définition des variables
de chacune à chaque fois.

C'était juste histoire d'avoir votre avis sur la question,
Merci,



Avatar
MichDenis
Il est toujours préférable d'élaborer des "petites procédures"
c'est beaucoup facile d'écrire le code et de le corriger.
De plus, la lecture du code est beaucoup facile

Un exemple :

Supprime tout le contenu des feuilles de calcul d'un classeur
'-------------------------------
Sub test()
For Each sh In Worksheets
SupprimerContenuFeuille sh.Name
Next
End Sub
'-------------------------------

Pour supprimer le contenu d'une feuille de calcul d'un classeur
Sub test()
SupprimerContenuFeuille "Feuil1"
End Sub

'-------------------------------
Sub SupprimerContenuFeuille(Feuille As String)
Dim DerLig As Long, DerCol As Integer
On Error Resume Next
With Worksheets(Feuille)
DerLig = .Cells.Find(What:="*", _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row
DerCol = .Cells.Find(What:="*", _
LookIn:=xlFormulas, _
SearchOrder:=xlByColumns, _
SearchDirection:=xlPrevious).Column
.Range(.Range("A1"), .Cells(DerLig, DerCol)).Clear
End With
End Sub
'-------------------------------



"plexus" a écrit dans le message de news:

Bonjour à tous,
Aimant à compliquer un peu tout, ( j'apprends en même temps ), je me
suis mis en tête qu'il vallait mieux une seule grosse macro que
plusieurs petites .

1/ est-ce vrai ?

2/ je veux effacer plusieurs trucs dans plusieurs feuilles, Or bien
que ce soit toujours les même feuilles qui soient concernées elles ne
le sont pas toutes en même temps, donc au lieu de faire la méthode
simple d'une sub pour chaque feuille et d'appeler les diverses sub
j'ai fait celle là :

Sub vide (ParamArray bte() As Variant)

Application.ScreenUpdating = False

For i = 0 To UBound(bte)

Select Case bte(i)

Case "feuil1"
MsgBox "feuil1"
'*Effacer PdP*

Case "feuil 2"
MsgBox "synth"
'**Efface "feuil2"**

Case "feuil3"
MsgBox "feuil3"
'***Efface "feuil3"***

Case "feuil4"
MsgBox "feuil4"
'***Efface "feuil4"***

End Select
Next i
Application.ScreenUpdating = True

Exit Sub
End Sub

Sub eff()
Call vide("feuil1", "feuil3")
End Sub

Voilà, tout ceci fonctionne très bien, sauf que je me dis qu'au final
une boucle n'est pas si élégant que cela
et que des sub videfeuil1, videfeuil2, etc.. seraient plus efficaces
et moins gourmande même si je dois répéter la définition des variables
de chacune à chaque fois.

C'était juste histoire d'avoir votre avis sur la question,
Merci,
Avatar
Modeste
Bonsour® plexus avec ferveur ;o))) vous nous disiez :

je me suis mis en tête qu'il vallait mieux une seule grosse macro que
plusieurs petites .

1/ est-ce vrai ?
C'était juste histoire d'avoir votre avis sur la question,


tout n'est qu'une question d'analyse, c'est ce que l'on appelle le découpage
modulaire
cela permet en autre
- de rappeler des proc avec des parametres, plutot que de récrire plusieur fois
le même code avec des parametres différents
- d'affecter et de séparer des actions particulieres à des proc (acces aux
données, calculs, affichages etc..)
- de faciliter la maintenance sans avoir à tout casser
- d'avoir des proc plus légéres lisibles sur un seul écran
- de faciliter le traitement d'erreur



--
--
@+
;o)))

Avatar
plexus
Merci beaucoup pour vos réponses, je n'espérait pas faire un tel
carton avec cette question

En tout cas toutes vos remarques me rendent la pratique plus
compréhensible (et pas uniquement sur ce post) merci encore.

Je vais donc opter pour les subs par feuilles, cependant 2 petites
questions encore :

MichDenis, je suis assez adepte de (et l'utilise beaucoup) :
DerLig = .Range("A:A").Find("*", , xlFormulas, , , xlPrevious).Row
mais quelle différence avec DerLig =
Sheets(1).Range("A65000").End(xlUp).Row, en terme de ressources,
résultat ?
j'ai fini par remplacé la plus part de
mes .Range("A:A").Find("*", , xlFormulas, , , xlPrevious).Row
par .Range("A65000").End(xlUp).Row pour une question de gain de temps
de frappe, mais intuitivement, je préfère la première solution.

anonymousA, quand tu parles de la seule limite qui est la taille du
module ne devant pas dépasser 64 ko, il s'agit bien de chaque module
et non pas de l'ensemble des modules ? car sinon je crois que j'ai pas
mal de ménage à faire....

Voilà, j'abandonne cette idée que pleins de petites subs étaient moins
lisibles qu'une grosse fourre-tout (et ma grosse sub de création de
menus et de barres outils va se prendre un coup de tronçonneuse).
Enfin, grace à cet exemple j'aurais découvert ParamArray.
Une dernière question sur l'emploi de exit sub.
utilisant tout de même pas mal d'appel d'appel de petites sub, je me
suis retrouvé avec un plantage en mode auto et un bon fonctionnement
en pas à pas.
Une réponse lue sur le forum solutionnait ce problème en indiquant de
faire un sheets(x).select dès que possible s'il y avait des manip sur
plusieurs feuilles, ce que je fis et cela fonctionna bien. Mais ayant
cherché dans l'aide, je trouvais exit sub, que j'employais dans une
sub, or après il m'a fallu l'employer tout le temps pour ne plus avoir
de problème d'arret entre appel de sub. Vaut il mieux éviter l'emploi
de exit sub ?

Merci encore de vos remarques
@+
Avatar
MichDenis
Dim DerLig As Long

DerLig = .Range("A:A").Find("*", , xlFormulas, , , xlPrevious).Row
OU
DerLig = Sheets(1).Range("A65000").End(xlUp).Row

Les 2 lignes de code se ressembles mais il y a quand même une différence importante :

Si la colonne A est totalement vide :
A )
DerLig = .Range("A:A").Find("*", , xlFormulas, , , xlPrevious).Row
DerLig = 0 ... et tu auras une erreur, car la méthode Find génère
une erreur 91 lorsqu'elle ne trouve pas de valeur correspondante
D'où l'utilisation de On Error Resume Next

B ) DerLig = Sheets(1).Range("A65000").End(xlUp).Row
DerLig sera égale à 1 même si A1 est vide... donc
une réponse inexacte ....


"plexus" a écrit dans le message de news:

Merci beaucoup pour vos réponses, je n'espérait pas faire un tel
carton avec cette question

En tout cas toutes vos remarques me rendent la pratique plus
compréhensible (et pas uniquement sur ce post) merci encore.

Je vais donc opter pour les subs par feuilles, cependant 2 petites
questions encore :

MichDenis, je suis assez adepte de (et l'utilise beaucoup) :
DerLig = .Range("A:A").Find("*", , xlFormulas, , , xlPrevious).Row
mais quelle différence avec DerLig Sheets(1).Range("A65000").End(xlUp).Row, en terme de ressources,
résultat ?
j'ai fini par remplacé la plus part de
mes .Range("A:A").Find("*", , xlFormulas, , , xlPrevious).Row
par .Range("A65000").End(xlUp).Row pour une question de gain de temps
de frappe, mais intuitivement, je préfère la première solution.

anonymousA, quand tu parles de la seule limite qui est la taille du
module ne devant pas dépasser 64 ko, il s'agit bien de chaque module
et non pas de l'ensemble des modules ? car sinon je crois que j'ai pas
mal de ménage à faire....

Voilà, j'abandonne cette idée que pleins de petites subs étaient moins
lisibles qu'une grosse fourre-tout (et ma grosse sub de création de
menus et de barres outils va se prendre un coup de tronçonneuse).
Enfin, grace à cet exemple j'aurais découvert ParamArray.
Une dernière question sur l'emploi de exit sub.
utilisant tout de même pas mal d'appel d'appel de petites sub, je me
suis retrouvé avec un plantage en mode auto et un bon fonctionnement
en pas à pas.
Une réponse lue sur le forum solutionnait ce problème en indiquant de
faire un sheets(x).select dès que possible s'il y avait des manip sur
plusieurs feuilles, ce que je fis et cela fonctionna bien. Mais ayant
cherché dans l'aide, je trouvais exit sub, que j'employais dans une
sub, or après il m'a fallu l'employer tout le temps pour ne plus avoir
de problème d'arret entre appel de sub. Vaut il mieux éviter l'emploi
de exit sub ?

Merci encore de vos remarques
@+
Avatar
anonymousA
Il s'agit bien de la taille de chaque module.

A+


Merci beaucoup pour vos réponses, je n'espérait pas faire un tel
carton avec cette question

En tout cas toutes vos remarques me rendent la pratique plus
compréhensible (et pas uniquement sur ce post) merci encore.

Je vais donc opter pour les subs par feuilles, cependant 2 petites
questions encore :

MichDenis, je suis assez adepte de (et l'utilise beaucoup) :
DerLig = .Range("A:A").Find("*", , xlFormulas, , , xlPrevious).Row
mais quelle différence avec DerLig > Sheets(1).Range("A65000").End(xlUp).Row, en terme de ressources,
résultat ?
j'ai fini par remplacé la plus part de
mes .Range("A:A").Find("*", , xlFormulas, , , xlPrevious).Row
par .Range("A65000").End(xlUp).Row pour une question de gain de temps
de frappe, mais intuitivement, je préfère la première solution.

anonymousA, quand tu parles de la seule limite qui est la taille du
module ne devant pas dépasser 64 ko, il s'agit bien de chaque module
et non pas de l'ensemble des modules ? car sinon je crois que j'ai pas
mal de ménage à faire....

Voilà, j'abandonne cette idée que pleins de petites subs étaient moins
lisibles qu'une grosse fourre-tout (et ma grosse sub de création de
menus et de barres outils va se prendre un coup de tronçonneuse).
Enfin, grace à cet exemple j'aurais découvert ParamArray.
Une dernière question sur l'emploi de exit sub.
utilisant tout de même pas mal d'appel d'appel de petites sub, je me
suis retrouvé avec un plantage en mode auto et un bon fonctionnement
en pas à pas.
Une réponse lue sur le forum solutionnait ce problème en indiquant de
faire un sheets(x).select dès que possible s'il y avait des manip sur
plusieurs feuilles, ce que je fis et cela fonctionna bien. Mais ayant
cherché dans l'aide, je trouvais exit sub, que j'employais dans une
sub, or après il m'a fallu l'employer tout le temps pour ne plus avoir
de problème d'arret entre appel de sub. Vaut il mieux éviter l'emploi
de exit sub ?

Merci encore de vos remarques
@+