j'ai chargé ton fichier et je l'ai ouvert dans Excel XP. Effectivement, il m'indique bien que Eurotool.xla doit être chargé (moi je ne l'ai pas mis sur ma machine donc plus tard ça me renvoie une valeur d'erreur dans certaines cellules).
Ensuite, je suis allé voir le code : quelques erreurs ou maladresses recensées :
- tu ne travailles pas en Option Explicit, c'est à dire que tu n'as déclaré aucune de tes variables. Ainsi, si à l'usage les utilisateurs n'obtiennent que l'erreur que tu décris, tu auras déjà de la chance.
- dans tes userforms, tu n'as donné aucun nom à tes contrôles. Comment t'y retrouves tu ?
- Si je prends l'exemple du userform3, même en appuyant sur la touche Annule, il est impossible d'en sortir, ce qui n'est pas très normal. Heureusement qu'il reste la croix pour quitter.
-D'autre part toujours dans ces userforms, tu commets une erreur très fréquente (même certains "pros" la commettent) : tu qualifies certains de tes contrôles à l'intérieur de tes userforms, du genre :
UserForm1.TextBox8.ForeColor = RGB(255, 0, 0)
Ce qui est inutile, voire source d'erreur si plus tard (comme je te le conseille d'ailleurs !) tu renommes ces userforms. Il serait donc plus prudent d'écrire simplement :
TextBox8.ForeColor = RGB(255, 0, 0)
-et pour en finir avec ces userforms, quand tu écris :
UserForm4.Hide
Range("F1").Select
ActiveSheet.Protect
Unload Me
End
tu commets 3 erreurs d'un coup, dont l'une peut être très gênante, voire rédhibitoire !
1. d'une part, tu qualifies inutilement une commande (Userform4.Hide au lieu de Me.Hide)
2. juste après ce Hide, tu écris Unload Me, donc le Hide est parfaitement inutile, puis qu'en se déchargeant, le userform va disparaître.
3. si tu écris End, cela veut dire que tu mets fin au programme et que donc, toutes les variables que tu as pu initialiser auparavant sont réinitialisées !
Une règle d'or : jamais de End dans un programme, sauf éventuellement dans une routine de gestion d'erreurs, (et encore) !
Dernière chose : sauf à de rares cas, il vaut mieux quitter un userform avec Unload Me que avec Me.Hide
Enfin, concernant ton erreur
b = Round(Cells(5, 6).Value, 2)
cela vient de ce que la cellule dont tu veux donner la valeur à ta variable b contient une valeur d'erreur. Cette erreur se transmet donc à cette variable, et comme tu n'as aucune gestion d'erreur, ça plante.
Conclusion, il te reste à implémenter une solide gestion des erreurs dans tout ton programme. Je sais, c'est le plus pénible, et l'expérience montre qu'il vaut mieux faire ça en même temps que tu écris tes procédures, sinon tu oublieras toujours une petite source d'erreur vicieuse non gérée quelque part.
Voilà, ne le prend pas mal, toutes ces erreurs, on les a tous commises un jour ou l'autre... Donc si tu ne dois retenir de tout cela qu'un seul conseil : travaille en Option Explicit (et essaie d'éviter les Select aussi)