Garder en memoire les données d'un userform

Bonjour le forum

Bonne Année et surtout la santé à tout le forum

Voila j'ai crée un userfrom afin de mettre des notes par ligne (voir-ci dessous)

capture d ecran 2024 01 25 121437

Ma volonté est de pouvoir garder en mémoire quand l'userform est fermé

Précision les comboboxs ont la même liste items

Avec ce code qui concerne uniquement la première ligne

un module pour chaque lettre

Option Explicit
Public A As String

et dans l'userform ce code

Private Sub CommandButton1_Click()
A = ComboBox1.Value
B = TextBox1.Value
C = TextBox2.Value
d = TextBox3.Value
E = TextBox4.Value
Unload Me
End Sub

Private Sub UserForm_Initialize()
If A <> "" Or A <> "" Then ComboBox1 = A
If B <> "" Or B <> "" Then TextBox1 = B
If C <> "" Or C <> "" Then TextBox2 = C
If d <> "" Or d <> "" Then TextBox3 = d
If E <> "" Or E <> "" Then TextBox4 = E
ComboBox1.ColumnCount = 1
ComboBox1.List() = Array("30", "40", "60", "80")
End Sub

J'aurai aime avoir un code plus simple pour tous les comboboxs et textboxs

J'espère être clair dans ma demande

Bonjour,

A+

Bonjour

Erreur de sujet

Salut Joco7915

Ajoute ce code

Public Sub UserForm_Click()
Me.Left = Application.Left + Application.Width - Me.Width
Me.Top = Application.Top
End Sub

Quel rapport avec la demande

Salut,

T'as pas trop de choix :

  • Soit tu ne ferme pas le formulaire mais tu le cache avec la méthode Hide, mais tu perdra les données à la fermeture du classeur.
  • Soit tu écrit les valeurs quelque part, et ensuite tu ferme le formulaire.

Bonjour le forum

Oublie de ma part et a la demande de Bruno Mars

Ci-joint le fichier

Cordialement

9classeur1.xlsb (38.18 Ko)

Bonsoir à tous,

Pour ce type de sauvegarde, je préfère en général utiliser une feuille nommée ici "dataLTV". Cette feuille est masquée (avec la propriété Worksheet.Visible mise à la valeur xlSheetVeryHidden via l'éditeur VBA). Je trouve que cette méthode aboutit à des codes de sauvegarde et restauration simples et concis.

  • Quand on clique sur le bouton "Sauvegarder", on sauvegarde les données du userform1 sur la feuille "dataLTV". On sauvegarde sur chaque ligne un nom de contrôle en colonne A et la valeur de ce contrôle en colonne B. On termine par la fermeture de userform1.
  • Quand on charge l'userform1, on lit les données sauvegardées précédemment sur la feuille "dataLTV" pour réaffecter les valeurs aux contrôles ad hoc de Userform1.
  • Le bouton Abandon décharge l'userform1 sans rien sauvegarder.
  • Deux boutons RAZ permettent la RAZ des valeurs soit des combobox soit des textbox.


nota 1 :
La constante ControlesUtiles dans le code de la sauvegarde indique les types de contrôles dont on sauvegardera les valeurs. Attention ce sont bien les types des contrôles (ce ne sont pas les noms de chaque contrôle).

Exemple : Const ControlesUtiles = "combobox textbox"

nota 2 : pour la démo, j'ai mis en commentaire les évènements relatifs aux textbox (ça m'enquiquinaient ).

Bonjour

Une autre méthode, pour sauvegarder les données saisies dans les contrôles d'un formulaire, consiste à les enregistrer directement dans le dit formulaire.

Ainsi à l'ouverture, les données sont déjà présentes. Plus besoin d'initialiser les contrôles.

' Enregistre en dur dans le formulaire
With ActiveWorkbook.VBProject.VBComponents("Form1").Designer
     .Controls("MonControle1").Value = MaValeur1
     .Controls("MonControle2").Value = MaValeur2
     .Controls("MonControle3").Caption = MaValeur3 ' Ici le contrôle est un Label donc Caption
End With

Si les données à sauver sont dans un tableau et si les contrôles sont des Textbox avec un N° en fin de nom (Textbox1, Textbox2 ...)

With ActiveWorkbook.VBProject.VBComponents("Form1").Designer
     For i5 = 1 To 12
          a5$ = "TextBox" & i5 ' Défini le textbox
          .Controls(a5$).Value = Tableau (i5)
     Next i5
End With

Pour que cela fonctionne, il faut que :

  1. Le formulaire ait déjà été ouvert au moins une fois (ne me demandez pas pourquoi !)
  2. La procédure d'enregistrement soit en dehors du formulaire en question.

Sans quoi, une erreur est générée.

Pour ouvrir le formulaire sans que l'utilisateur ne s'en aperçoive (s'il n'a pas déjà été ouvert) :

With Form1
     .Top = 0 - .Height ' Place hors d'écran (invisible)
     .Show 0            ' Ouvre en Non modal
End With
Unload Form1            ' On le referme
' Mise à jour ...

J'utilise cette méthode pour mes applications, avec des contrôles et des formulaires de toutes sortes On peut même créer un formulaire spécifique (non visible par l'utilisateur) pour y stocker des données (paramètres, mots de passe, etc.) qui seront utilisées dans l'appli. Bien sûr, il y a un travail en amont et des vérifications à effectuer avant la mise à jour (contenu, validité des données, etc.) mais cela fonctionne très bien.

Bonne journée

Bonjour le forum. Bonjour le fil

@ Pelerin65 :

Quelques imperfections dans ta façon d'alimenter ton TextBox3 :

- Tu peux entrer des valeurs alphabétiques dans ton TextBox

- L'AfterUpdate concerne la modification de données à la sortie donc le contrôle ne peut pas détecter ton MaxLength qui a lieu avant la sortie, il doit l'être pendant la saisie (Avec ton code, tu peux entrer plus de 6 chiffres dans ton TextBox ou moins et passer au contrôle suivant). Ou alors tu renseignes le MaxLength (6) de ton TextBox dans sa propriété (voir ci-dessous).

Je te donne ma façon de faire (qui n'est pas forcément la meilleure) :

Private Sub TextBox3_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Len(TextBox3.Value) <> "6" Then
MsgBox "Merci de renseigner 6 chiffres"
'TextBox3 = ""
Cancel = True
TextBox3.SetFocus
Else
TextBox3 = Left(TextBox3, Len(TextBox3) - 3) & "+" & Right(TextBox3, 3)
End If
End Sub

Private Sub TextBox3_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
TextBox3.MaxLength = 6
If InStr("1234567890", Chr(KeyAscii)) = 0 Then KeyAscii = 0
End Sub
maxlength

Bon week-end

Salut à tous,

@Ericcool02 Nous savons que Visual Basic Pour Application est conciliant mais quand même :

La fonction Len renvoie un type Long, alors on évite de le comparer à une chaine comme dans ton exemple :

If Len(TextBox3.Value) <> "6" Then

Un peu de lecture...

Fonction Len (Visual Basic pour Applications) | Microsoft Learn

Re le fil,

@Jean-Paul. Perso, je bidouille et si ça marche, je garde. Promis, je ne le referai plus .

If Len(Txt3).... à remplacer par :

If TextBox3.MaxLength <> "6" Then

@+

Re le fil,

Dans le même ordre d'esprit on peut remplacer (qui n'est pas de moi - Voir ICI ) :

  TextBox3 = Left(TextBox3, Len(TextBox3) - 3) & "+" & Right(TextBox3, 3)
      

par

     TextBox3 = Left(TextBox3, 3) & "+" & Right(TextBox3, 3)

@ Jean-Paul : Par curiosité, qu'apportait de plus le code de première instance par rapport au mien -

@+

Re,

Tu aimes bien les chaines de caractères Ericcool02...

@Jean-Paul. Perso, je bidouille et si ça marche, je garde. Promis, je ne le referai plus .

If Len(Txt3).... à remplacer par :

If TextBox3.MaxLength <> "6" Then

C'est encore faux désolé... MaxLength est aussi du type Long et non pas de type String. Voir ICI

@ Jean-Paul : Par curiosité, qu'apportait de plus le code de première instance par rapport au mien -

Ce n'est pas du tout la même demande...

@ Jean-Paul - Je commence à y perdre mon latin (non, ce n'est pas vrai, tout comme le VBA, je n'y connais rien au latin...) . Je préconise à notre ami Pelerin65 d'entrer que du numérique donc pour ma part, ce n'est plus du string mais un nombre entier (je parle de la saisie pas de l'envoi vers la cellule) ??? Donc MaxLength s'adapte bien au contexte ???

Maintenant si tu veux bien m'expliquer ce qu'il y a à faire (ou ne pas faire) dans le présent code, je suis preneur.

D'autre part, tu me dis :

Ce n'est pas du tout la même demande...

alors que je demande pourquoi notre ami "Yvouille" qui est à l'origine du code fourni à Pelerin pour son point kilométrique (voir lien fourni) a incorporer dans son code un Len(TextBox). Je ne vais pas ouvrir un nouveau post pour éclairer ma lanterne ?

@+

Re,

C'est trop rigolo.

Bon quand tu dis de faire je te cite :

If TextBox3.MaxLength <> "6" Then

Tu compares bien MaxLenght avec "6" qui est une chaine de caractère "6" n'est pas égal à 6. 6 est égal à Val("6") OK ou bien Clng("6") mais pas à "6".

En fait tu aurais du marquer :

If TextBox3.MaxLength <> 6 Then

D'où ma réflexion.

Et quand je te dis

Ce n'est pas du tout la même demande...

Je parle du post que tu cite en référence et où la demande est de mettre un point après le troisième caractère. C'est tout.

Donc pour résumer : Ci-dessous ce n'est pas bon. Mais comme je le dis dans un autre post, VBA est conciliant est cela passe, mais ce n'est pas une bonne pratique.

Private Sub TextBox3_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Len(TextBox3.Value) <> "6" Then
MsgBox "Merci de renseigner 6 chiffres"

Exemple : sur un appel direct ça passe :

000417

Maintenant je passe par une variable :

000418

si je déclare V en Long :

000419

Donc surtout ne pas mélanger les torchons avec les serviettes...

Par contre ci-dessous c'est bon tu utilises un Long : 6

Private Sub TextBox3_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
TextBox3.MaxLength = 6
If InStr("1234567890", Chr(KeyAscii)) = 0 Then KeyAscii = 0
End Sub

Tu as ici les références du langage, je m'y attarde bien souvent, il y a toute un tas d'idées et de références.

Bonne prog.

Bonjour le fil,

Bonjour Jean-Paul et Grand Merci à toi. C'est en regardant et en recopiant que j'apprends. Et là, j'ai compris mon erreur en confondant un long d'un string. Mais bon, ce n'est pas en rire

Bon dimanche. Eric

P.s : en attendant, moi je suis revenu sur ce fil pour discuter, chose que notre ami Pelerin65 n'a pas fait (2 visites (dont une ce matin vers 09H10) depuis hier (peut-être plus...) et nous ne savons toujours pas si son sujet est résolu ou en voie d'être résolu ????

Re,

Je ne rigole pas de ton niveau, je ne me perpétrais pas. C'est ce que tu dis ci-dessous qui m'a fait rigoler.

Je commence à y perdre mon latin (non, ce n'est pas vrai, tout comme le VBA, je n'y connais rien au latin...)

Et pour la petite histoire, tu a entièrement raison concernant les réactions du rédacteur du sujet. Pour ma part c'est résolu.

Bonne prog.

Bonjour le forum,

Je vous lis et on aurait cru une guerre de tranchée,

Le vba est complexe et depuis un certain temps, je me prends la tête avec le VBA sans formation

J'ai appris que le codage est complexe et peut être codé de pleins de manière aussi

Pour ma part, je vous remercie de votre aide, ayant abouti au résultat cherché

Cordialement pelerin65

Bonjour le forum, le fil,

Il n'y a eu aucune guerre de tranchée, notre ami Jean-Paul m'a gentiment fait remarquer que le code employé n'était pas le bon. Je convertissait des chiffres en string. Le problème c'est comme je l'ai dit plus haut, je bidouille sans trop savoir ce que j'utilise et lorsque ça fonctionne pour moi c'est tout bon. .. mais non ce n'est pas comme cela qu'il faut faire et Jean-Paul m'a remis sur les rails.C'est comme cela que l'on avance.

Bonne journée

Bonjour le forum

Je reviens vers vous par rapport à ce code

La sauvegarde se fait sur deux colonnes serait ils possibles de pourvoir sauvegarder sous forme de lignes

Private Sub CommandButton1_Click()
Const ControlesUtiles = "combobox textbox"
Dim x As Variant, lig As Long

   With Sheets("dataLTV")
      .Columns("a:b").Clear
      For Each x In Controls
         If InStr(LCase(ControlesUtiles), LCase(TypeName(x))) > 0 Then lig = lig + 1: .Cells(lig, 1) = x.Name: .Cells(lig, 2) = x.Value
      Next x
   End With
   Unload Me
End Sub
capture d ecran 2024 01 30 133052

Serait-il possible d'avoir la sauvegarde sous forme de tableau de ce type

capture d ecran 2024 01 30 134109

Cordialement

Rechercher des sujets similaires à "garder memoire donnees userform"