Rapport de message :*
 

Re: Ma macro ne s'exécute pas

Titre du sujet : Re: Ma macro ne s'exécute pas
par Mth le 19/05/2013 21:03:16

Bonjour Eudocha, bonjour à tous,

 

Concernant le numéro du producteur il ne s'arrête pas à 4, mais mes explications étaient sans doute trop sommaires, désolée.

Si tu vas dans l'onglet "TableProducteurs", colonne D dans la première cellule vide, tu as une liste déroulante te permettant de choisir l'axe pour lequel tu souhaites créer un nouveau numéro de producteur, cette liste déroulante fait référence à la zone nommée ListeAxes

Dès que tu as effectué ton choix, la formule dans la colonne E indique le nouveau numéro du producteur (j'ai ajouté par macro l'inscription de la date au cas où, en colonne F)

 

Cette formule est la suivante en E2 par exemple:

 

=SI(D2<>"";REPT("0";3-NBCAR(NB.SI(D$2:D2;D2)))&NB.SI(D$2:D2;D2)&MINUSCULE(GAUCHE(D2;1)&STXT(D2;CHERCHE("_";D2)+1;1));"")

 

En détaillant un peu:

  • CHERCHE("_";D2) indique la position du caractère _ dans le nom de l'axe. En cellule E2 le résultat renvoyé est 6, effectivement pour Epena_Nord le - est en 6ème position, il suffit d'ajouter 1 pour avoir la position du caractère suivant soit le N qui sera utilisé dans le nom du producteur. -voir ICI pour la fonction CHERCHE()-
  • La fonction STXT() (voir ICI) permet d'extraire une chaine de caractères, ici elle va extraire au sein de la cellule D2 un chaîne de caractères commençant à la position 7 (caluclée ci-dessus avec CHERCHE()) et d'une longueur de 1. STXT() renvoie donc la lettre N
  • GAUCHE(D2;1)  (voir ICI pour la fonction GAUCHE() ) cette fonction permet de renvoyer le premier caractère à gauche de la cellule D2, soit la lettre E
  • le signe & est équivalent à la fonction CONCATENER() -voir ICI-, cela permet d'obtenir les deux caractères l'un à la suite de l'autre soit EN
  • La fonction MINUSCULE() permet de transformer ce résultat en lettres minuscules pour obtenir: en
  • NB.SI(D$2:D2;D2) permet de calculer le nombre de fois où le contenu de la cellule D2 apparaît dans la plage de cellule D$2:D2. Ligne 2 cette fonction renvoie 1 car le libellé Epéna_Nord n'est présent qu'une fois. En passant ligne 2 qui contient également Epéna_Nord, cette fonction NB.SI() renvoie 2 car ce libellé apparaît pour la deuxième fois. D'autres libellés différents se succèdent jusqu'à la ligne 30 où l'on voit à nouveau Epéna_Nord, la fonction NB.SI() sur cette ligne renvoie 3 car c'est effectivement la 3ème fois que ce libellé est présent dans la colonne. Ce numéro passera à 4, 5, 6, etc. en augmentant de 1 à chaque fois que Epéna_Nord apparaîtra.

Comme tout à l'heure le signe & permet de concatener les résultats, les différents calculs ci-dessus permettent d'obtenir par exemple lige 2 le résultat 1en

 

Afin de faire précéder ce résultat de 1 ou 2 zéros j'utilise cette partie de la formule:

REPT("0";3-NBCAR(NB.SI(D$2:D2;D2)))

  • NB.SI(D$2:D2;D2) donne la même chose que tout à l'heure
  • la fonction NBCAR() (voir ICI)permet de compter le nombre de caractères  d'une chaîne, ainsi si la fonction NB.SI() renvoie 3, le nombre de caractères renvoyé par NBCAR() sera 1, si NB.SI() renvoie 25, NBCAR() renverra 2 caractères.
  • Si tu peux avoir 100 producteurs, cela signifie que l'on peut avoir 3 caractères maximum.
  • C'est là qu'intervient la fonction REPT() (voir ICI) qui permet de répéter des caractères un certain nombre de fois, ici le caractère à répéter est le 0, qui apparaîtra 2 fois (exemple 002) 1 fois (exemple 025) ou jamais.
  • Ce nombre de répétition du caractère zéro est calculé par 3-NBCAR(NB.SI(D$2:D2;D2)), 3 parce que c'est lé maximum, NBCAR(NB.SI(D$2:D2;D2)) pouvant renvoyer 1 2 ou 3. si j'ai 2 caractères je complète par un seul zéro devant (3-2=1), si j'ai un caractère je complète par deux zéros devant (3-1=2) etc.

 Pour la ligne 2 j'obtiens deux fois le caractère 0 

 

En concaténant le tout j'obtiens donc 001en ligne 2.

 

Voilà pour les explications de la formule. La logique que j'ai suivie consiste à créer d'abord le nouveau numéro du producteur si le cas se présente. Une fois le numéro créé, il sera alors disponible dans la liste déroulante de la colonne F de la table principale.

 

D'après ce que je comprends tu souhaiterais éviter cette étape intermédiaire en remplissant ta base directement soit avec un numéro existant soit en en créant un dans la foulée.  J'imagine qu'il faudrait ouvrir un Userform au clic des cellules colonne F, ce Userform présenterait les numéros existants pour l'axe en question, tout en offrant la possibilité d'en créer un nouveau. C'est certainement faisable mais beaucoup plus compliqué (me semble-t-il) y compris pour toi qui devra par la suite assurer la maintenance de cette base.

 

Vois si déjà tu peux tirer quelque chose du fichier joint, on pourra peut-être affiner ensuite.

 

Très bonne soirée,

 

mth