Exercice N° 3- Partie 1 (Création Userfom )


#1

Bonjour à tous

Alors le 3ème, sera étalé sur plusieurs parties :

  • Création d’une petite base de données depuis un userform (USF) avec copie des données dans un onglet
  • Création d’une BDD avec Ajout / Modif / Supprime
  • Création d’un USF avec divers contrôles de type combobox, spinbouton, checkbox, etc

Ne pas avoir peur, l’exercice se fera palier par palier

A la fin de l’exercice, avec les indications et exemples, vous saurez déjà bien manœuvrer sur VBA

Mais pour l’instant, il vous reste à finir le N° 2


Exercice N° 3 - Partie 3 (Ajouter depuis un USF)
#2

Bonjour Mimimathy, :wink: toutes et tous,

Comme je suis dans l’impasse pour l’Exo N°2, je vais faire avancer le bouchon pour le N°3 en espérant être rejoint par d’autres comparses afin d’unir nos forces.

Alors déjà interdit de se moquer :cry:

J’avais suivi un cours via une vidéo sur la toile en 2015 je crois pour utiliser les Userforms, bien sûr je suis incapable de retrouver cette vidéo puisque je n’en ais pas noté l’URL, mais j’avais conservé ce que j’avais fait à l’époque et je viens de l’adapter pour cet Exercice N°3.

Il y a 10 TextBox et ont se déplace avec la touche tabulation

  1. TextBox Civilité première lettre en majuscule.
  2. TextBox Nom tout en majuscule.
  3. TextBox Prénom première lettre en majuscule.
  4. TextBox Né le on entre la date avec seulement les chiffres sans les slash qui se mettent automatiquement au bon endroit au fur et à mesure.
  5. TextBox Adresse chaque première lettre est en majuscule.
  6. TextBox CP bridé à 5 chiffres et empêchement d’y mettre des lettres sinon message " Uniquement des chiffres, svp ! "
  7. TextBox Ville tout en majuscule.
  8. TextBox Tél Fixe bridé à 14 caractères et empêchement d’y mettre des lettres sinon message " Uniquement des chiffres, svp ! ", tout les 2 chiffres un point se met au fur et à mesure jusqu’à la 8ème pairs de chiffres.
  9. TextBox Tél Mobile bridé à 14 caractères et empêchement d’y mettre des lettres sinon message " Uniquement des chiffres, svp ! ", tout les 2 chiffres un point se met au fur et à mesure jusqu’à la 8ème pairs de chiffres.
  10. TextBox Email libre de tout caractère

Le bouton “Valider” va copier les données inscrites dans l’Userform dans la feuille “Clients”
Le bouton “Quitter” porte bien son nom :blush:

Dans la feuille “Accueil”.
Le bouton “Nouveau Client” sert a appeler l’Userform
Le bouton “Clients” lui sert a se déplacer dans la feuille “Clients”.

Dans la feuille “Clients”.
Le bouton “Accueil” sert a se déplacer dans la feuille “Accueil”.

Les codes VBA

A chaque ouverture du fichier je veux être sur la feuille “Accueil”
Dans Thisworkbook

Private Sub Workbook_Open()
'A l'ouverture affiche la page d'acceuil
Sheets("Accueil").Select
End Sub

Action des boutons feuille “Accueil”
Dans la feuille "Accueil"

'Appel liste des Clients
Private Sub CommandButton4_Click()
Sheets("Clients").Activate
End Sub

'Appel formulaire Nouveau Client
Private Sub CommandButton6_Click()
UserForm1.Show
End Sub

Action du bouton feuille “Clients”
Dans la feuille "Clients"

'Appel la page d'accueil
Private Sub CommandButton1_Click()
'Page d'accueil appelée
Sheets("Accueil").Activate
End Sub

Code de l’UserForm1, Frame1

'Bouton Quitter Formulaire Nouveau Client
Private Sub CommandButton10_Click()
    Unload UserForm1
End Sub
'Bouton Valider Formulaire Nouveau Client
Private Sub CommandButton11_Click()
    Dim ctrl As Control 'Boucle sur tous les contrôles
    Dim colonne%, derligne%
    derligne = Sheets("Clients").Range("A65000").End(xlUp).Row + 1
    For Each ctrl In UserForm1.Controls
    colonne = Val(ctrl.Tag)
    If colonne > 0 Then Sheets("Clients").Cells(derligne, colonne) = ctrl
     Next
     Unload UserForm1
     Sheets("Clients").Select
End Sub
'Sélection TextBox Civilité
Private Sub TextBox0_Change()
'Écriture première lettre en Majuscule
TextBox0.Value = Application.Proper(TextBox0.Value)
End Sub
'Sélection TextBox Nom
Private Sub TextBox1_Change()
'Écriture en majuscule
TextBox1.Value = UCase(TextBox1.Value)
End Sub
'Sélection TextBox Prénom
Private Sub TextBox2_Change()
'Écriture première lettre en Majuscule
TextBox2.Value = Application.Proper(TextBox2.Value)
End Sub
'Sélection TextBox Né le
Private Sub TextBox3_Change()
Dim Val As Byte
'Limiter le nb caracteres maxi dans textbox
TextBox3.MaxLength = 10
'Mettre un slash automatiquement 00/00/0000
 Val = Len(TextBox3)
 If Val = 2 Or Val = 5 Then TextBox3 = TextBox3 & "/"
End Sub

'Sélection TextBox Adresse
Private Sub TextBox4_Change()
'Écriture première lettre en Majuscule
TextBox4.Value = Application.Proper(TextBox4.Value)
End Sub
'Sélection TextBox Code Postal
Private Sub TextBox5_Change()
'Limiter le nb caracteres maxi à 5 dans textbox
TextBox5.MaxLength = 5
End Sub
'Sélection TextBox Code Postal
Private Sub TextBox5_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
'Interdire les lettres dans le TextBox
If InStr("0123456789", Chr(KeyAscii)) = 0 Then
    KeyAscii = 0
    'Si erreur alors message
    TextBox5.ControlTipText = "Uniquement des chiffres, svp !"
End If
End Sub
'Sélection TextBox Ville
Private Sub TextBox6_Change()
TextBox6.Value = UCase(TextBox6.Value)
End Sub
'Sélection TextBox Tél Fixe
Private Sub TextBox7_Change()
Dim Texte As String
Texte = TextBox7.Text
Select Case Len(Texte)
'Mettre un point de séparation tout les 2 chiffres
Case 2, 5, 8, 11
Texte = Texte & "."
End Select
TextBox7.Text = Texte
End Sub
'Sélection TextBox Tél Fixe
Private Sub TextBox7_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
'Interdire les lettres dans le TextBox
If InStr("0123456789", Chr(KeyAscii)) = 0 Then
    KeyAscii = 0
    'Si erreur alors message
    TextBox7.ControlTipText = "Uniquement des chiffres, svp !"
End If
End Sub
'Sélection Userform
Private Sub UserForm_Initialize()
With TextBox7
    .MaxLength = 14 'Max 14 valeurs dans le TextBox
     .Value = ""
End With
    With TextBox8
    .MaxLength = 14 'Max 14 valeurs dans le TextBox
     .Value = ""
End With
     
End Sub
'Sélection TextBox Tél Mobile
Private Sub TextBox8_Change()
Dim Texte As String
Texte = TextBox8.Text
Select Case Len(Texte)
'Mettre un point de séparation tout les 2 chiffres
Case 2, 5, 8, 11
Texte = Texte & "."
End Select
TextBox8.Text = Texte
End Sub
'Sélection TextBox T?l Mobile
Private Sub TextBox8_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
'Interdire les lettres dans le TextBox
If InStr("0123456789", Chr(KeyAscii)) = 0 Then
    KeyAscii = 0
    'Si erreur alors message
    TextBox8.ControlTipText = "Uniquement des chiffres, svp !"
End If
End Sub

Donc voilà ou j’en suis, j’aimerai bien avoir ton avis Mimimathy sur cette construction.

Pour ceux et celles qui suivent avec intérêt les Exercices de Mimimathy afin d’en apprendre plus sur le VBA, j’en suis simplement à l’Ajout de nouveaux clients dans la feuille de destination, il me manque les 2 autres actions, à savoir la Modif et / ou la Suppression d’un ou plusieurs clients via l’UserForm1, Frame2, Frame3

Y’a du taf encore :yum:

Oupss, pour un peu j’allais oublier de joindre le classeur pour une bonne visibilité de ce long discours et de ses lignes de codes.
Je me suis fait plaisir avec les boutons et la feuille “Accueil” :stuck_out_tongue_winking_eye:

Le fichier ICI==> Exercice N° 3.xlsm (1,1 Mo)

@+ les gens


#3

Salut MDO

Rien à dire, c’est parfait (avec des bonnes astuces de remplissage)

Ma 1ère partie sera beaucoup moins évoluée que celle-ci, afin que les plus novices puissent suivre,
mais pourquoi pas l’intégrer dans ma partie finale avec des “TextBox” et “ComboBox” qui ne sont pas présents dans celui-ci,
Car il y aura aussi des “SpinBox”, des “CheckBox”, des “OptionButton”, etc histoire de faire un peu le tour des contrôles pour un UserForm

Bien Vu :eye:

En attendant, j’ai toujours pas ma solution à l’exercice N°2, pourtant j’ai mis des explications qui doivent vous mettre dans le bon chemin, où alors, change mon Prénom de ta base de données :wink:


#4

Re,

:blush:

Eh bien je suis en attente des troupes qui se font cruellement attendre :face_with_monocle:

Il n’y a pas de “ComboBox” certes, mais il y a des “TextBox” où je n’ais pas compris ce que tu as voulu dire ?

“SpinBox” c’est quoi encore ses bestioles :flushed:

Avec une équipe de bras cassés dont je suis le chef, ta patience est mise à dure épreuve :pleading_face:

Pas compris, désolé :woozy_face:


#5

“ProfVBA” dans ton classeur test


#6

Re,

Ah ben ça non alors, sinon je peux mettre “Maître” où encore puisque dans le vocabulaire 2018 “Premier de cordée” :joy:


#7

Bonjour,
L’exercice N° 2 étant résolu :joy:, voici la 1ère partie du 3ème exercice
Exercice N°3 - Partie 1.xlsm (21,4 Ko)

Créez un UserForm avec cette présentation
3 Labels
3 TextBox
2 Boutons

L’appui sur le bouton SAUVEGARDER, ajoute les données dans la feuille “TARIFS” à la suite des autres
Le bouton FERMER ferme l’UserForm

Il serait bien que la saisie des noms de destination se frappe en minuscule et se transforme en Nom Propre
(1ère lettre de chaque mots en Majuscule)
Idem pour les prix au format monétaire avec 2 chiffres après la virgule

Ajouter un bouton dans la feuille pour lancer l’UserForm


#8

Re @Mimimathy, :wink:

C’est noté.


#9

Re, @Mimimathy

Voila ce que j’ais concocter mais je n’arrive pas a mettre les tarif en €

le fichier en retour

=====>Exercice N°3 - Partie 1.xlsm (34,1 Ko)

Cdlt

@kiss6


#10

Salut @kiss6, @Mimimathy,

Peut-être un début de solution:

Dans la Feuil1 bouton d’appel du formulaire.

Private Sub CommandButton1_Click()
'Appel Formulaire Tarifs
UserForm1.Show
End Sub

Code du bouton "SAUVEGARDER"

Private Sub CommandButton1_Click()
Dim Dl% 'D?claration variable
 'Message avant la sauvegarde proposé par Kiss6
 If MsgBox("voulez-vous faire la SAUVEGARDE ? ", vbYesNo, " confirmer") = vbYes Then
   'Copier les données les unes en dessous des autres
   Dl = Range("A65000").End(xlUp).Row + 1
   'Déclarer le TextBox1 avec la première lettre en majuscule
   TextBox1 = Application.Proper(TextBox1)
   'Déclarer le TextBox2 au format monétaire
   TextBox2.Value = Format(TextBox2.Value, "0.00 €")
   'Déclarer le TextBox3 au format monétaire
   TextBox3.Value = Format(TextBox3.Value, "0.00 €")
   'Données TextBox1 placées dans la première cellule vide colonne A
    Cells(Dl, 1) = TextBox1.Value
    'Données TextBox2 placées dans la première cellule vide colonne B
    Cells(Dl, 2) = TextBox2.Value
    'Données TextBox3 placées dans la première cellule vide colonne C
    Cells(Dl, 3) = TextBox3.Value
    
 End If
'Fermeture du Formulaire aprés la validation du MsgBox
Unload UserForm1

End Sub

Code du bouton "FERMER"

Private Sub CommandButton2_Click()
'Fermer Formulaire
Unload Me
End Sub

Le Fichier ICI==> Exercice N° 3 V0.xlsm (151,1 Ko)

Bonne soirée.


#11

Bonjour Messieurs,
Et après on me dit que je pars sur des exercices trop hard ?

Félicitations, vous avez bien résolu l’exercice.

Petite amélioration pour Kiss:

  • Tu aurais du mettre le Msgbox dans l’activation de l’USF, car, dans ton module il se déclenche sur le clic de validation.
    Private Sub UserForm_Activate()
    MsgBox " Veuillez renseigner les champs "
    End Sub

Petite amélioration pour MDO:

  • Tu aurais du mettre les modifications, type Nom Propre et monétaire dans une macro “AfterUpdate”
    car dans ta macro, on ne voit pas son changement sur l’USF.
    Private Sub TextBox1_AfterUpdate()
    'Déclarer le TextBox1 avec la première lettre en majuscule
    TextBox1 = Application.Proper(TextBox1)
    End Sub

Mais vous êtes des bons. J’ai apprécié les commentaires sur les macros de MDO. Ells sont nécessaires pour pouvoir bien relire la macro si des modifications doivent être apportées 2/3 ans plus tard. En principe, on les places sur des emplacements un peu ardu, ou pour faire comprendre à un demandeur.

Voici donc la mienne, qui est un peu plus complète, car il y a des message si un des 3 TextBox n’est pas renseigné, ou si l’on frappe des lettres dans les TextBox de prix (que MDO aurait du mettre, vu que cette gestion était dans son modèle)

Option Explicit
'En déclarant la variable au-dessus de toutes macro, celle-ci est initialisé pour tout le module
'Si je déclare dans un Sub, elle est active que pour le Sub
Dim Dl%
'Sur appui du Bouton Fermer
Private Sub BFermer_Click()
  'fermer l'userform
  Unload Me
End Sub
'Sur appui du Bouton Sauvegarde
Private Sub BSauvegarder_Click()
'Si le TextBox TDestination est vide alors j'affiche un message
If Me.TDestination.Value = "" Then
      MsgBox " Vous n'avez pas renseigné la Destination !", vbInformation + vbOKOnly, "Erreur de saisie"
      'SetFocus replace le curseur sur le TextBox
      Me.TDestination.SetFocus
      'Sortir de la procèdure
      Exit Sub
  Else
    If Me.TClasse1.Value = "" Then
      MsgBox " Vous n'avez pas renseigné le Tarif de la 1ère Classe !", vbInformation + vbOKOnly, "Erreur de saisie"
      Me.TClasse1.SetFocus
      Exit Sub
    Else
      If Me.TClasse2.Value = "" Then
        MsgBox " Vous n'avez pas renseigné le Tarif de la 2ème Classe !", vbInformation + vbOKOnly, "Erreur de saisie"
        Me.TClasse2.SetFocus
        Exit Sub
      End If
    End If
  End If
  With Feuil1
    'Dernière ligne non vide + 1 pour incrire les nouvelles données
    Dl = .Range("A" & Rows.Count).End(xlUp).Row + 1
    'Copie les données sur les 3 colonnes (A,B,C) de la dernière ligne + 1
    .Cells(Dl, 1).Value = Me.TDestination.Value
    .Cells(Dl, 2).Value = Me.TClasse1.Value
    .Cells(Dl, 3).Value = Me.TClasse2.Value
  End With
  ' Je ferme l'UserForm
  Unload Me
End Sub

Private Sub TClasse1_AfterUpdate()
  'Formate le TextBox (ici au format monétaire avec séparateur de millier) à sa sortie
  Me.TClasse1 = Format(Me.TClasse1.Value, "# ##,0.00 €")
End Sub

Private Sub TClasse2_AfterUpdate()
  Me.TClasse2 = Format(Me.TClasse2.Value, "# ##,0.00 €")
End Sub

Private Sub TClasse1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
  'La fonction Chr renvoie une valeur de type String contenant le caractère associé au code de caractère indiqué
  'de la variable KeyAscii qui correspond au code de la touche pressée, si autre caratère est frappé,
  'Then KeyAscii = 0 , on attribue une valeur nulle à la touche pressée ce qui équivaut à annuler l'appui de cette touche.
  ' J'ai ajouté les ":" pour éviter de me mettre à la ligne.
  'Sinon il aurait fallu mettre le code comme ceci
  '------------------------------
  'If InStr("1234567890,", Chr(KeyAscii)) = 0 Then
  ' KeyAscii = 0
  ' Beep
  'End If
  '------------------------------
  If InStr("1234567890,", Chr(KeyAscii)) = 0 Then KeyAscii = 0: Beep '(Beep sonore)
End Sub

Private Sub TClasse2_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
  'La fonction Chr renvoie une valeur de type String contenant le caractère associé au code de caractère indiqué
  'de la variable KeyAscii qui correspond au code de la touche pressée, si autre caratère est frappé,
  'Then KeyAscii = 0 , on attribue une valeur nulle à la touche pressée ce qui équivaut à annuler l'appui de cette touche.
  If InStr("1234567890,", Chr(KeyAscii)) = 0 Then KeyAscii = 0: Beep '(Beep sonore)
End Sub

Private Sub TDestination_AfterUpdate()
  'Formate le TextBox avec le première lettre de chaque mot en majuscule
  Me.TDestination = Application.Proper(Me.TDestination.Value)
End Sub

Exercice N°3 - Partie 1.xlsm (34,3 Ko)


#12

Re, Bonjour @Mimimathy , @mdo100

D’abord félicitation a @mdo100 pour cet exercice qu’il a très bien gérer :clap: :+1: déjà rien que de savoir que

TextBox1 = Application.Proper(TextBox1)

est la déclaration de la première lettre en majuscule :mortar_board: c’la prouve le niveau de @mdo100 car

je n’ais aucune notion de tous c’la

Moi j’ais juste recopier bêtement un bout de code VBA que j’ais trouvé sur le net

enfin bref :clap: a toi @mdo100

@Mimimathy pourriez-vous me renvoyer mon fichier avec correction en rouge pour que je puisse assimiler et

comprendre le pourquoi du comment

Merci a vous deux c’est toujours un plaisir de vous suivre

Cdlt

@kiss6


#13

Salut @kiss6,

:clap: à toi aussi, ta version m’a aider aussi et pour le reste, j’ai fais comme toi, des recherches sur le net afin de trouver les bonnes commandes pour les Textbox.

C’est vrai aussi, que j’avais déjà une p’tite expérience, puisque j’avais fait une première version en 2015, ça m’a aider.

Donc, il n’y a pas de miracle.

L’exercice N°3 Partie 2 se complique, alors au boulot.

Cdlt.


#14

Re,

Peut être que @Mimimathy pourrais me donner plus d’explication pour la 2 ième partie ou même vous

@mdo100 car je n’ais pas bien saisie le sens de la question Stefanie de MONACO :wink:

Cdlt

@kiss6


#15

Bonjour Kiss

Teste avec ceci

'*****************************************************************************************************************
'* Mise à part le message "Veuillez renseigner les champs" qui n'était pas à sa place, c'était fonctionnel
'* Pour une bonne visulisation sur l'USF et pour un bon format, il faut simplement attribuer le format
'* dans une macro "AfterUpdate"
'*****************************************************************************************************************
Private Sub CommandButton1_Click()
  Dim ligne As Integer
    If MsgBox("voulez-vous faire la SAUVEGARDE ?? ", vbYesNo, " confirmer") = vbYes Then
      Worksheets("Tarifs").Activate '(utilisez le moins possible les Select qui ralentissent sur de grosse macro)
      'je remplacerais
      'ligne = Sheets("Tarifs").Range("A456541").End(xlUp).Row + 1
      'par ci-dessous, même si cela fonctionnait quand même
      ligne = Sheets("Tarifs").Range("A" & Rows.Count).End(xlUp).Row + 1 'n° de la première ligne vide de la colonne A
      
      Cells(ligne, 1) = TextBox1.Value
      Cells(ligne, 2) = TextBox2.Value
      Cells(ligne, 3) = TextBox3.Value
    End If
End Sub

Private Sub CommandButton2_Click()
  'Ferme L'UserForm1
  Unload Me
End Sub

Private Sub TextBox1_AfterUpdate()
  'en changeant de TextBox
  TextBox1.Value = Application.Proper(TextBox1.Value) 'passe la première lettre de chaque mots en Maj --> equivalent de NOM.PRPRE() d'Excel
                                                      'pour mettre en Maj l'ensemble TextBox1.Value = VBA.UCase(TextBox1.Value)
                                                      'pour mettre en Min l'ensemble TextBox1.Value = VBA.LCase(TextBox1.Value)
End Sub

Private Sub TextBox2_AfterUpdate()
  'en changeant de TextBox
  TextBox2.Value = Format(TextBox2.Value, "# ##0.00 €") 'passe la donnée au format monétaire avec séparateur de millier
End Sub

Private Sub TextBox3_AfterUpdate()
  'en changeant de TextBox
  TextBox3.Value = Format(TextBox3.Value, "# ##0.00 €") 'passe la donnée au format monétaire avec séparateur de millier
End Sub

Private Sub UserForm_Activate()
  'Au lancement de l'USF, il lance le message
  MsgBox " Veuillez renseigner les champs "
End Sub


#16

Re,

Ok @Mimimathy merci pour la correction

Cdlt

@kiss6