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 :

Comment concevoir une macro VBA (en termes de scindement de sous procédure et fonctions)


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 15
    Points : 14
    Points
    14
    Par défaut Comment concevoir une macro VBA (en termes de scindement de sous procédure et fonctions)
    Bonjour,

    Je pratique la programmation en autodidacte depuis un peu plus d'un an maintenant et ma maigre expérience me pousse à me tourner vers vous. Je n'ai en effet jamais réalisé de "gros" projets à proprement parler et j'ai toujours développé des petites macros par ci par là. Je suis en ce moment sur le développement d'une macro un peu plus importante qu'avant et j'essaye de faire quelque chose de propre et de maintenable. C'est là que mon souci intervient : je ne sais pas organiser mon code.

    J'ai bien retenu le fait qu'il fallait scinder son code en fonctions et sous procédures pour pouvoir détecter ou maintenir plus facilement un logiciel ou une macro, seulement je me rends compte en développement ma macro que c'est l'anarchie complète. J'entends par anarchie complète qu'en phase de développement, je me dis "tiens je pourrais utiliser une fonction ici". Paf je fais une fonction sur laquelle je vais très certainement revenir après quelques lignes pour la modifier. Même chose pour les sous procédures.

    Plusieurs questions me viennent :

    - En premier lieu, comment choisir entre une sous procédure ou une fonction ? Les deux peuvent très bien nous amener au même résultat.

    - Comment apprendre à organiser mon code ? Pour le moment je ne connais que l'UML et les méthodes agiles, mais ça me semble hors contexte ?!

    Merci pour vos réponses.

  2. #2
    Invité
    Invité(e)
    Par défaut Bonjour,
    Bonjour,
    Quand on crée un gros projet, on définie suite à une analyse les différentes étapes à réaliser.

    Par exemple l’acquisition des datas, Traitement des Datas affichage du résultat.

    On peut dire que le traitement dans cet exemple ce fait en 3 étape :
    Pour une bonne lisibilité du code nous pourrions faire 3 modules avec comme non
    ModuleAquisition, ModuleTraitement et ModuleAffichage.

    Pour renommer il faut afficher la fenêtre des propriétés du module raccourci clavier [F4]

    En suite tu vas analyser chaque module (ModuleAquisition, ModuleTraitement et ModuleAffichage), pour définir les actions que ton programme devra effectuer, afficher un userform, ouvrir un fichier…

    Lorsqu’un traitement est redondant et ne demande pas de retourner une valeur on factorisera le traitement par une procédure (SUB) afin de ne pas réécrire le même code.

    Si le traitement demande de retourner une valeur alors on optera pour une fonction.

    Le découpage du programme ce fait en fonction des actions à mener, de la redondance de code et également de la taille du code ; un Sub qui ferait 2000 lignes avec des boucle imbriquées deviendrait vite incompréhensible.
    Il est évidant que ton programme organisé come suit es plus lisible :
    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
    Sub Main()
      Dim FichierExcel As Workbook
      Dim Fichier As String
      Fichier = "c:\repTest\bof.xls"
     Set FichierExcel = OuvirXls(Fichier)
     If TypeName(FichierExcel) = "Nothing" Then MsgBox Fichier & vbCrLf & "Est introuvable": Exit Sub
     If Traitement(FichierExcel) = False Then MsgBox "Err": Exit Sub
     Affichage FichierExcel.Sheets("Resultat")
     End Sub
     
    Function OuvirXls(Fichier As String) As Workbook
    If Dir(Fichier) <> "" Then Set OuvirXls = Workbooks.Open(Fichier)
    End Function
     
    Function Traitement(Wb As Workbook) As Boolean
    'Traitement
    Traitement = True
    End Function
    Sub Affichage(Ws As Worksheet)
    Usf.Chargement (Ws)
    End Sub
    Code Usf : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Public Sub Chargement(Ws As Worksheet)
        For i = 1 To 10
            Me.Controls("Text" & i).Text = Ws.cells(10, i)
        Next
        Me.Show vbModal
    End Sub
    Il peut s’avérer utile de créer des modules de classe, ce mot est affolant mais somme toute c’est relativement simple.

    Supposes que dans ton module ModuleAquisition tu dispose d’une vingtaine de fonctions et que seulement 2 sont appelé et que les autres font partie du traitement ; donc appelé d’un sub ou d’une fonction !
    Il te suife de définir des fonctions privé ou public seul le public serra visible de l’extérieur du module ce qui te permet une bonne lisibilité de ton code et tu dispose de l’écriture instinctive de vb.
    Reprenons l’exemple ModuleAquisition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub Main()
      Dim FichierExcel As Workbook
      Dim Fichier As String
      Fichier = "c:\repTest\bof.xls"
      Dim Aquisition As New ClsAquisition 'j'utilise mon module de classe 
     Set FichierExcel = Aquisition.OuvirXls(Fichier) 'ici j'améliore la lisibilité car nous voyons bien la provenance de la fonction
     If TypeName(FichierExcel) = "Nothing" Then MsgBox Fichier & vbCrLf & "Est introuvable": Exit Sub
     If Traitement(FichierExcel) = False Then MsgBox "Err": Exit Sub
     Affichage FichierExcel.Sheets("Resultat")
    End Sub
    Code ClsAquisition : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Public Function OuvirXls(Fichier As String) As Workbook
    If FichierExiste(Fichier) = True Then Set OuvirXls = Workbooks.Open(Fichier)
    End Function
    Private Function FichierExiste(Fichier As String) As Boolean
    If Dir(Fichier) <> "" Then FichierExiste = True
    End Function
    Dernière modification par Invité ; 21/08/2014 à 16h51.

Discussions similaires

  1. [XL-2003] Comment rendre une macro VBA accessible à tous les fichiers .xls
    Par Toto_le_héros38 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 08/01/2011, 21h23
  2. Réponses: 1
    Dernier message: 23/04/2008, 10h34
  3. [VBA-E]Comment Temporiser une macro ?
    Par Mou dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 12/04/2007, 14h40
  4. [VBA-E] Comment appliquer une macro sur plusieurs cellules
    Par jeanpierreco dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 25/01/2007, 10h54
  5. [VBA-E] comment realiser une macro "passive"
    Par Marc dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 02/06/2006, 08h20

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