VBA sauvegarde valeur textbox

Bonjour,

quelqu'un saurait il me dire comment faire pour garder en mémoire le texte saisit dans mes textbox?

J'ai créé un userform avec 25 textbox ou j'instruit des dates de jalons. Les valeurs sont renvoyées dans des céllules d'une feuille.

Lorsque je ferme ma userform les valeurs restent dans les cellules excel (très bien) mais lorsque j'ouvre à nouveau mon userform elles ne sont plus dans les textbox.

Je souhaite que ces valeurs restent affichées en constant dans les textbox et qu'evidemment lorsqu'elles sont modifiées renvoi la nouvelle valeur dans la cellule attribuée.

Je débute en VBA et là je rame un peu

Ci joint un exemple car c'est toujours plus parlant

=> A l'ouverture de la userform j'aimerai retrouvez mes valeurs qui sont inscrites de B14 à B16

Merci d'avance pour votre aide,

NS

85exemple.xlsm (20.96 Ko)

Bonjour,

j'ai ajouté la macro suivante, c'est ok ?

Private Sub UserForm_Initialize()
For i = 1 To 3
 Me.Controls("TextBox" & i) = Format(Sheets("Feuil1").Cells(i + 13, 2).Value, "yyyy-mm-dd")
Next
End Sub

Bonjour et merci pour ce retour rapide, c'est presque ça.

Il ne reste que la date qui est au format "yyyy-mm-dd" (inversé quand je rouvre ma userform)

Quand je modifie pour mettre "dd-mm-yyyy" ça fonctionne sur le textbox1 mais plus pour le 2 et le 3...

Pour ma culture, que signifie cette commande "Cells(i + 13, 2)" ?

Sur mon fichier (pas celui en exemple) mes dates de jalons sont dans 25 cellules entre B70 et B94.

En omettant le format de la date j'ai voulu tester avec ça:

Private Sub UserForm_Initialize()

For i = 1 To 25

Me.Controls("TextBox" & i) = Format(Sheets("Suivi activité PMS").Cells(i + 69, 2).Value, "yyyy-mm-dd")

Next

End Sub

Mais lorsque j'ouvre ma userform toutes mes dates entre B70 et B94 changent...il recopie la date de B70 partout

Pour ma culture, que signifie cette commande "Cells(i + 13, 2)" ?

la boucle For i = 1 commence à 1

et les données sont à la ligne 14 donc (1+13)

le format de date devrait être le même pour les 3 TextBox,

je ne sais pas si tu as remarqué que j'avais changé le Caption "TextBox4" du dernier TextBox, je l'ai modifié pour TextBox3

Effectivement j'ai vu après coup.

Cependant, je n'arrive pas à intégrer la macro sur ma feuille

Par contre sur l'exemple que tu m'as retourné, fais le test car chez moi lorsque j'ouvre le userbox et que je saisis des nouvelles dates ça fonctionne sur le textbox1 (avec renvoi dans la cellule excel) mais ça ne fonctionne pas pour les autres...

oups, j'oubliais de modifier dans l'événement.

du coup j'ai pensé qu'il serait peut être mieux d'utiliser l'événement AfterUpdate

est-ce mieux comme ça ?

Ah oui on y est presque, merci beaucoup Isabelle!

Je n'ai plus qu'un défaut dans mon fichier de travail qui figure aussi dans l'exemple renvoyé.

Lorsque l'on entre une date au dessus de 12 pas de problèmes, exemple 13/02/2017 OK dans le textbox et la cellule.

Par contre lorsqu'on est sous les 12, exemple 05/02/2017 Non ok car dans le textbox la date est bien le 05 février 2017 mais dans la cellule le 05 et le 02 s'inverses...=> 02/05/2017 au lieu de 05/02/2017...

Je ne vois pas d'où provient ce bug ...une idée?

Je ne vois pas d'où provient ce bug ...une idée?

ce n'est pas un bug mais un problème de compatibilité entre VBA (américain) et ta version d'Excel qui est Francais.

c'est pour ça que j'utilise toujours le format de date ISO (aaaa-mm-dd) qui est compatible avec tous.

c'est aussi ce format que j'ai mit au panneau de configuration.

Effectivement c’est un peu ce que j’ai pu trouver en explication.

Je souhaiterai vraiment conserver mon format Français et il semblerait qu’on puisse convertir la date avec la fonction CDate() mais j’ai du mal à l’integrer...

Si tu as la solution je suis preneur...

je vais travailler la dessus demain, car là je doit quitter,

le format que tu veut utiliser est bien "jj/mm/aaaa" ?

Tout à fait, jj/mm/aaaa.

Je vais encore chercher un peu ce soir si j’ai du temps (il est presque 20h chez moi )

Si je ne poste pas d’ici demain et que tu trouves la combine je suis preneur avec grand plaisir .

Encore un grand merci pour ton aide précieuse!!

Nico

Bonsoir,

Il y a plusieurs niveaux d'évaluation à prendre en considération, en ne confondant pas Excel et VBA qui réagissent diversement en matière de date.

D'abord il faut savoir que tes paramètres de reconnaissance de dates sont définis dans les paramètres régionaux de Windows (à voir dans le Panneau de configuration).

Les paramètres FR/FR définissent comme format par défaut jj/mm/aaaa, le slash comme séparateur de dates, mais le tiret est admis comme séparateur tant dans Excel que dans VBA.

Ainsi si tu tapes dans une cellule Excel : 02/09/2017 ou 02-09-2017 ou 2/9/2017... Excel reconnaît une chaîne texte correspondant à un format de date, la convertit en date (c'est à dire en nombre...), met le format de cellule à : jj/mm/aaaa et affiche donc une date à ce format.

Si tu omets l'année dans ta frappe, Excel l'interprète toujours comme date (de l'année en cours) et met le format de cellule à : jj-mmm.

VBA procède de façon analogue, les séparateurs reconnus sont les mêmes mais le format natif de reconnaissance est le format américain : mm/jj/aaaa (ou mm/dd/yyyy). Comme Excel, VBA convertit automatiquement une chaîne ayant un format de date (ce qui explique l'inversion mois/jour dès lors qu'on laisse VBA convertir selon ses critère natifs).

Mais lorsqu'on utilise CDate ou DateValue pour convertir un texte en date, on force VBA à reconnaître le format de date selon les spécifications des paramètres régionaux de Windows, et il applique donc les règles FR de reconnaissance en la matière.

Revenons à Excel, il faut savoir aussi qu'une cellule (objet Range) dispose de propriétés distinctes auxquelles on peut faire appel en VBA pour obtenir un résultat qui peut s'avérer différent. .Value est la propriété par défaut, soit la valeur contenue dans la cellule (quand on ne l'indique pas, c'est Value...), .Text est la valeur affichée, qui peut différer selon le format de cellule. Lorsqu'on appelle la valeur (pour l'affecter à un contrôle), Value renverra le contenu sans format particulier (sauf justement pour les dates et valeurs monétaires où elle conserve la reconnaissance du type de données si le format de cellule correspond au format par défaut de date).

Selon le cas, elle peut donc renvoyer une date à sa valeur numérique stockée dans la cellule. Dans un tel cas en utilisant .Text on prélèvera la valeur telle qu'elle est affichée dans la cellule.

D'autre part, une TextBox (de même que beaucoup des contrôles utilisés) ne contient que des valeurs texte. Ainsi, une date dans une TextBox est du texte (String) ayant un format de date mais en aucun cas une donnée Date.

La fonction Format pour sa part, renvoie une valeur formatée, toujours sous forme de donnée Texte. Dès qu'on utilise Format, on a du texte à la sortie : aucun problème si on l'affecte à une TextBox (qui n'accueille de toute façon que du texte), mais dans l'autre sens cela peut poser quelque problème...

C'est pourquoi à la sortie d'une TextBox, il importe d'opérer une conversion en date pour affecter une valeur date dans Excel, reconnue selon les paramètres régionaux.

ActiveSheet.Range("D2") = CDate(TextBox1.Value)

par exemple.

Une autre solution consiste à travailler les dates sous leur valeur numérique (CLng entier long). Ce qui peut s'avérer nécessaire dans certains cas où la manipulation prolongée en VBA expose à une conversion automatique par VBA, non maîtrisée donc, avant affectation définitive.

A la sortie d'une TextBox, cela conduit alors à une double conversion :

........ = CLng(CDate(TextBox1.Value))

Aucun souci avec une date représentée par sa valeur numérique, mais à la fin, il faudra mettre un format date à la cellule si elle ne l'a pas préalablement.

[Pour compléter, mais cela n'avait pas d'application directe ici, l'objet Range dispose également d'une propriété Value2, qui permet de prélever les valeurs dates et monétaires dépourvues de tout format lié à ces types de données (sans incidence sur les autres types). Une date est alors prélevée à sa valeur numérique...]

Cordialement.

MFerrand, un puit de savoir!!

Merci pour toutes ces explications, je vais tester dès mon retour à la maison les soluces si je parviens à l’integrer Correctement au code tel que dans l’exemple retransmis par Isabelle.

Pour illustrer dans ton cas.

Les modifs de TextBox appellent une proc. commune de mise à jour des cellules, en passant le numéro de la TextBox (cela devrait alléger un peu si tu augmentes le nombre de TextBox...)

J'ai repercuté ton script MFerrand, le problème de la date est résolu mais un autre est apparu. Tu peux faire le test sur l'exemple que tu as joints sur ton dernier envoi.

Dès lors ou tu retires une date d'un textbox et que tu souhaites le laisser vide en cliquant sur un autre une erreur d'execution 13 apparait "Incompatibilité de type"...

Il ne doit pas manquer grand chose pour toucher au but...

Rien de grave, c'est normal, si on convertit en date une valeur qui ne peut l'être, ça renâcle !

Il faut tester le contenu avant :

Sub MajJalons(n As Integer)
    Dim Cel As Range
    Set Cel = Sheets("Feuil1").Range("B" & 13 + n)
    With Controls("TextBox" & n)
        If .Value <> "" Then
            If IsDate(.Value) Then
                Cel = CDate(.Value)
            Else
                .Value = Cel.Text
            End If
        Else
            Cel.ClearContents
        End If
    End With
End Sub

Là on barde de conditions : on distingue le cas où la textbox est vide : on efface la cellule (si tu ne souhaites pas il suffira de faire sauter cette condition). Si pas vide, on teste si date, si oui on modifie la cellule, si non on modifie pas et on rétablit la textbox à la valeur de la cellule.

Génialissime!!

Merci MFerrand & Isabelle pour votre aide! sujet résolu tout fonctionne à merveille

Bonjour à tous, suspicious, MFerrand,

j'arrive après coup et j'suis bien contente que le boulot soit fait et que tout fonctionne, merci! MFerrand.

sur mon pc il y a pas moyen de mettre au format jj/mm/aaaa

c'est automatiquement transformer avec le séparateur -

suspicious date format

Bonjour Isabelle !

Curieux ce changement de séparateur ! Il doit y avoir une explication mais je ne la vois pas pour l'instant !

Bonne journée.

edit :

Je fais un essai similaire avec ça :

Sub Test()
    Dim d&
    d = CLng(ActiveCell)
    MsgBox d & " = " & Format(d, "dd-mm-yyyy")
    MsgBox d & " = " & Format(d, "dd/mm/yyyy")
    ActiveCell.Offset(, 2) = Format(d, "dd-mm-yyyy")
End Sub

Le format de la chaîne date est bien respecté dans les deux MsgBox...

La dernière action consiste à envoyer à une cellule la chaîne formatée avec des tirets : on insère donc un texte, qu'Excel reconnaît comme date, convertit en date, j'ai donc bien la date insérée dans la cellule, et là les séparateurs changent, le slash est substitué au tiret, logique car Excel applique à la date le format par défaut des paramètres FR-FR (le slash) [la cellule étant initialement au format Standard] à une insertion texte convertie automatiquement.

Rechercher des sujets similaires à "vba sauvegarde valeur textbox"