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


#1

Bonjour,

Là c’est déjà plus sophistiqué sur la fin

  • Dans cette 1ére partie, votre but sera de remplir la feuille Clients avec les divers contrôles de l’UserForm (USFClients). Ne vous occupez pas pour l’instant des boutons d’Options, et ComboBox “Votre Choix” et de l’image (Photo).

  • Par contre les contrôles de NOM et VILLE seront en MAJUSCULE, le Prénom et l’Adresse en Nom Propre. Le code Postal ne devra pas dépasser 5 chiffres, la date de naissance devra être valide (Pas supérieur à la date du jour), les N° de téléphone devont pas dépasser 14 caractères (espaces compris) avec un formatage qui ajoute un espace tous les 2 chiffres.

  • Tous les contrôles sont nommés, donc avec la feuille d’astuce VBA, vous arriverez facilement à les retrouver.

  • Le ComboBox “Civilité” sera initialisé avec les titres comme “Mr, Md, Dr, Me” comme vous le désirez. Toutefois, pas la suite, la liste sera dynamique afin d’ajouter des civilités non renseignées au départ.

  • Des renseignements sont déjà présent dans la feuille Clients, qui serviront par la suite à l’affichage de l’image du client soit sur L’USF ou sur clic dans la ligne concernée de la feuille Clients.

  • La 2ème partie sera pour la gestion des Options avec la Suppression d’un Client, puis en 3ème partie, sa Modification.

  • Des fonctions seront ajoutées, comme une fonction pour le contrôle d’une adresse Mail valide, etc.

A la fin de cet exercice, vous serez capable de composer vous-même, la plupart d’UserForm avec ses macros.Exercice N° 3 Partie Ajouter.xlsm (1,2 Mo)


Exercice N°3 - Partie 2 (ScrollBar Remise)
#2

Re,

Voila je suis sur le bon post

voila je que j’ais commencer dite moi si je suis bien parti

Private Sub Btn_Quitter_Click()
USFClients.Hide
End Sub

Private Sub BtnValidation_Click()
If MsgBox(" Voulez-vous Valider ?", vbYesNo, “Validées”) = vbYes Then
lr = Sheets(2).Range(“A1048576”).End(xlUp).Row + 1
Cells(lr, 1).Value = Me.CbCivilite
Cells(lr, 2).Value = Me.TNom
Cells(lr, 3).Value = Me.TPrenom
Cells(lr, 4).Value = Me.TBDNais
Cells(lr, 5).Value = Me.TBAdresse
Cells(lr, 6).Value = Me.TBCP
Cells(lr, 7).Value = Me.TBVille
Cells(lr, 8).Value = Me.TBTelFixe
Cells(lr, 9).Value = Me.TBTelPort
Cells(lr, 10).Value = Me.TBMail
End If
End Sub

Private Sub UserForm_Initialize()
CurrentRow = 1
lr = Sheets(2).Range(“A1048576”).End(xlUp).Row
For i = 3 To lr
CbCivilite.AddItem Sheets(“clients”).Cells(i, 1)
Next i
End Sub

Private Sub TNom_AfterUpdate()
'Formate le TextBox avec le première lettre de chaque mot en majuscule
Me.TNom.Value = Application.Proper(Me.TNom.Value)
'Place le curseur sur le ComboBox de destination
TNom.SetFocus
End Sub

Private Sub TPrenom_AfterUpdate()
'Formate le TextBox avec le première lettre de chaque mot en majuscule
Me.TPrenom.Value = Application.Proper(Me.TPrenom.Value)
'Place le curseur sur le ComboBox de destination
TPrenom.SetFocus
End Sub

Cdlt

@kiss6


#3

Re,

Le début est un peu près bon, mais tu l’as testé sur l’USF, car il devrait déjà de donner des cheveux blancs

-1 j’ai mis en note

Tous les contrôles sont nommés, donc avec la feuille d’astuce VBA, vous arriverez facilement à les retrouver.

Donc, CbCivilite n’existe pas mais Cbox_Civilite, idem pour le nom et prénom
regarde sur la feuille astuce
si tu tapes ME. , un menu déroulant apparaits pour choisir soit les Cbox, les Tbox, etc

2-

CbCivilite.AddItem Sheets(“clients”).Cells(i, 1)

Il faut faire attention à la casse, clients, il reconnait pas, mais Clients oui

3 - Les SetFocus, ne te servent à rien

4 le Nom est tout en majuscule

5 - pour la fermeture, ce n’est pas la bonne façon, si tu fermes et reouvre l’USF, à cause du “hide” les donnes sont toujours là. Le “hide” sert à masquer l’USF

Voilà déjà pour un début :stuck_out_tongue_winking_eye:


#4

Re,

CbCivilite existe puisque je les est changé au lieu de Cbox_Civilite

donc lorsque je tapes ME. J’ais bien CbCivilite etc

je joint le classeur

=====> Exercice N° 3 Partie Ajouter.xlsm (1,2 Mo)

Cdlt

@kiss6


#5

Re,

Et pourquoi les changer?
Comme tu veux, tu seras bloqué plus tard

Si je l’ai ai mis en place, as ton avis, ce n’est surement pas pour rien, sinon j’aurais laissé en ComboBox 1, TextBox 1, TextBox 2 etc

Tu as déclaré la variable "lr au-dessus, c’est bien, dans ce cas ne pépéte pas sa recherche dans la validation
tu l’as dans l’initialise

Option Explicit
Dim i As Integer, lr As Integer
Dim CurrentRow As Long
Private Sub Btn_Quitter_Click() 'le nom n'est pas bon pour le bouton, si tu changes, faut vérifier
uynload Me
'USFClients.Hide
End Sub

Private Sub BtnValidation_Click()
  If MsgBox(" Voulez-vous Valider ?", vbYesNo, "Validées") = vbYes Then
    'lr = Sheets(2).Range("A1048576").End(xlUp).Row + 1
    Cells(lr, 1).Value = Me.CbCivilite
    Cells(lr, 2).Value = Me.TNom
    Cells(lr, 3).Value = Me.TPrenom
    Cells(lr, 4).Value = Me.TBDNais
    Cells(lr, 5).Value = Me.TBAdresse
    Cells(lr, 6).Value = Me.TBCP
    Cells(lr, 7).Value = Me.TBVille
    Cells(lr, 8).Value = Me.TBTelFixe
    Cells(lr, 9).Value = Me.TBTelPort
    Cells(lr, 10).Value = Me.TBMail
 End If
End Sub

Private Sub UserForm_Initialize()
 CurrentRow = 1
 'lr = Sheets(2).Range("A1048576").End(xlUp).Row
 lr = Sheets(2).Range("A1048576").End(xlUp).Row + 1
    'For i = 3 To lr
    For i = 3 To lr - 1
    CbCivilite.AddItem Sheets("clients").Cells(i, 1)
     Next i
End Sub

Private Sub TNom_AfterUpdate()
'Formate le TextBox avec le première lettre de chaque mot en majuscule
  Me.TNom.Value = Application.Proper(Me.TNom.Value)
  'Place le curseur sur le ComboBox de destination
  TNom.SetFocus
End Sub

#6

Re,

OK @Mimimathy

Je vais remettre tous en état d’origine et merci pour les corrections :+1:

Car n’ayant absolument aucune connaissance du VBA je pensais que si je ne changeais pas les noms c’la ne

marcherais pas voila pourquoi j’ais fais cet transformation :pensive:

cdlt

@kiss6


#7

Re,

Voila j’ais remis en état d’origine désolé mais c’est beaucoup de chose a assimiler pour moi car comme je vous

ais déjà dit je suis plus que novice en VBA et apprendre comme c’la juste part écrie et pas de visuel ce n’ais

pas évident bref il faut faire avec les moyens du bord

le fichier =====> Exercice N° 3 Partie Ajouter.xlsm (1,2 Mo)

Cdlt

@kiss6


#8

Re,

Ce que j’ais rajouter pour que toutes les lettres de TBox_Nom soit en MAJUSCULE

Private Sub TBox_Nom_Change()
TBox_Nom = UCase(TBox_Nom)
End Sub

Cdlt

@kiss6


#9

Re,

Déjà mieux

peut-être rajouter (ce n’est pas obligatoire si c’est un fichier perso) mais si c’est pour des versions Excel antétieure, il ne reconnait pas le “UCase” d’où le fair de mettre " VBA.UCase (blabla)" qui sera reconnu
j’ai déjà eu ce piège :wink:

Bien vérifier que les nom des contrôles correspondent à leurs actions (je crois que le bouton de validation…)
ensuite vérifier que les données ailles sur la bonne feuille


#10

Bonjour tout le monde les gens,
Salut @Mimimathy, @kiss6, :wink:

@kiss6 et bien dit donc, c’est la forme aujourd’hui :clap:

Du coup j’ai avancé de mon côté aussi.

@Mimimathy, j’ai des difficultés pour le ComboBox Civilité, j’ai mis un range A3:A500 mais je sais qu’il faudrait que j’utilise Dl, seulement j’y arrive pas !
Autre chose qui me bloque c’est la date de naissance valide “pas supérieur à la date du jour”
Je pense qu’il faut que je mette une condition If TBox_DNais >= aujourd’hui Then “Erreur de saisie” mais je n’arrive pas a l’exprimer.

@Mimimathy, En attendant regarde si ce qui ai déjà fait correspond au cahier des charges avant que je m’enfonce dans des erreurs trop graves.

Le code:

Option Explicit
'D?claration des variables pour tout le module
Dim Lig%, Dl%
Dim Espace$
Dim Slash As Byte
Dim Civ As Range
Private Sub Btn_Quitter_Click()
  'Ferme l'USF
  Unload Me
End Sub
Private Sub Cbox_Civilite_Change() 'S?lection civilit?
    '?criture en nom propre
    Cbox_Civilite = Application.Proper(Cbox_Civilite.Value)
End Sub

Private Sub TBox_Nom_Change() 'S?lection NOM
    '?criture en majuscule
    TBox_Nom.Value = UCase(TBox_Nom.Value)
End Sub
Private Sub TBox_Prenom_Change() 'S?lection Pr?nom
    '?criture en nom propre
    TBox_Prenom.Value = Application.Proper(TBox_Prenom.Value)
End Sub
Private Sub TBox_DNais_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) 'S?lection N? le
    'Uniquement des chiffres
    If InStr("0123456789", Chr(KeyAscii)) = 0 Then
     KeyAscii = 0
    End If
End Sub
Private Sub TBox_DNais_Change() 'S?lection N? le
    'Mettre un Slash de s?paration style 01/01/2018
    Slash = Len(TBox_DNais)
     If Slash = 2 Or Slash = 5 Then TBox_DNais = TBox_DNais & "/"
End Sub

Private Sub TBox_Adresse_Change() 'S?lection adresse
    '?criture en nom propre
    TBox_Adresse.Value = Application.Proper(TBox_Adresse.Value)
End Sub
Private Sub TBox_CP_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) 'S?lection code postale
    'Uniquement des chiffres
    If InStr("0123456789", Chr(KeyAscii)) = 0 Then
     KeyAscii = 0
    End If
End Sub
Private Sub TBox_Ville_Change() 'S?lection Ville
    '?criture en majuscule
    TBox_Ville.Value = UCase(TBox_Ville.Value)
End Sub
Private Sub TBox_TelFixe_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) 'S?lection t?l?phone fixe
    'Uniquement des chiffres
    If InStr("0123456789", Chr(KeyAscii)) = 0 Then
     KeyAscii = 0
    End If
End Sub
Private Sub TBox_TelFixe_Change() 'Mettre un espace tout les 2 chiffres
    Espace = TBox_TelFixe.Text
    Select Case Len(Espace)
    Case 2, 5, 8, 11
    Espace = Espace & " "
    End Select
    TBox_TelFixe.Text = Espace
End Sub
Private Sub TBox_TelPort_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) 'S?lection t?l?phone portable
    'Uniquement des chiffres
    If InStr("0123456789", Chr(KeyAscii)) = 0 Then
     KeyAscii = 0
    End If
End Sub
Private Sub TBox_TelPort_Change() 'Mettre un espace tout les 2 chiffres
    Espace = TBox_TelPort.Text
    Select Case Len(Espace)
    Case 2, 5, 8, 11
    Espace = Espace & " "
    End Select
    TBox_TelPort.Text = Espace
End Sub
Private Sub TBox_Mail_Change() 'S?lection mail
    '?criture en minuscule
    TBox_Mail.Value = LCase(TBox_Mail.Value)
End Sub


Private Sub UserForm_Initialize()

  'Liste Civilit? sans doublon
  With Cbox_Civilite
   .Value = ""
   For Each Civ In Worksheets("Clients").Range("A3:A500")
     Me.Cbox_Civilite = Civ
      If Me.Cbox_Civilite.ListIndex = -1 Then Me.Cbox_Civilite.AddItem Civ
    Next Civ
  End With
    
  'Max 5 chiffres dans code postale
  With TBox_CP
   .MaxLength = 5
   .Value = ""
  End With
  'Max 10 chiffres dans t?l?phone fixe + 4 espaces
  With TBox_TelFixe
  .MaxLength = 14
  .Value = ""
  End With
  'Max 10 chiffres dans t?l?phone portable + 4 espaces
  With TBox_TelPort
  .MaxLength = 14
  .Value = ""
  End With
  'Max 8 chiffres dans N? le + 2 Slashs
  With TBox_DNais
  .MaxLength = 10
  .Value = ""
  End With
End Sub

Private Sub Btn_Validation_Click() 'Appui sur le bouton Ajouter
 With Feuil1 'Dans la feuille Clients
  '?crire les donn?es dans la derni?re ligne non vide ? partir de la colonne A
  Dl = Range("A" & Rows.Count).End(xlUp).Row + 1
  
   .Cells(Dl, 1).Value = Me.Cbox_Civilite.Value
   .Cells(Dl, 2).Value = Me.TBox_Nom.Value
   .Cells(Dl, 3).Value = Me.TBox_Prenom.Value
   .Cells(Dl, 4).Value = Me.TBox_DNais.Value
   .Cells(Dl, 5).Value = Me.TBox_Adresse.Value
   .Cells(Dl, 6).Value = Me.TBox_CP.Value
   .Cells(Dl, 7).Value = Me.TBox_Ville.Value
   .Cells(Dl, 8).Value = Me.TBox_TelFixe.Value
   .Cells(Dl, 9).Value = Me.TBox_TelPort.Value
   .Cells(Dl, 10).Value = Me.TBox_Mail.Value
   
 End With
End Sub

Le fichier: Exercice N° 3 Partie Ajouter VEssai.xlsm (1,2 Mo)

@+ et bon dimanche à toutes et tous.


#11

Re,

Bonjour @mdo100

Je vient de regarder votre classeur chapeau @Mimimathy avait raison lorsqu’il disait que c’la seras du gâteau

pour vous il avais raison :clap:

Ce que je ne comprend pas c’est le combobox votre choix a quoi c’la sert

Cdlt

@kiss6


#12

Re,

Kiss à raison sur ce point, il avait déjà une partie sur le fichier qui a aidé, mais le fichier ne fait que AJOUTER.
C’est pour cette raison qu’il y a le Combobox Votre Choix, qui, dans la prochaine demande sera invisible quand on Ajoute, et visible pour la Modification ou la Suppression, avec l’utilisation des boutons d’options.

AH AH, il est pas fini celui là, mais je vous ferai cadeau de certaines macro, trop trop Hard.

Salut MDO

Bon, c’est plus que bien:
Alors pour le CBox_Civilité

'Liste Civilité sans doublon
  With Cbox_Civilite
   .Value = ""
   For Each Civ In Worksheets("Clients").Range("A3:A" & Range("A" & Rows.Count).End(xlUp).Row) 'au lieu de mettre 500, tu remplaces comme pour trouver la Dl
     Me.Cbox_Civilite = Civ
      If Me.Cbox_Civilite.ListIndex = -1 Then Me.Cbox_Civilite.AddItem Civ
    Next Civ
  End With
  Me.Cbox_Civilite.ListIndex = -1 'Pour mettre le Combo au début càd vide

Pour la Date de Naissance, il y a deux choses à voir pour être propre
1 - Que la date ne soit pas supérieure à la date du jour

assez simple avec une condition IF sur une autre macro de sortie TBox_DNais_Exit par exemple
qui envoi un message si la date de la TextBox est sup a la date du jour

2 - Vérifier que la date soit correcte

ex: 30/02/2018 if not exist…
que l’on peut mettre dans cette même macro


#13

Re @kiss6, :wink:

Je suis parti avec un avantage, car j’avais déjà une petite expérience et j’en avais fait part ICI: Exercice N° 3- Partie 1 (Création Userfom ) avec un fichier dans ma première réponse.

Donc je n’ai que peu de mérite et détrompe-toi, ce n’ai pas du gâteau pour moi, car comme je connais pas où peu les instructions en VBA, il faut constamment que je fasse des recherches, la galère quoi et comme je parle Anglais comme une vache Espagnole, j’te raconte même pas la double galère.

Mais ses Exercices, me permettent au fur et à mesure de mémoriser les instructions, bien que ma matière grise soit pleine de trous.

Pour le moment, je n’ais pas utiliser le ComboBox “CBox_NomComplet” en face du Label “Votre Choix”, celui-ci servira plus tard pour faire les recherches avec le Nom et Prénom afin de modifier et où de supprimer des lignes dans la feuille “Clients”.

Je n’en suis pas là ! En attendant, c’est cool de travailler à plusieurs, ça permet d’avancer bien que je n’ai pas encore pris le temps de voir ce que tu avais fait, surtout pour les Msgbox ou tu es très fort. :muscle:

Bon je vais regarder la réponse que @Mimimathy m’a fait, afin de voir ce qui ne va pas avec mon fichier.

@+


#14

Re @Mimimathy,

Petit problème encore avec “CBox_Civilité”

'Liste Civilité sans doublon
  With Cbox_Civilite
   
   For Each Civ In Worksheets("Clients") _
   .Range("A3:A" & Range("A" & Rows.Count).End(xlUp).Row)
     Me.Cbox_Civilite = Civ
      If Me.Cbox_Civilite.ListIndex = -1 Then Me.Cbox_Civilite.AddItem Civ
    Next Civ
  End With
     Me.Cbox_Civilite.ListIndex = -1 

Voila ce que j’obtiens !

Capture

Ça ne me décompte pas les 2 premières lignes de la colonne “A”

@+


#15

Re,

@Mimimathy pourriez-vous m’expliquez ou nous expliquer pourquoi dans le

Private Sub TBox_DNais_Change() de @mdo100 il n’y a pas de End if et que c’la fonctionne sans

alerte de débogage

Private Sub TBox_DNais_Change() 'Sélection Né le
'Mettre un Slash de séparation style 01/01/2018
Slash = Len(TBox_DNais)
If Slash = 2 Or Slash = 5 Then TBox_DNais = TBox_DNais & “/”
End Sub

Cdlt

@kiss6


#16

Re MDO
remplace le -1 par 0


#17

Re Kiss

dans son IF il met la suite du THEN à la suite, donc pas de End If


#18

@kiss6,

Il s’agit de la continuité de la formule après le Then.

Par exemple si tu écris le code comme ça, il faudra le End If à la fin

Private Sub TBox_DNais_Change() 'Sélection Né le
'Mettre un Slash de séparation style 01/01/2018
Slash = Len(TBox_DNais)
If Slash = 2 Or Slash = 5 Then 
TBox_DNais = TBox_DNais & “/”
End If
End Sub

#19

Re,

Et bien il est vraiment caller ce @mdo100 car ca il faut le savoir et surtout le comprendre

Cdlt

@kiss6


#20

Re,

Ok @mdo100 mais quand on ne le sais pas c’est pour ca que j’ais du mal a vous suivre dans vos dialogue

car vous vous comprenez c’la prouve bien la différence de niveau :exploding_head:

cdlt

@kiss6