Nettoyage et optimisation de code

Bonjour à toutes et à tous,

Je viens de m'inscrire sur ce forum, que je consulte déjà depuis longtemps, et qui m'a permis de résoudre de nombreux problèmes.

Je travaille actuellement à l'élaboration d'un fichier Excel dont le but est simple:

créer des menus (repas) à partir d'un tableau dans lequel sont renseignés tous les plats souhaités (entrée, plat, accompagnement, dessert). Malgré la nature personnelle de ce projet, je pense qu'un tel fichier pourrait rendre service à bien des gens.

Je viens soumettre le travail déjà réalisé à vos avis, critiques constructives, modifications... car le fichier fonctionne (je vais détailler rapidement le fonctionnement après), mais de nombreuses choses ne sont pas gérées, et je pense que la majeure partie du code et lourde, et pas du tout optimisée.

Pour que vous y voyiez plus clair, voici un petit descriptif de ce qui est fait, le fichier sera joint à ce message.

Je dispose de 3 onglets: "Liste de choix, Système, Menus proposés"

dans le premier onglet, j'ai créé 3 boutons permettant d'ouvrir des userforms afin:

  • d'ajouter de nouveaux plats
  • de créer les associations de plats (du poisson va bien avec du riz, mais pas avec des flageolets).
  • de changer la proposition aléatoire de menus pour 1 ou 2 repas, ou pour une semaine complète.

La proposition aléatoire d'un repas fonctionne ainsi, sur appui du bouton approprié:

  • recherche de la dernière ligne vide pour la colonne concernée (par exemple les entrées)
  • tirage d'un nombre au hasard dans la plage déterminée.
  • écriture du plat trouvé dans l'onglet "menus proposés"

Dans l'onglet "système", chaque accompagnement compatible avec le plat principal est indiqué en face de celui ci.

Durant le choix d'un accompagnement, celui ci est recherché dans l'onglet système, s'il est compatible, il est ajouté au menu proposé, sinon, un nouveau tirage aléatoire est effectué.

Voilà très grossièrement.

PROBLEMES:

-la méthode que j'ai utilisée pour reporter les menus proposés dans les textbox de mon userform N°3 est la seule que j'ai trouvé fonctionnelle, mais je suis preneur d'une solution plus viable que les 80 lignes de codes actuelles (une boucle n'est pas possible car il y a des sauts entre chaque ligne).

Je recherche également un code simple pour classer automatiquement par ordre alphabétique les plats proposés dans le premier onglet (ce que j'ai trouvé pour le moment n'a pas fonctionné). J'ai également fait un enregistrement de macro, mais beaucoup de choses me semblent inutiles, et en plus Excel plante (il y a plus de 2000 lignes à gérer).

Autre chose importante, dans le cas de l'élaboration des menus pour une semaine complète, j'aimerais pouvoir modifier par exemple uniquement le mardi midi après un tirage aléatoire, sans modifier les autres jours.

Enfin, de nombreux détails liés à l'ergonomie/utilisation du fichier seraient à améliorer je pense, comme la mise à jour des associations en cas de suppression d'un plat.

Un dernier problème, mais guère simple à résoudre je pense, la gestion de l'équilibre des repas sur une semaine: comment empêcher le tirage de pâtes 4 fois dans la semaine par exemple, ou encore comment proposer des légumes après plusieurs plats de féculents...?

N'hésitez pas à modifier le fichier, à me faire part de vos remarques, je suis preneur de toute idée ou apport de connaissances.

Une dernière chose, je viens de terminer mes études en automatismes industriels, j'apprends le vba sur le tas, et je connais pour le moment des fonctionnalités assez simples.

Je suis preneur de toute fonction vba un peu particulière, à condition qu'elle ne complique pas trop la globalité du fonctionnement.

Merci à tous pour vos pistes, bonnes fêtes de fin d'année !

Pierre

Bonjour,

Si on va pas-à-pas ...

Dans un IF, s'il y a juste une ligne, au lieu d'écrire :

If Close_Assoc_After_Validation.Value = True Then
        AssociationSetup.Hide
    End If

On peut écrire ainsi :

If Close_Assoc_After_Validation.Value = True Then AssociationSetup.Hide

Il y a plusieurs endroits qui pourraient être modifiés.

Je regarde encore et reviens.

Gelinotte

Bonjour,

J'ai juste survolé et quelques conseils généraux.

- Démarre tous tes modules par Option Explicit (fait automatiquement si tu coches 'Déclaration des variables obligatoires' dans Outils / Options...) : t'oblige à déclarer et typer toutes tes variables, le type devant être le plus proche possible du besoin réel (As Variant pour toutes ne sert pas à grand chose)

Ex :

Dim Lig As Long 'entier long

  • ça sera plus rapide
  • surtout des erreurs apparaitront immédiatement, dont certaines très difficiles à trouver comme une erreur de frappe : liste au lieu de listes etc
Voir types ici : https://www.excel-pratique.com/fr/vba/variables.php

- installer Smart Indenter v3.5

, très pratique. (fonctionne sur versions > 2003 bien que non annoncé)

- éviter les Goto et préférer les autres structures qui ne manquent pas. Goto ne devrait subsister que pour les traitements d'erreur.

eric

Bonjour Eric et Gelinote,

Merci pour vos premières réponses, rapides.

pour les if en 1 seule ligne, c'est vrai que ça peut alléger pas mal le code déjà. Je le savais mais je n'y pense pas

J'ai utilisé Option explicit dans certaines zones où j'avais des problèmes de type de variable justement, je vais tenter de généraliser cela pour toutes les fonctions.

merci pour le lien, c'est vrai que le vba d'excel n'est vraiment pas ergonomique et sympa à utiliser (indentation, coloration syntaxique...)

Rechercher des sujets similaires à "nettoyage optimisation code"