Bonjour,
Je vais regarder en détail mais déjà un premier retour. Un TextBox est un contrôle qui manipule du texte donc quand tu enregistres directement la valeur "TextBox.Value" tu enregistres du texte même si la valeur a l'apparence d'un numérique ou d'une date. Pour le pbm de la somme, tu peux le voir sur la feuille Feuil1, les cellules des colonnes montant ont un petit triangle vert en haut à gauche des cellules et quand tu sélectionnes une cellule, une petite icône avec un point ! est affichée sur fond jaune, si tu mets le curseur dessus ou si tu ouvres la liste, tu verras "Nombre stocké sous forme de texte". C'est pour cela que la somme affiche 0.
Pour remédier à ce problème, il faut stocker les valeurs en utilisant une fonction de conversion adapté au contenu souhaité : MaCelluleDate.Value = CDtate(TextBox.Value), MaCelluleMonetaire.Value = CDbl(TextBox.Value), etc. (il y a toute une panoplie de fonctions de conversion). Il faut donc adapter ton code car pour l'instant tu fais une boucle (For i = 1 To 21) et tu stockes directement. La boucle a l'avantage d'éviter l'écriture de 21 lignes donc il faut garder le principe mais la modifier. Pour l'instant tu te bases sur le n° du TextBox, inconvénient (à mon sens) tu n'as pas l'info de la donnée à laquelle il se rapporte. Pers et ça n'engage que moi, je préfère nommer mes TextBox, 1 en les préfixant avec un code (ici "tb") qui me permet de savoir quel type d'objet il s'agit et avec un nom court mais significatif, exemple pour le TextBox de la date de début "TBox9" j'aurai "tbDatDeb" qui me donne à la fois le type de contrôle "tb", la donnée à laquelle il se rapporte "DatDeb" et du coup le type de donnée qu'il stocke.
Le fait qu'il porte un nom significatif ne t'empêche pas d'avoir une boucle dans laquelle tu peux formater l'objet selon le type de donnée. En général, j'utilises 3 tableaux, le 1er avec le nom des objets, le 2ème avec les types et le 3ème avec les formats. J'initialise ces 3 tableaux dans la procédure Initialize du UserForm. Exemple :
' Dans un module commun ou dans le module du UserForm tu peux définir des constantes de formatage
Public Const fmtDate = "DD/MM/YYYY"
Public Const fmtHeure = "hh:mm"
Public Const fmtEntier = "# ##0"
Public Const fmtMontant = "",##0.00" ' , = séparateur des milliers et . = séparateur décimal
Private Sub UserForm_Initialize()
Dim acCtrlNoms as string
Dim acCtrlTypes as string
' Initialisation des tableaux liés aux contrôles
acCtrlNoms = Array("tbDatDeb", "tbHDeb", "tbDatFin", "tbHFin", "tbNjJ", "tbKmDeb", "tbMtJour", etc.)
' tu peux utiliser les constantes de type ou définir tes propres valeurs ou mixer (le type heure est encapsulé dans vbDate donc ne permet pas de les distinguer d'où le mixage)
acCtrlTypes = Array(vbDate, "Heure", vbDate, "Heure", vbInteger, vbLong, vbCurrency ...)
acCtrlFormats = Array(fmtDate, fmtHeure, fmtDate, fmtHeure, fmtEntier, fmtEntier, fmtLong, ...)
Ensuite tu peux utiliser ces tableaux pour faire des contrôles à la saisie, au stockage des valeurs, etc. Je ne développe pas plus car (c'est déjà un peu long ) et je ne sais pas si tu es intéressé, si oui, dits le moi et j'adapterai une partie du code en mettant en œuvre le principe sur 2 ou 3 contrôles et je te repasserai la main.
Pour l'imagelist, je regarde mais ça ressemble à un pbm de référencement du contrôle, si c'est ça il est fort probable que je n'ai pas le souci sur mon pc ...