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 :

Pérenniser un code VBA


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 30
    Points : 7
    Points
    7
    Par défaut Pérenniser un code VBA
    Bonjour à toutes, à tous et au forum.

    Aujourd'hui, j'aimerai discuter avec vous pour obtenir des avis et des conseils concernant la pérennisation d'un code VBA.

    1 - Contexte

    Je réalise actuellement une formation en alternance dans laquelle, lors de ma période en entreprise, je réalise des fichiers EXCEL à l'aide de macro VBA. Ce qui est ressorti lors de ma soutenance c'est : Comment allez-vous réussir à pérenniser vos codes, vos fichiers EXCEL, pour qu'ils soient durables mais aussi qu'ils puissent être repris.
    Ma première réponse, a été : Je vais réaliser des commentaires sur chacune des lignes de mon code.
    Mon jury m'a répondu que c'était une bonne démarche mais que ce n'était pas suffisant.

    2 - Problématique

    Comment pérenniser un fichier EXCEL comprenant des MACROS via VBA ?

    - Commenter le code VBA
    - Etablir un fichier WORD dans lequel il faudrait noter chacune des variables, à quoi elles correspondent, et les différentes formules mathématiques utilisées dans la MACRO.

    Voici actuellement mes 2 pistes pour pérenniser un fichier EXCEL, je cherche donc des avis d'amateurs, d'intermédiaires et d'experts d'EXCEL et de VBAn pour me donner de nouvelles pistes sur ma problématique.

    Cordialement !

  2. #2
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour
    Il y a un peu d'antinomie entre "pérenniser" et "reprendre" dans :
    pérenniser vos codes, vos fichiers EXCEL, pour qu'ils soient durables mais aussi qu'ils puissent être repris
    S'il s'agit de pérenniser (jusqu'à nouvelle version) la dernière retenue --->> on détermine des numéros de versions et on fait un modèle de la dernière "retenue" ou on l'utilise (au niveau utilisateur) en travaillant sur son "miroir".
    (L'expression est importante)

    EDIT :
    Je réalise actuellement une formation
    tu "réalises" ou tu "suis" (cette formation) ?
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  3. #3
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 761
    Points : 28 619
    Points
    28 619
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    tu "réalises" ou tu "suis" (cette formation) ?
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 30
    Points : 7
    Points
    7
    Par défaut
    Bonjour unparia et merci de ta réponse.

    Ce serait pour au cas où, quelqu'un voudrait reprendre mon fichier EXCEL et le modifier.
    OU si un jour ce que j'ai fait sous fichier EXCEL passe sur un autre logiciel via un autre langage de programmation.

    Je suis, je suis en cours si tu préfères
    Ca change pas le fait que j'ai eu suivi 0 formations / cours sur le VBA.

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 66
    Points : 48
    Points
    48
    Par défaut
    Bonjour,

    je ne suis pas sûr d'avoir bien compris ton problème, mais voila ce que je ferais en tant que débutant en VBA (je suis étudiant aussi):

    Ce que je fais actuellement et ce que tu peux faire (je ne sais pas si ca répond a ton problème mais ca peut t'aider), c'est créer un framework de tes applications, ou des fonctions génériques qui seront réutilisable dans tes futures applications.
    Par exemple en ce moment je dev une application qui utilise un framework, et ce framework gère la connexion a la BDD, la gestion des erreurs etc..
    Ce qui me donne globalement un code plus propre et structuré, mais surtout un developpement plus rapide pour les applications futures.

    Bonne journée

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 30
    Points : 7
    Points
    7
    Par défaut
    Bonjour Philippe Tulliez,

    Merci de ton commentaire

    Bonjour JahExodus,

    Aurais-tu un exemple de FrameWork que tu as réalisé ?
    Je ne connais absolument pas, et après recherche, cela peut m'intéresser.
    Mais je ne souhaite pas non plus passer le reste de ma période d'entreprise à réaliser un FrameWork.
    Ce n'est pas du tout mon sujet principal ^^

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 66
    Points : 48
    Points
    48
    Par défaut
    Salut,

    Alors je ne peux pas t'envoyer le code ou le fichier car c'est interne à mon entreprise et donc confidentiel mais si tu as des questions sur le principe de fonctionnement n'hésites pas.
    Il s'agit en gros de modules de classes qui sont des outils, que je peux utiliser dans chacune des mes applications si besoin est

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 30
    Points : 7
    Points
    7
    Par défaut
    Je comprends tout à fait ^^
    Par contre je ne comprends pas ton explication, si tu as des liens vers des sites Webs qui expliquent cela, ça m'intéresse ^^

    Je viens de lire pas mal d'articles sur les FrameWork, j'ai plus l'impression que c'est pour du développement Web que pour mon problème sous VBA (EXCEL)

  9. #9
    Expert éminent sénior
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6 803
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6 803
    Points : 32 058
    Points
    32 058
    Par défaut
    Pérenniser, ça veut dire garantir dans le temps. En fait, je vois deux axes : faire un code robuste, et le stocker dans un endroit sûr via un gestionnaire de sources.

    Pour le deuxième point, Git est une bonne solution. Il semblerait que Rubberduck permette de faire ça en natif - je n'ai pas encore testé.

    Pour le premier point, ben, documentation, commentaires, tests unitaires(ça, j'ai testé sous rubberduck, c'est de la balle, ça marche nickel), enfin, les bonnes pratiques habituelles. Qu'un nouvel arrivant aie de quoi travailler proprement.
    Les 4 règles d'airain du développement informatique sont, d'après Michael C. Kasten :
    1)on ne peut pas établir un chiffrage tant qu'on a pas finalisé la conception
    2)on ne peut pas finaliser la conception tant qu'on a pas complètement compris toutes les exigences
    3)le temps de comprendre toutes les exigences, le projet est terminé
    4)le temps de terminer le projet, les exigences ont changé
    Et le serment de non-allégiance :
    Je promets de n’exclure aucune idée sur la base de sa source mais de donner toute la considération nécessaire aux idées de toutes les écoles ou lignes de pensées afin de trouver celle qui est la mieux adaptée à une situation donnée.

  10. #10
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 66
    Points : 48
    Points
    48
    Par défaut
    En fait c'est le même principe qu'un framework pour un site web par exemple.

    Si tu as déjà developpé des site web, tu as sûrement déjà utilisé le même principe, c'est à dire que dans tous tes sites web il y a des éléments redondants (par exemple la navigation, le css, la connexion a la BD). Il s'agit donc de faire des fichiers générique utilisables dans toutes les applications.

    EDIT: je ne pense pas que ce soit une solution à ton problème alors j'ai l'impression de polluer un petit peu le post, je vais m'arreter là. Bon courage pour la suite

  11. #11
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 761
    Points : 28 619
    Points
    28 619
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Il y a tellement de possibilités pour pérenniser une application qu'il est difficile d'en établir une liste exhaustive.
    Outre une bonne analyse du projet déjà évoquée, il faut anticiper que certains sujets évoqué pourraient être modifiés et cela tient au bon sens et à une certaine expérience du logiciel et du nombre d'applications réalisées.
    Par exemple en VBA pour excel ne jamais utiliser le nom des feuilles mais leur CodeName
    L'entreprise fait-elle partie d'un groupe international ? Il faudra alors envisager l'utilisation des paramètres régionaux et une table multi-langue des textes et messages utilisé dans l'application (en Belgique tous les programmes sont prévus ainsi).
    Ne jamais coder en dur le n° des colonnes à traiter mais utiliser la recherche des étiquettes de colonnes ou les nommer afin d'éviter les problèmes lors d'insertion ou suppression de colonnes par l'utilisateur (plus régulier que l'on ne le croit)
    Ne jamais figer un taux de TVA car aujourd'hui l'entreprise a sans doute un seul taux mais demain en aura peut-être plusieurs etc.
    Avec excel, je prévois toujours une ou plusieurs feuilles paramètres me permettant de modifier les valeurs des paramètres contenus dans ces cellules plutôt que de toucher à mon code VBA
    Prévoir des constantes globales à l'application placées dans un module dédié s'il n'est pas possible de les stocker dans le classeur.

    Etc., etc;
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 30
    Points : 7
    Points
    7
    Par défaut
    Bonjour el_slapper et merci de ta réponse.

    Pour le premier point j'ai déjà prévu ces différentes actions :
    - Commenter le code
    - L'enregistrer dans un fichier Word
    - Intégrer dans un fichier Word les différentes variables et calculs mathématiques utilisés.

    Pour le deuxième point qui utilise RubberDuck.

    Qu'est qu'un test unitaire ?
    Je vois qu'il faut télécharger un logiciel, élément que je ne peux réaliser en entreprise à cause des protections.

    @JahExodus :

    Je n'ai jamais développé de site Web, c'est bien loin de mon domaine initial.
    Là j'essaye juste de trouver la meilleure solution en terme de : Simplicité / Temps pour pérenniser mon code comme me l'a demandé mon maître d'apprentissage.
    Comment créer un fichier générique ?

    @Philippe Tulliez

    Etant un débutant en VBA, j'utilise mon imagination, l'enregistreur de macro et l'aide de plusieurs forums Excel pour arriver à mes fins.
    J'utilise donc des Range / Select / Active ainsi que les noms des Onglets, bien sur tout cela avec des colonnes variables le plus possible car tout est " variable " dans mon fichier.
    J'essaye de prévoir mon fichier pour des situations qui peuvent être amenés à se créer et non pas seulement pour aujourd'hui.
    Mais je suis sûr que je n'envisage pas tout.

  13. #13
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 66
    Points : 48
    Points
    48
    Par défaut
    Citation Envoyé par Oparion Voir le message
    @JahExodus :

    Je n'ai jamais développé de site Web, c'est bien loin de mon domaine initial.
    Là j'essaye juste de trouver la meilleure solution en terme de : Simplicité / Temps pour pérenniser mon code comme me l'a demandé mon maître d'apprentissage.
    Comment créer un fichier générique ?
    Ok je n'avais peut être pas bien saisi le problème.
    Par fichier générique j'entend fichier qui regroupe les fonctions utiles a toutes tes applications, fichier que tu pourras donc rajouter à une future application ou lieu de réecrire ou de faire un copier coller.
    Ceci n'aura pas vraiment d'utilité si tu ne créée par d'autres applications par la suite, si ce n'est "ranger" ton code.
    Mais cela prend un peu de temps, cela permet de gagner du temps sur un long terme, mais sur un court terme, ca risque de te faire perdre un peu de temps

  14. #14
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 30
    Points : 7
    Points
    7
    Par défaut
    @JahExodus :

    En effet, tu as mieux cerné mon problème ^^
    C'est pour du long terme, mais ceci ne servira pas à créer d'autres applications.
    Je dois faire que le code puisse être lu, compris, modifié dans 1, 2, 10 ans par quelqu'un touchant un peu à VBA (en gros mon niveau = débutant).
    Mais aussi que ce code puisse être passé sur d'autres applications... Possiblement C / C++ mais ça j'y crois pas trop et c'est quelque chose à redéfinir avec mon maître d'apprentissage.

  15. #15
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut
    Bonjour,

    mon point de vue suite à des retours d'expériences dans un contexte équivalent :
    le plus important est de savoir exactement ce que le jury attend car
    des projets pouvant être validés en entreprise se sont fait tacler et d'autres bancales passer selon le jury !
    Le pire ayant été « cela ne peut fonctionner » alors que le code fourni était parfaitement fonctionnel
    et conforme à l'attendu !     Donc trouver le sens du poil …

    ___________________________________________________________________________________________________________
    Je suis Paris, Egypte, Stockholm, London, Istanbul, Berlin, Nice, Bruxelles, Charlie, …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  16. #16
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 926
    Points
    55 926
    Billets dans le blog
    131
    Par défaut
    Salut.

    Je suis assez d'accord avec Marc. Ca dépend fort du jury. Mais cela dépend aussi de ta façon de défendre ton "style" de code.

    Tu parles de commenter chaque ligne de code. STOP. Ca ne sert à rien. J'ai eu un prof qui nous obligeait à commenter toutes nos fonctions avec une structure de commentaires très détaillée (Nom, explication de ce que fait la fonction, type, nom et explication de chaque paramètre, type de valeur de retour)... Pour moi, en tant que commentaire, cela ne sert à rien du tout. Ca peut au mieux servir à créer de la documentation en automatique.

    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    '''
    ' @Comment Lit un contact en DB sur base de son ID
    ' @Returns    Contact, objet contact contenant les informations récupérées
    ' @Param      ID, long, Clé primaire du contact en DB
    '''
    function ReadContact(ID as long) as Contact
    A quoi sert le commentaire? A rien du tout, selon moi. Le nom de la fonction et de l'argument parlent d'eux-mêmes. Il n'y a aucune plus-value dans ces "commentaires". Les commentaires, les vrais, devraient être parcimonieusement utilisés pour expliquer le pourquoi d'un code un peu complexe...

    Pour pérenniser du code VBA (je reprends des idées qui ont déjà été émises et j'ajoute les miennes, sans exhaustivité aucune):
    • Ecrire des fonctions et des procédures qui n'ont qu'une seule responsabilité;
    • Eviter les variables globales et les utiliser uniquement pour des variables d'environnement et d'application;
    • Ecrire du code en réduisant, voire en annulant, la dépendance d'une fonction par rapport à une autre (complément de la règle précédente) et donc privilégier les paramètres de fonction aux variables globales;
    • Typer systématiquement tes variables;
    • Supprimer le hardcoding (écriture de données métier directement dans le code);
    • Etre systématique dans ta façon de coder;
    • Etre systématique dans ta façon de nommer;
    • ...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  17. #17
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 593
    Points : 34 257
    Points
    34 257
    Par défaut
    Salut,

    je peux completer ce qu'a dit Pierre en te proposant ceci :
    - atomiser le code en modules de telle sorte que le code que chaque module contient un code qui ne depend pas des autres modules
    - faire en sorte que ta nomenclature de nommage soit propre sans etre trop lourde pour le developpement de nouvelles fonctionnalites
    - t'affranchir des variables applicatives (Access.Application, Outlook.Application, etc.) et leur preferer un type Object avec un CreateObject()/GetObject() en consequence pour ne plus te sourcier des multiples versions Office qui tournent sur les postes utilisateurs.
    - passer par des fichiers .ini pour stocker des variables qui peuvent evoluer (donc non hardcodees dans le code, mais lues a la volee)
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  18. #18
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 30
    Points : 7
    Points
    7
    Par défaut
    Wahouu je suis vraiment content de toutes ces réponses !
    Je vois et reconnais même des grosses têtes du forum, ça fait plaisir ^^

    Alors tout d'abord, Bonjour Marc-L, Pierre Fauconnier et Jean-Philippe André et merci de vos réponses.

    @Marc-L :

    Actuellement le jury n'a aucune influence sur ce que je dois produire et/ou faire et je ne vais pas leur en rendre compte étant donné que ma deuxième soutenance sera porté sur un sujet bien loin du code VBA.
    Mais ! Lors de ma première soutenance, il a été évoqué cette "pérennisation du code", ce qui a mis la puce à l'oreille de mon tuteur et il c'est fait la réflexion suivante :
    C'est vrai qu'il faudrait pouvoir pérenniser les codes VBA que tu créés. Ils nous sont très utile, mais Demain tu ne seras plus là et mon équipe composé de 4 techniciens (âgés de 45 ans minimum), n'ont pas les connaissances requises pour pouvoir l'exploiter. Il faut donc trouver un moyen pour que ton "savoir" soit transmis à un futur nouvel alternant si il y a besoin de retoucher au fichier.

    Du coup, à l'heure actuelle, mon fichier fonctionne, le code est bon, pas perfectionné, mais il fonctionne.
    Mon objectif est de laisser une trace permettant à mon éventuel remplaçant de toucher le code si besoin...


    @Pierre Fauconnier :

    Je comprend tout à fait ce que tu me dis. Mais est-ce que commenter mon code comme cela pourra permettre à un débutant de se l'approprier et donc de pouvoir le modifier ? Je pense que oui, mais après tout donnes moi ton avis.
    Suite à ton message, j'ai différentes questions :

    - Qu'est-ce qu'une fonction ou procédure à une seule responsabilité ?
    - Qu'est-ce qu'une variable d'environnement et d'applications ?
    - Qu'est-ce que le hardcoding ?
    - Qu'entends-tu par systématique ?

    Et oui, tu l'as remarqué, je n'ai presque rien compris


    @Jean-Philippe André :

    Lorsque tu me dis :

    - "atomiser le code en modules" => Tu entends : "Séparer le code en fonction de chaque petite action qu'il réalise" ? Du style : A - Prendre les données puis [Code] puis B - Traiter les données puis [Code] puis C - Créer un graphique puis [Code] etc.
    - Ma nomenclature de constante et de variable est... Dégoûtante je pense.
    - Les variables applicatives je pense ne pas en avoir.
    - QU'est-ce qu'un fichier .ini


    Suite à ce message je vais mettre une partie de mon code, enfin 1 de mes 2 gros codes. S'il vous plaît, soyez tolérant sur ce que vous allez voir.
    C'est le travail de plusieurs semaines en partant de 0 avec le peu de connaissance que j'ai.
    Si vous avez des remarques / suggestions sur comment commenter / expliquer / pérenniser ce code, alors je suis preneur !

    Cordialement
    Oparion

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    Sub Création_des_Graphiques()
     
    Dim Lig     As Long
    Dim NumLig  As Long
     
    Dim Lig2     As Long
    Dim NumLig2  As Long
     
    Dim Lig3     As Long
    Dim NumLig3  As Long
     
    Dim Col     As Long
    Dim NumCol  As Long
     
    Dim Col2     As Long
    Dim NumCol2  As Long
     
    Dim Diff1 As Double
    Dim Diff2 As Double
     
    Dim a As Long
    Dim b As Long
    Dim c As Long
    Dim d As Long
     
    Dim r As Integer
    Dim Cpt As Integer
    Dim CptSh As Integer
     
    '###### CREATION DE L'ONGLET : DONNEES D'EXPERIMENTATIONS ######
     
        Sheets.Add After:=Sheets(Sheets.Count - 2)
        ActiveSheet.Name = ("Données d'expérimentations")
     
    '###### DEPLACER LES DONNEES DE L'ONGLET DONNEES BRUTES A ANALYSE DES DONNEES ######
     
        Sheets("Données Brutes").Select
        Sheets("Données Brutes").Copy Before:=Sheets("Graphique")
        Sheets("Données Brutes (2)").Select
        Sheets("Données Brutes (2)").Name = "Analyse des données"
     
    '###### SEPARER LES DONNEES D'EXPERIMENTATIONS ET RELEVE DE MESURES ######
     
     
    Sheets("Données d'expérimentations").Activate
    Cells.Select
    Selection.ClearContents
     
    Sheets("Analyse des données").Activate
    NumLig = 0
    Lig = 1
        While Cells(Lig, 1).Value <> "Balayage"
          NumLig = NumLig + 1
          Lig = Lig + 1
        Wend
    range(Cells(1, 1), Cells(NumLig, 50)).Copy
    Sheets("Données d'expérimentations").Activate
    range("A1").PasteSpecial
    Sheets("Analyse des données").Activate
    range(Cells(1, 1), Cells(NumLig, 50)).Delete
     
    Sheets("Données d'expérimentations").Activate
        With Selection
            .HorizontalAlignment = xlCenter
            .VerticalAlignment = xlBottom
            .WrapText = False
            .Orientation = 0
            .AddIndent = False
            .IndentLevel = 0
            .ShrinkToFit = False
            .ReadingOrder = xlContext
            .MergeCells = False
        End With
        Selection.Borders(xlDiagonalDown).LineStyle = xlNone
        Selection.Borders(xlDiagonalUp).LineStyle = xlNone
        With Selection.Borders(xlEdgeLeft)
            .LineStyle = xlContinuous
            .ColorIndex = 0
            .TintAndShade = 0
            .Weight = xlThin
        End With
        With Selection.Borders(xlEdgeTop)
            .LineStyle = xlContinuous
            .ColorIndex = 0
            .TintAndShade = 0
            .Weight = xlThin
        End With
        With Selection.Borders(xlEdgeBottom)
            .LineStyle = xlContinuous
            .ColorIndex = 0
            .TintAndShade = 0
            .Weight = xlThin
        End With
        With Selection.Borders(xlEdgeRight)
            .LineStyle = xlContinuous
            .ColorIndex = 0
            .TintAndShade = 0
            .Weight = xlThin
        End With
        With Selection.Borders(xlInsideVertical)
            .LineStyle = xlContinuous
            .ColorIndex = 0
            .TintAndShade = 0
            .Weight = xlThin
        End With
        With Selection.Borders(xlInsideHorizontal)
            .LineStyle = xlContinuous
            .ColorIndex = 0
            .TintAndShade = 0
            .Weight = xlThin
        End With
        Columns("A:A").EntireColumn.AutoFit
        Columns("B:B").EntireColumn.AutoFit
        Columns("C:C").EntireColumn.AutoFit
        Columns("D:D").EntireColumn.AutoFit
        Columns("E:E").EntireColumn.AutoFit
        Columns("F:F").EntireColumn.AutoFit
        Columns("G:G").EntireColumn.AutoFit
        Columns("H:H").EntireColumn.AutoFit
        Columns("I:I").EntireColumn.AutoFit
        Columns("J:J").EntireColumn.AutoFit
        Columns("K:K").EntireColumn.AutoFit
        Columns("L:L").EntireColumn.AutoFit
        Columns("M:M").EntireColumn.AutoFit
        Columns("N:N").EntireColumn.AutoFit
        Columns("O:O").EntireColumn.AutoFit
        Columns("Q:Q").EntireColumn.AutoFit
        Columns("R:R").EntireColumn.AutoFit
        Columns("S:S").EntireColumn.AutoFit
        Columns("T:T").EntireColumn.AutoFit
     
     
    Sheets("Analyse des données").Activate
     
    '##################### SUPPRESSION DES COLONNES INUTILES #####################
     
    For a = 5 To 20
        range(Cells(1, a), Cells(65530, a)).Select
        Selection.Delete Shift:=xlToLeft
    Next
     
    '##################### CALCUL NOMBRE DE LIGNES ET COLONNES #####################
    Col = 1
    While Cells(2, Col).Value <> ""
        NumCol = NumCol + 1
        Col = Col + 1
    Wend
     
    Lig2 = 1
    While Cells(Lig2, 1).Value <> ""
        NumLig2 = NumLig2 + 1
        Lig2 = Lig2 + 1
    Wend
     
    '##################### REMISE A ZERO DES TITRES DES COLONNES #####################
     
    range("A1:ZZ1").Select
    Selection.ClearContents
    range("A1") = "Balayage"
    range("B1") = "Date"
    range("C1") = "Heure"
    NumCapteur = 101
    For b = 4 To NumCol
        Cells(1, b) = NumCapteur
        NumCapteur = NumCapteur + 1
    Next
     
    '##################### MISE EN FORME #####################
     
    range(Cells(1, 1), Cells(NumLig2, NumCol)).Select
     
        With Selection
            .HorizontalAlignment = xlCenter
            .VerticalAlignment = xlBottom
            .WrapText = False
            .Orientation = 0
            .AddIndent = False
            .IndentLevel = 0
            .ShrinkToFit = False
            .ReadingOrder = xlContext
            .MergeCells = False
        End With
        Selection.Borders(xlDiagonalDown).LineStyle = xlNone
        Selection.Borders(xlDiagonalUp).LineStyle = xlNone
        With Selection.Borders(xlEdgeLeft)
            .LineStyle = xlContinuous
            .ColorIndex = 0
            .TintAndShade = 0
            .Weight = xlThin
        End With
        With Selection.Borders(xlEdgeTop)
            .LineStyle = xlContinuous
            .ColorIndex = 0
            .TintAndShade = 0
            .Weight = xlThin
        End With
        With Selection.Borders(xlEdgeBottom)
            .LineStyle = xlContinuous
            .ColorIndex = 0
            .TintAndShade = 0
            .Weight = xlThin
        End With
        With Selection.Borders(xlEdgeRight)
            .LineStyle = xlContinuous
            .ColorIndex = 0
            .TintAndShade = 0
            .Weight = xlThin
        End With
        With Selection.Borders(xlInsideVertical)
            .LineStyle = xlContinuous
            .ColorIndex = 0
            .TintAndShade = 0
            .Weight = xlThin
        End With
        With Selection.Borders(xlInsideHorizontal)
            .LineStyle = xlContinuous
            .ColorIndex = 0
            .TintAndShade = 0
            .Weight = xlThin
        End With
     
    '######### CREATION DE L'ONGLET : ANALYSE DES DONNEES ET DE LA COLONNE TEMPS(H) #########
     
    Sheets("Analyse des données").Activate
        Columns("D:D").EntireColumn.Select
        Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
        ActiveCell.Select
     
    '########### TITRE ET FORMULE COLONNE TEMPS(H) ###########
     
    range("D1") = "Temps (h)"
     
    range("D2").FormulaLocal = "=GAUCHE(C2;8)"
    range("D2").Select
    Selection.AutoFill Destination:=ActiveCell.range(Cells(1, 1), Cells(NumLig2 - 1, 1))
    ActiveCell.range(Cells(1, 1), Cells(NumLig2 - 1, 1)).Select
    range("D2").Select
     
    '######### CREATION DE LA COLONNE TEMPS REFERENCE (s) #########
     
    Sheets("Analyse des données").Activate
        Columns("E:E").EntireColumn.Select
        Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
        ActiveCell.Select
     
    '########## TITRE ET FORMULE COLONNE TEMPS REFERENCE (s) #########
     
    range("E1") = "Temps référence (s)"
     
    range("E2").FormulaLocal = "=ARRONDI((D2-$D$2)*(24*60*60);0)"
    range("E3").FormulaLocal = "=ARRONDI((D3-$D$2)*(24*60*60);0)"
    range("E4").FormulaLocal = "=ARRONDI((D4-$D$2)*(24*60*60);0)"
     
    Diff1 = Cells(3, 5).Value - Cells(2, 5).Value
    Diff2 = Cells(4, 5).Value - Cells(3, 5).Value
     
    If Diff1 = Diff2 Then
        c = Cells(3, 5).Value
    End If
     
    For d = 5 To NumLig2
        Cells(d, 5) = Cells(d - 1, 5) + c
    Next
     
    Col2 = 1
    While Cells(2, Col2).Value <> ""
        NumCol2 = NumCol2 + 1
        Col2 = Col2 + 1
    Wend
     
    Lig3 = 1
    While Cells(Lig3, 1).Value <> ""
        NumLig3 = NumLig3 + 1
        Lig3 = Lig3 + 1
    Wend
     
    '####### REMPLACE LES POINTS PAR DES VIRGULES DANS LES COLONNES DE MESURES (A PARTIR DE F) ######
     
    Sheets("Analyse des données").range(Cells(2, 6), Cells(NumLig3, NumCol2)).Replace What:=".", Replacement:=".", LookAt:=xlPart, SearchOrder _
    :=xlByRows, MatchCase:=False
     
    '##################### CREATION DES GRAPHIQUES #####################
     
    NumCol2 = NumCol2 - 5
    Worksheets("Graphique").Visible = 1
     
    For i = 1 To NumCol2
     
     
        Sheets.Add After:=Sheets(Sheets.Count)
        ActiveSheet.Name = ("Graphique " & i)
        s = Sheets.Count - 1
     
            For E = 1 To s
                Sheets("Graphique " & i).Select
                Sheets("Graphique " & i).Move After:=Sheets(E)
            Next E
     
        Sheets("Analyse des données").Select
        range(Cells(2, 5 + i), Cells(NumLig3, 5 + i)).Select
        ActiveSheet.Shapes.AddChart.Select
        ActiveChart.ChartType = xlXYScatter
        ActiveChart.PlotArea.Select
     
        ActiveChart.SeriesCollection(1).Name = "='Analyse des données'!$" & ColLetter(Cells(1, 5 + i)) & "$1"
        ActiveChart.SeriesCollection(1).XValues = "='Analyse des données'!$E$2:$E$" & NumLig3
        ActiveChart.SeriesCollection(1).Values = "='Analyse des données'!$" & ColLetter(Cells(1, 5 + i)) & "$2:$" & ColLetter(Cells(1, 5 + i)) & "$" & NumLig3
     
            With ActiveChart
                .HasTitle = False
                .Axes(xlCategory, xlPrimary).HasTitle = False
                .Axes(xlValue, xlPrimary).HasTitle = False
            End With
     
     
        ActiveChart.Parent.Cut
        Sheets("Graphique " & i).Select
        range("C6").Select
        ActiveSheet.Paste
        Sheets("Analyse des données").Select
     
    '##################### AGRANDISSEMENT DES GRAPHIQUES #####################
     
        Sheets("Graphique " & i).Select
        ActiveSheet.ChartObjects("Graphique 1").Activate
        ActiveSheet.Shapes("Graphique 1").IncrementLeft -87.75
        ActiveSheet.Shapes("Graphique 1").IncrementTop -57
        ActiveSheet.ChartObjects("Graphique 1").Activate
        ActiveSheet.Shapes("Graphique 1").ScaleWidth 2.1270833333, msoFalse, _
            msoScaleFromTopLeft
        ActiveSheet.Shapes("Graphique 1").ScaleHeight 1.9444444444, msoFalse, _
            msoScaleFromTopLeft
     
    Next i
    Worksheets("Graphique").Visible = 0
     
    '##################### RENOMMER LES AXES DES GRAPHIQUES #####################
     
    f = InputBox("Quel est le titre de l'axe des abscisses ?")
    g = InputBox("Quel est le titre de l'axe des ordonnées ?")
     
    For i = 1 To NumCol2
     
    Sheets("Graphique " & i).Select
     
        ActiveSheet.ChartObjects("Graphique 1").Activate
        ActiveChart.ApplyLayout (1)
        ActiveSheet.ChartObjects("Graphique 1").Activate
        ActiveChart.Axes(xlCategory).AxisTitle.Select
        ActiveChart.Axes(xlValue, xlPrimary).AxisTitle.Text = f
        Selection.Format.TextFrame2.TextRange.Characters.Text = f
        With Selection.Format.TextFrame2.TextRange.ParagraphFormat
            .TextDirection = msoTextDirectionLeftToRight
            .Alignment = msoAlignCenter
        End With
        With Selection.Format.TextFrame2.TextRange.Font
            .BaselineOffset = 0
            .Bold = msoTrue
            .NameComplexScript = "+mn-cs"
            .NameFarEast = "+mn-ea"
            .Fill.Visible = msoTrue
            .Fill.ForeColor.RGB = RGB(0, 0, 0)
            .Fill.Transparency = 0
            .Fill.Solid
            .Size = 10
            .Italic = msoFalse
            .Kerning = 12
            .Name = "+mn-lt"
            .UnderlineStyle = msoNoUnderline
            .Strike = msoNoStrike
        End With
        ActiveChart.Axes(xlValue).AxisTitle.Select
        ActiveChart.Axes(xlValue, xlPrimary).AxisTitle.Text = g
        Selection.Format.TextFrame2.TextRange.Characters.Text = g
        With Selection.Format.TextFrame2.TextRange.ParagraphFormat
            .TextDirection = msoTextDirectionLeftToRight
            .Alignment = msoAlignCenter
        End With
        With Selection.Format.TextFrame2.TextRange.Font
            .BaselineOffset = 0
            .Bold = msoTrue
            .NameComplexScript = "+mn-cs"
            .NameFarEast = "+mn-ea"
            .Fill.Visible = msoTrue
            .Fill.ForeColor.RGB = RGB(0, 0, 0)
            .Fill.Transparency = 0
            .Fill.Solid
            .Size = 10
            .Italic = msoFalse
            .Kerning = 12
            .Name = "+mn-lt"
            .UnderlineStyle = msoNoUnderline
            .Strike = msoNoStrike
        End With
        ActiveChart.ChartArea.Select
        ActiveChart.ChartTitle.Select
        ActiveChart.ChartTitle.Text = "Canal 10" & i
        Selection.Format.TextFrame2.TextRange.Characters.Text = "Canal 10" & i
        With Selection.Format.TextFrame2.TextRange.ParagraphFormat
            .TextDirection = msoTextDirectionLeftToRight
            .Alignment = msoAlignCenter
        End With
        With Selection.Format.TextFrame2.TextRange.Font
            .BaselineOffset = 0
            .Bold = msoTrue
            .NameComplexScript = "+mn-cs"
            .NameFarEast = "+mn-ea"
            .Fill.Visible = msoTrue
            .Fill.ForeColor.RGB = RGB(0, 0, 0)
            .Fill.Transparency = 0
            .Fill.Solid
            .Size = 18
            .Italic = msoFalse
            .Kerning = 12
            .Name = "+mn-lt"
            .UnderlineStyle = msoNoUnderline
            .Strike = msoNoStrike
        End With
        ActiveChart.ChartArea.Select
     
    Next i
     
    '##################### CREATION DE L'ONGLET DONNEES CIBLEES #####################
     
    x = InputBox("Combien avez-vous de palier(s) d'étalonnage(s) ?")
     
    For i = 1 To x
        Sheets.Add After:=Sheets(Sheets.Count)
        Sheets(Sheets.Count).Name = "Données ciblées " & i
        Sheets("Analyse des données").Select
        Rows("1:1").Select
        Selection.Copy
        Sheets("Données ciblées " & i).Select
        ActiveSheet.Paste
    Next
     
    End Sub

  19. #19
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 593
    Points : 34 257
    Points
    34 257
    Par défaut
    Je laisserai mes camarades repondre quant a leurs parties
    Citation Envoyé par Oparion Voir le message
    @Jean-Philippe André :

    Lorsque tu me dis :

    - "atomiser le code en modules" => Tu entends : "Séparer le code en fonction de chaque petite action qu'il réalise" ? Du style : A - Prendre les données puis [Code] puis B - Traiter les données puis [Code] puis C - Créer un graphique puis [Code] etc.
    - Ma nomenclature de constante et de variable est... Dégoûtante je pense.
    - Les variables applicatives je pense ne pas en avoir.
    - QU'est-ce qu'un fichier .ini
    Si par exemple tu as une application qui :
    - genere un graphique
    - enregistre une plage de donnees au format pdf
    - envoie un mail avec un document en PJ

    => 3 modules = mChart pour les graphes, mPDF pour les exports sous format PDF, mMail pour tout ce qui aura trait aux mails

    Pour ta nomenclature, un peu de lecture : http://argyronet.developpez.com/office/vba/convention/

    Les fichiers ini https://vb.developpez.com/faq/?page=Systeme#ini
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  20. #20
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 926
    Points
    55 926
    Billets dans le blog
    131
    Par défaut
    Comme je l'ai dit, je pense qu'il ne sert à rien de commenter ton code comme je l'ai illustré, sauf si tu souhaites générer une documentation en automatique. Il me semble que bien nommer ses fonctions et ses variables est plus important que de les nommer n'importe comment puis de les commenter pour les expliquer.

    Fonction à une seule responsabilité: Une fonction, ça sert à une et une seule chose. Exemple: récupération des données d'un contact dans une feuille de calcul et affichage dans un userform pour modification, vérification puis transfert dans une feuille de calcul. Tu verras trop souvent tout le code dans le userform (initialize et bouton valider). C'est une erreur. Crée plutôt:
    une fonction dont la seule responsabilité est de te dire si c'est ok ou pas;
    Une fonction qui transfère les données dans un objet Contact dont tu auras créé la classe;
    Une fonction qui transfère les données d'un contact dans les contrôles du userform;
    un bouton validate qui appelle la fonction de vérification puis, si c'est ok, la fonction de chargement de l'objet Contact puis qui ferme le formulaire (aucun transfert en DB à ce stade);
    une fonction, dans un module que j'appelle souvent DAL (Data Access Layer), qui transfère un objet Contact en DB (dans la feuille);
    une fonction, dans ce module DAL, qui lit un contact en DB et charge l'objet Contact au départ de la feuille;

    Le code qui gère tout cela est situé hors userform et :
    charge le contact via la DAL;
    charge le userform;
    passe l'objet Contact au userform (propriété perso du userform qui appellera la fonction de chargement des contrôles);
    Affichage du userform;
    Après fermeture par le bouton valider, transfert des données dans la feuille via la fonction de la DAL.

    Dans cet exemple, chaque fonction ne fait qu'une seule chose: Charger un objet, transfert en DB ou de la DB, vérification, ... C'est cela n'avoir qu'une responsabilité.

    Les variables (et constantes) d'environnement sont des données dont tu as besoin un peu partout dans ton code. Ce sont en général des variables globales ou publiques qui vont créer un couplage fort entre tes fonctions, ce qui rend ton code plus fragile.

    Hardcoder, c'est mettre des données en dur dans le code. Avec Excel, ll est simple de stocker la valeur dans une cellule nommée et d'utiliser cette valeur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Path = "c:\Données\Fichier.xlsx"
    C'est du hardcoding. Il vaut mieux mettre le nom du fichier dans une cellule nommée Path et utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    path = range("Path").Value
    Etre systématique: Faire toujours la même chose. Si, pour un userform, tu
    charges le UF;
    le configures;
    récupères les données après fermeture.

    Alors, procède ainsi pour tous tes userforms.

    Si tu nommes une fonction ReadContact, alors nomme une fonction ReadCity et pas GetCity, ... Si pour un objet, tu nommes son identifiant ID, n'appelle pas l'identifiant d'un autre objet Key ou Nummer, appelle-le ID, ...

    Et n'hésite jamais à créer des modules pour regrouper tes fonctions.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

Discussions similaires

  1. afficher un graphique dans word à partir de mon code vba
    Par guysocode dans le forum VBA Word
    Réponses: 2
    Dernier message: 07/11/2005, 14h15
  2. Réponses: 2
    Dernier message: 27/10/2005, 15h51
  3. Réponses: 4
    Dernier message: 13/10/2005, 14h44
  4. Réponses: 3
    Dernier message: 06/09/2005, 10h27
  5. Comment creer une procédure stockée à partir d'un code VBA?
    Par Alcor020980 dans le forum Connexion aux bases de données
    Réponses: 4
    Dernier message: 24/05/2005, 19h55

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