IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Procédure ou fonction apprentissage [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé Avatar de Djromé
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 172
    Par défaut Procédure ou fonction apprentissage
    Salut les Kracks,

    J'ai enfin un peu de temps pour essayer d'approfondir mes humbles connaissances en VBA, aussi j'aurai besoin de vos lumières quand aux procédures et/ou fonctions.

    En effet, afin d'alléger mes programmes (la plupart des vôtres le sont), j'aimerai comprendre le principe des procédures ou fonctions?

    Ex: J'ai une macro qui exécute de multiples tâches pour 15 onglets de mon classeur (Met un filtre en ligne 9, ajuste les colonnes, etc...).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub maProcedure ()
    mesdiversestaches
    End Sub
     
    Sub maMacro
    For each ws
    Call maProcedure
    End sub
    Si ces tâches sont exactements les mêmes à effectuer sur mes 15 feuilles, puis-je et dois-je créer une procédure me permettant d'alléger mon sub?
    Est-ce bien à celà que sert une procédure et/ou une fonction?

    D'avance merci pour vos expliquations de fin d'année...

  2. #2
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut heuh!!!
    bonjour
    tu pourrais peut être faire comme ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    Sub maMacro
    For each ws
    'toutes les taches que tu veux
    End sub
    dans la mesure ou tu ne donne pas plus de precisionsje ne peu aller plus loin


    au plaisir
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  3. #3
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Une manière de procéder (par exemple on veux écrire le nom de la feuille en A1 de chaque feuille du classeur)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub maProcedure( Sh As Worksheet)
     
    With Sh
        .Range("A1").value= "La feuille se nomme " & .Name
        'suite du code, sans Select ou Activate comportant toutes les opérations à apporter à la feuille
    End With
    End Sub
    Et puis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub maMacro
    Dim ws As Worksheet
     
    For each ws In ThisWorkbook.Worksheets
       Call maProcedure(ws)
       'ou bien maProcedure ws
    Next ws
    End sub

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonsoir,

    La différence pricipale entre une procédure et une fonction est que la première exécute différentes actions (ceque tu as mis en exemple) alors que la seconde retourne une valeur ou un tableau de valeurs (par exemple, les fonctions d'Excel). Une procédure peut aussi retourner une valeur ou un tableau de valeurs mais une variable (ou une variable tableau) doit lui être passé en référence.

    Bonne continuation.

    Hervé.

  5. #5
    Membre confirmé Avatar de Djromé
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 172
    Par défaut
    Bonsoir les Kracks,

    Merci pour vos réponses respectives

    @patricktoulon: J'ai été succincts car c'est une question que je me pose d'un ordre général, suite aux nombreuses réponses et lectures sur le site, je m'aperçois que beaucoup de codes sont raccourcis au possible et dans certain cas, j'ai du créer des macros de 15 pages qui au fur et à mesure de mes connaissances, se réduisent en peau de chagrin...
    J'ai cependant beaucoup de mal à choisir entre:
    tu pourrais peut être faire comme ci
    Code :
    Sub maMacro
    For each ws
    'toutes les taches que tu veux
    End sub
    qui, il est vrai, est également un condensé et entre l'exemple que j'ai cité mais bien mieux présenté par Mercatog (soit définir une procédure et l'appeler ensuite dans un code!).
    Quel est votre méthode de réflexion à vous sur la pratique, le choix et la mise en place d'une procédure?
    Quand deviennent-elles "obligatoires"?

    Merci Mercatog pour l'exemple concret et Theze pour l'explication voulue!
    @+

  6. #6
    Membre éclairé
    Inscrit en
    Janvier 2003
    Messages
    604
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 604
    Par défaut
    Bonjour,

    Une explication pour le choix d'utiliser ou non une procédure est
    comme tu l'as dit est : ne pas écrire des dizaines de lignes
    en ayant l'impression de réécrire beaucoup de fois la même chose.
    En VBA le probleme est que l'on travaille souvent en flu tendu
    et que l'on écrit le code certaines fois sans réflechir beaucoup.
    Mais à la manière d'un bon ouvrier qui a ses outils pour bien travailler,
    il peut être utile de faire ses bons outils.
    Une sub (ou une fonction) est un bon outils que l'on peut réutiliser plusieurs fois à condition qu'il soit un minimum standard, et que par exemple on lui donne des parametres qui auront le même sens (signification) et même type
    Par exemple si je veux faire un truc qui me positionne sur la feuille dans
    la premiere cellule vide, il faut lui indiquer une feuille.
    Ce serait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sub MaCelluleLibre (sh as worksheet)
    'code à mettre qui utilise sh
    end sub
    La procédure, pour être utilisée très souvent, pourra détecter qu'on lui a donné bien une feuille qui existe (et dans ce cas déclencher une erreur que l'on saura gérer dans le code) comme pour un outils qui présenterait des aspérités sur lesquelles on pourrait se blesser, on envisagera dans ce cas à mettre une protection en plastique par exemple.
    On vérifie que l'outils peut traiter tous les cas pour ne pas avoir à intervenir en urgence.
    Ainsi avec un peu de pratique on pourra se faire une trousse à outils que l'on saura utiliser avec efficacité même si au début cela demande un peu plus de temps à programmer.
    Bon j'espère ne pas avoir été trop long, mais une petite métaphore n'est pas inutile de temps en temps.
    Après il faut mettre en pratique.
    Bon courage et ... Bonne Année.

  7. #7
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    bonjour


    pour ma part a partir du momment ou tu utilise une sub

    je ne vois pas l'interet d'avoir une sub qui en apelle une autre

    dans ce cas je pense pas que ce soit indispensable

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        Sub maMacro
    Dim ws As Worksheet
     
    For each ws In ThisWorkbook.Worksheets
       Call maProcedure(ws)'ici tu apelle la macro " maprocedure" je n'en vois pas l'intérêt déjà que la macro mamacro est appelée elle même par une autre macro forcement alors a réduire le code autant le faire en une fois 
       'ou bien maProcedure ws
    Next ws
    End sub
    exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        Sub maMacro
    Dim ws As Worksheet
     
    For each ws In ThisWorkbook.Worksheets
     i=i+1
    sheets(i).range("a1")=sheets(i).name'avec l'exemple de mercatog cette ligne aurait du être dans "maprocedure ws" je n'en vois pas l'intérêt bien que fonctionnel aussi   
    Next ws
    End sub
    au plaisir
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  8. #8
    Expert confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6 814
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6 814
    Par défaut
    pour ce qui est du nombre de sub, il n'y a pas de règle absolue. Disons qu'une procédure qui tient dans un seul écran, c'est pas mal. Une procédure de 3 lignes, il faut l'appeler très souvent pour qu'elle en vaille la peine. Une procédure de 3000 lignes, il faut la couper en morceaux.

    Dans ce cas comme dans bien d'autres, le mieux est parfois l'ennemi du bien. J'ai un jour commis un code du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    Sub Principal()
    (.../...)
    call TraitementEcran(NombreLignes, NombreColonnes)
    (.../...)
    End Sub
     
    Sub TraitementEcran(NombreLignes as integer, NombreColonnes as integer)
         for i = 1 to nombreLignes
              call TraitementLigne(NumeroLigne, NombreColonnes)
         next i
    End Sub
     
    Sub TraitementLigne(NumeroLigne as integer, NombreColonnes as integer)
         for i = 1 to nombreColonnes
              call TraitementCellule(NumeroLigne, NumeroColonne)
         next i
    End Sub
     
    Sub Traitement Cellule(NumeroLigne as integer, NumeroColonne as integer)
         if TableauPublic(NumeroColonne) = "N" then
              call TraitementNumerique(NumeroLigne, NumeroColonne)
         else
              call TraitementAlpha(NumeroLigne, NumeroColonne)
         end if
    End Sub
    C'est bien évidemment très sur-emboité. Les seules procédures nécéssaires sont la principale, le traitement numérique et le traitement alpha. A l'extrême rigueur, le traitement écran, si la procédure principale est déjà très lourde(elle ne l'était pas). J'en étais très fier, mais j'ai appris à ne pas trop la ramener, depuis.....

  9. #9
    Membre confirmé Avatar de Djromé
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 172
    Par défaut
    Merci pour vos explications!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Procédure et fonction : les différences et les usages de chacune ?
    Par cpattin dans le forum Langages de programmation
    Réponses: 6
    Dernier message: 06/08/2007, 00h28
  2. procédure ou fonction stockée qui retourne un résultat
    Par PoichOU dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 28/05/2007, 16h03
  3. Réponses: 3
    Dernier message: 22/03/2006, 15h38
  4. Mysql5: différences entre procédures et fonctions
    Par El Riiico dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 25/11/2005, 05h43
  5. Réponses: 5
    Dernier message: 14/10/2005, 12h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo