Format currency et declaration de variable

Bonsoir à toute & tous,

J’ai 2 petits soucis en Vba le premier et que :

Quand je rentre un chiffre dans la textbox ‘tbtravail’ qui est en format ‘currency’

Quand celle-ci arrive dans le formulaire colonne ‘h’ , elle est bien au format monétaire

Par contre, je suis obligé de convertir la cellule en nombre pour que la mise en forme conditionnelle s’applique.

Ai-je oublié qque chose ??

2 IIème

Je souhaite en colonne ‘K’ récupère le temps passé à entrer des données quand je ferme le formulaire.

Pour ce faire 2 variable

A= tbfintravail

B=tbtravail

L’opération se fait correctement sauf que la variable ‘b’ ne stocke pas la première valeur (le début du travail) quand je ferme le formulaire celle-ci récupère la dernière.

J’espère être assez clair , je reste à votre disposition.

Je vous joins mon fichier cela est plus parlant.

D’avance merci

Bonsoir,

Ai-je oublié qque chose ??

Oui !

Qu'une TextBox n'a pas de format ! Elle ne contient et ne peut contenir que du texte. Donc ce qui en sort peut présenter un format particulier, mais ce ne sera une donnée correspondant au type présenté (dès lors que ce format est typique d'un type de données particulier) qu'après conversion dans ce type...

Que la fonction Format produit inévitablement du texte (donnée de type String) quel que soit ce qu'on lui présente...

Qu'un format numérique spécifique, sur feuille Excel est fourni par le format de cellule, et qu'il convient de distinguer valeur de la cellule (valeur qu'on doit affecter...) et format de la cellule qui fait apparaître cette valeur sous une forme prédéfinie.

Alors, Excel et aussi VBA peuvent opérer des conversions automatiques, dont certaines aboutissent à ce qu'on souhaite et d'autres non...

Ainsi tes montants en colonne H sont bien des nombres , tes heures en J et K sont bien des données horaires , mais le calcul de différence de valeurs de TextBox, il n'est pas sûr qu'il se fasse ou se fasse correctement , et de même en A tes dates ne sont pas des dates mais du texte .

Cordialement.

Bonjour MFernand,

A ma décharge, je me suis peut-être mal exprimé dans mon 1 ere post.

Et oui je sais que je me suis mis à Excel il y à 3 mois mais j’ai bien appris ma leçon sur les textbox qui ne renvois que du texte (je regarde des tuto, j’ai même imprimé la bible comme disent certains de Michel Tanguy),je ne suis qu’un débutant . J’ai mis ceci :

(Quand je rentre un chiffre dans la textbox ‘tbtravail’ qui est en format ‘currency ’ )

J’ai bien noté au format currency qui me renvoi bien une valeur monétaire tout comme les 3 autres qui sont des valeur récurrentes celles-ci

TBprix_1.Value = Format(TBa59, "currency")

TBprix_2.Value = Format(TBa70, "currency")

TBprix_3.Value = Format(TBa116, "currency")

A la différence c’est que ces 3 données vont dans la feuille concernée et sont au format Nombre

Alors que

If TBPrix.Value <> "" Then

Range("h" & num) = Format(TBPrix, "currency")

Tu dis je cite « Ainsi tes montants en colonne H sont bien des nombres »

Si tu regardes le fichier en Décembre en H 8 on peut voir que la mise en forme conditionnelle n’ai pas appliqué et pour cause le petit triangle vert en haut gauche de la cellule me demande de convertir en Nombre.

Je suis obligé de mettre manuellement la cellule en Nombre ?? d’où ma 1 ere question.

Tu dis encore « et de même en A tes dates ne sont pas des dates mais du texte »

« Tes heures en J et K sont bien des données horaires , mais le calcul de différence de valeurs de TextBox, il n'est pas sûr qu'il se fasse ou se fasse correctement »

Si le calcul se fais correctement, mais ma variable ne garde pas en mémoire la première valeur dans la TBtravail quand je lance le formulaire, elle prend la dernière d’où ma 2 ieme question ???

Je dois vraiment être bête.

je pensé avoir une piste, un essai, une modification car étant un grand débutant je fais ce que je peux.

Cordialement

Bonjour,

J'ai un peu de mal à te suivre... J'ai indiqué ce que j'ai constaté (sur feuille Décembre, je n'ai pas vu de données ailleurs). Tes dates en A ne sont pas des dates, ça c'est sûr, tes autres valeurs litigieuses sont bien numériques mais j'ignore si c'est naturellement ainsi ou si une manip. supplémentaire a dû intervenir, et tes durées horaires je ne peux évaluer si c'est le bon résultat...Je n'ai par ailleurs pas cherché à comprendre la dichotomie entre Valider et Fermer...

Pour faire simple, le principe que je préconise :

1) Lorsqu'on alimente des TextBox, rien n'empêche d'utiliser Format : on va placer une chaîne de texte, qui peut tout à fait être constituée par une valeur numérique formatée et renvoyée en texte.

Si l'alimentation des TextBox se fait à partir de contenus de cellules, on a un moyen encore plus simple qui consiste à utiliser la propriété Text de l'objet Range (Value est la propriété par défaut [si on l'omet, c'est Value], elle renvoie la valeur, sans format particulier, Text renvoie ce qui apparaît dans la cellule, la valeur formatée...

2) Par contre lors de l'affectation de valeurs de TextBox à des cellules, proscrire absolument Format. Le format est l'affaire du format de cellule, on affecte des valeurs, si la cellule n'est pas préalablement au bon format, on peut l'ajuster (propriété NumberFormat de l'objet Range).

3) S'agissant de dates, le texte des TextBox doit d'abord être dans un format permettant une identification comme date par VBA. Si le doute peut être permis, on teste avec IsDate qui indiquera si un texte est convertible en date. Ce point étant acquis, on convertit systématiquement en date à la sortie de la TextBox avec CDate ou DateValue.

    .Cells(lni, 1) = CDate(TextBox1.Value)

On évite ainsi toute conversion sauvage par VBA susceptible de produire une inversion mois/jour (jour inférieur à 13) car reconnaissance sur le format américain, en forçant l'identification selon les paramètres régionaux de Windows.

4) La conversion des valeurs numériques simples s'opère en principe automatiquement... Si des difficultés surviennent avec des valeurs formatées, on peut opérer avec Val :

    .Cells(lni, 5) = Val(Replace(TextBox5.Value, ",", "."))

Val ignore les espaces, convertit en nombre tout texte composé de chiffres jusqu'à ce qu'il rencontre un caractère autre, mais ne reconnaît que le point comme séparateur décimal.

5) Si on veut garantir que des opérations à partir de données de TextBox se fassent correctement, on convertit systématiquement... Dans le cas de texte représentant des données horaires, la conversion s'opére avec TimeValue.

Cordialement.

Merci MFernand pour ta réponse et pour tes explications , je vais m'en imprégner et

mettre en application les différentes modifications .

Encore merci

Cordialement

Bonjour,

et ça ne sert à rien de t'acharner à mettre des Currency dans une cellule, elle ne contient que des doubles.

Met la valeur (avec cdbl(xxx) par exemple) et le format de cellule fera le reste.

eric

Voila MFernand cela fonctionne comme je le souhaitais merci

L'autre sujet je comprend que tu es du mal à me suivre

j'ai 2 variables

a= TBfintravail dans la macro Ferme_click()

b=TBtravail

voila quand je lance le formulaire on constate que dans la textbox " tbtravail" les données ("hh mm ss") y sont bien ecrit.

je souhaiterais que ma variable "b" garde en mémoire cette première donnée (car il nous arrives d'avoir 60 retours courriers)

et que tant que je valide les données forcement le temps passe et le formulaire se réinitialise automatiquement jusqu'au moment ou

et c'est la ou je veux en venir

quand je valide le bouton" fermer "le calcul s’opère

  Private Sub CBFerme_Click()

    If Month(Date) = 1 Then janvier  '************************
    If Month(Date) = 2 Then fevrier  ' Procédure pour valider*
    If Month(Date) = 3 Then mars     ' les données dans le   *
    If Month(Date) = 4 Then avril    ' mois en cours         *
    If Month(Date) = 5 Then mai      '************************
    If Month(Date) = 6 Then juin
    If Month(Date) = 7 Then juillet
    If Month(Date) = 8 Then aout
    If Month(Date) = 9 Then septembre
    If Month(Date) = 10 Then octobre
    If Month(Date) = 11 Then novembre
    If Month(Date) = 12 Then decembre

        Dim num As Integer          '**********************  je demensionne la variable (Num)
        Dim a As Date
        Dim b As Date

    b = TBtravail
                                                 '*************************
        num = Range("a250").End(xlUp).Row '''''' Variable pour connaitre  *
                                                 ' la derniere ligne vide *
                                                 '*************************
        TBfintravail.Value = Now()
        a = TBfintravail
        Range("k" & num) = Format(a - b, "hh:mm:ss")

        Unload Me

End Sub

le problème vient que la variable "b" ne garde en mémoire que la dernière heure dans la textbox "TBtravail" alors que je souhaiterais la première quand j'ai ouvert le formulaire.

j’espère être clair j'ai des doutes

je reste à votre disposition merci

Cordialement

Pour qu'une variable conserve la valeur affectée dans une procédure pour l'utiliser dans une autre, il faut la déclarer en variable niveau module et plus en variable locale...

Cordialement.

Rechercher des sujets similaires à "format currency declaration variable"