Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Rédacteur

    USERFORM - Créer, Consulter, Modifier et Supprimer des enregistrements à l'aide d'un formulaire.
    USERFORM - CRUD
    Ou comment créer, consulter, modifier et supprimer des enregistrements à l'aide d'un formulaire.

    L’utilisation d’un formulaire pour créer, éditer, supprimer, et ajouter un enregistrement est un sujet régulièrement évoqué sur les forums.
    Cette contribution a pour but de montrer une solution parmi d’autres de la manière de construire d’une façon structurée un formulaire CRUD dont l’acronyme signifie (Create, Read, Update, Delete).
    Il est possible bien entendu de réaliser un formulaire totalement dynamique mais j’ai voulu faire simple avec un minimum de contrôle et peu de données.
    Convention de nommage
    Pour nommer mes contrôles, j’utilise les préfixes suivants :
    frm pour Frame
    cmd pour CommandButton
    txt pour TextBox
    cbo pour ComboBox
    lbl pour Label
    opt pour OptionButton
    usf pour UserForm
    Les données
    Colonne A - Ref qui est un nombre avec un format personnalisé R000
    Colonne B - Nom
    Colonne C - Prénom
    Colonne D - Adresse
    Colonne E - Sexe
    Le formulaire

    Les contrôles formulaires
    A l’exception des contrôles numérotés en rouge, les quatre étiquettes (label) (Nom, Prénom, Adresse et Sexe) et les Frame désignés par une lettre, le nom de tous les contrôles sont indiqués dans l’illustration ci-dessus
    Les contrôles lettrés
    Les contrôles désignés pas les lettres A, B et C sont des cadres (type Frame)
    A – frmMember (Encadre les contrôles signalétiques des données)
    B – frmButton (Encadre les boutons, Nouveau, Modification et Suppression)
    C – frmNavigation (Encadre les boutons de navigation Premier, Dernier, Précédent, Suivant)
    Les contrôles numérotés (encadré par le frame frmMember)
    1 - txtName
    2 - txtFirstName
    3 - txtAddress
    4 - optMale
    5 - optFemale
    Déclaration des variables et constantes de portées module
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Option Explicit
    ' Déclaration des variables et constantes de portées module
    Enum Status ' Constantes énumérées Status
     Consultation = 0: Modify = 1: NewRec = 2: Remove = 3
    End Enum
    Const StatusLabel As String = "Consultation;Modification;Création;Suppression"
    Const appTitle As String = "Fiche de membre"
    Dim UserFormStatus As Byte ' Statut du type de travail (Consultation, Modify, NewRec, Remove)
    Dim CurrentRecord As Long  ' Enregistrement en cours
    Dim rng As Range           ' Plage de données traitée par le formulaire
    Dim lstStatusText() As String

    Les procédures
    Les codes de certaines procédures sont affichés et commentés ici. Je renvoie vers le classeur en téléchargement pour le complément.
    A l’ouverture du UserForm
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub UserForm_Activate()
     InitVariable      ' Initialisation des variables
     InitData            ' Initialisation adresse liste des données + RowSource
     InitComboBox ' Initialisation ComboBox
     UserFormStatus = Status.Consultation ' Consultation par défaut
     With Me           ' Initialisation de certains contrôles
     .cmdConfirm.Visible = False: .cmdCancel.Visible = False
     .cboMember.Enabled = True: .frmMember.Enabled = False
     usfTitle     ' Titre du UserForm (Propriété Caption)
     End With
     ' Focus sur le 1er enregistrement ou l'enregistrement sélectionné dans la feuille
     With Me: .cboMember.ListIndex = Me.Tag: End With
    End Sub


    Lecture des enregistrements
    Pour éditer, modifier et supprimer un enregistrement il faut avant tout lire l’enregistrement, nous allons donc prévoir une procédure nommée ReadRecord
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub ReadRecord(ByVal RecordNumber As Long)
     ' Lecture de l'enregistrement
     RecordNumber = RecordNumber + 1
     With rng
      Me.txtName = .Cells(RecordNumber, 2)
      Me.txtFirstName = .Cells(RecordNumber, 3)
      Me.txtAddress = .Cells(RecordNumber, 4)
      If UCase(.Cells(RecordNumber, 5)) = "F" Then Me.optFemale.Value = True Else Me.optMale = True
      Me.frmMember.Caption = "Fiche " & Format(RecordNumber, "R000")
     End With
    End Sub

    Cette procédure sera appelée par la procédure événementielle cboMember_Click qui s’enclenche dès que l’on modifie la valeur de la propriété ListIndex du contrôle cboMember.

    Ecriture des enregistrements
    Pour ajouter et modifier un enregistrement, il faut bien entendu écrire. Nous prévoirons donc une procédure d’écriture nommée WriteRecord
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Private Sub WriteRecord(ByVal RecordNumber As Long)
     ' Ecriture de l'enregistrement
     Me.cboMember.ListIndex = -1
     RecordNumber = RecordNumber + 1
     With rng
      With .Cells(RecordNumber, 1)
       If Len(.Value) = 0 Then ' ID
        .Value = Application.WorksheetFunction.Max(rng.Columns(1)) + 1
       End If
      .NumberFormat = "\R000" ' Format
      End With
     .Cells(RecordNumber, 2) = Me.txtName
     .Cells(RecordNumber, 3) = Me.txtFirstName
     .Cells(RecordNumber, 4) = Me.txtAddress
     .Cells(RecordNumber, 5) = IIf(Me.optFemale = True, "F", "M")
     End With
     Me.cboMember.ListIndex = CurrentRecord
    End Sub

    Parcourir les enregistrements
    La variable CurrentRecord de portée module) a comme valeur le numéro de l’enregistrement en cours dont le premier égal 0. Ce choix a été fait pour correspondre à la valeur de la propriété ListIndex du contrôle cboMember.
    On parcourt les enregistrements soit en sélectionnant un élément dans la liste (contrôle cboMember, soit en cliquant sur un des boutons (Premier, dernier, suivant, précédent) encadrés par le contrôle frmNavigation. Ces contrôles nommés cmdFirst, cmdLast, cmdPrevious, cmdNext.
    Procédure événementielle cboMember_Click
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub cboMember_Click()
     CurrentRecord = Me.cboMember.ListIndex
     ReadRecord CurrentRecord ' Lecture de l'enregistrement sélectionné
     CheckButton
    End Sub

    Les procédures événementielles des boutons de navigations
    Les procédures événementielles des boutons de navigations
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Private Sub cmdNext_Click()
     Me.cboMember.ListIndex = CurrentRecord + 1
    End Sub
     
    Private Sub cmdPrevious_Click()
     Me.cboMember.ListIndex = CurrentRecord - 1
    End Sub
     
    Private Sub cmdFirst_Click()
     Me.cboMember.ListIndex = 0
    End Sub
     
    Private Sub cmdLast_Click()
     Me.cboMember.ListIndex = rng.Rows.Count - 1 ': Navigate
    End Sub

    La procédure CheckButton
    La propriété Enabled des boutons de navigations est à False lorsque la limite inférieure ou supérieure des enregistrements est atteinte.
    C’est la procédure CheckButton qui gère cette propriété et celle-ci est invoquée par la procédure événementielle cboMember.
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub CheckButton()
     With Me
     .cmdFirst.Enabled = CurrentRecord > 0
     .cmdPrevious.Enabled = CurrentRecord > 0
     .cmdNext.Enabled = CurrentRecord <> rng.Rows.Count - 1
     .cmdLast.Enabled = CurrentRecord <> rng.Rows.Count - 1
     End With
    End Sub

    Les actions (Créer, modifier et supprimer les enregistrements)
    Par défaut, l’enregistrement sélectionné est consulté. Pour le modifier, le supprimer ou créer un nouvel enregistrement, il faut sélectionner un des boutons encadrés par le contrôle frmAction.
    Voici le code des différentes procédures événementielles
    Nouvel enregistrement (cmdNew)
    .
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub cmdNew_Click()
     UserFormStatus = Status.NewRec '
     ClearTextBox     ' Efface les valeurs des TextBox
     OppositeStatus ' Inverse la valeur booléenne des boutons d’action
    End Sub

    Modification (cmdModify)
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub cmdModify_Click()
     UserFormStatus = Status.Modify
     OppositeStatus ' Inverse la valeur booléenne des boutons d’action
    End Sub

    Suppression (cmdRemove)
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub cmdRemove_Click()
     UserFormStatus = Status.Remove: usfTitle
     RemoveRecord CurrentRecord ' Supprime l'enregistrement courant
     UserFormStatus = Status.Consultation: usfTitle
    End Sub

    La procédure de suppression d’enregistrement RemoveRecord
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Private Sub RemoveRecord(ByVal RecordNumber As Long)
     ' Suppression de l'enregistrement
     ' Contrainte il doit rester un enregistrement
     Select Case True
      Case rng.Rows.Count = 1 ' Reste 1 enregistrement
        MsgBox "Vous devez laisser un enregistrement", vbInformation, "Suppression impossible"
      Case MsgBox("Voulez-vous supprimer la ligne sélectionnée", _
                vbCritical + vbYesNo + vbDefaultButton2, _
                "Suppression de la ligne " & CurrentRecord + 1) = vbYes
         RecordNumber = RecordNumber + 1
         rng.Rows(RecordNumber).Delete Shift:=xlUp ' Supprime la ligne de la plage
         InitData
         InitRowSource
         CurrentRecord = 0: Me.cboMember.ListIndex = CurrentRecord
     End Select
     UserFormStatus = Status.Consultation
    End Sub

    OppositeStatus - Propriétés Visibles, Enabled des contrôles
    Lorsque l’on clique sur un des boutons d’action, la propriété Visible ou Enabled de certains contrôles change de valeur. C’est la procédure OppositeStatus qui s’en charge.
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     Sub OppositeStatus()
     ' Inverse la valeur booléenne des boutons d'action
     ' Modifie la propriété Caption du UserForm
     With Me
     .cboMember.Enabled = Not .cboMember.Enabled
     .frmMember.Enabled = Not .frmMember.Enabled
     .frmAction.Visible = Not .frmAction.Visible
     .cmdCancel.Visible = Not .cmdCancel.Visible
     .cmdConfirm.Visible = Not .cmdConfirm.Visible
     .cmdExit.Visible = Not .cmdExit.Visible
     .frmNavigation.Visible = Not .frmNavigation.Visible
      If .cboMember.Enabled = True Then UserFormStatus = Status.Consultation ' Consultation
      usfTitle ' Titre du UserForm
     End With
    End Sub

    Liens
    Je renvoie vers ces tutoriels pour apprendre la manière de gérer les formulaires et les contrôles.
    et cette contribution pour générer automatiquement la valeur de la propriété ColumnWidth d'un contrôle ListBox ou ComboBox en fonction de la largeur de la colonne de la feuille.
    Classeur
    Un classeur est disponible en téléchargement.
    Tests
    Malgré le soin apporté à la programmation de ces procédures et aux multiples tests réalisés, il est possible qu'il subsiste une erreur qui m'aurait échappé. N'hésitez pas à m'en faire part.

    Vos remarques et réactions sont les bienvenues.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Quelques contributions : USERFORM - Créer, Consulter, Modifier et Supprimer des enregistrements à l'aide d'un formulaire - Géolocalisation d'une adresse avec Excel et Google sans VBA

  2. #2
    Membre chevronné
    Bonsoir Philippe,

    plutôt sympa comme approche. Beau travail !

    Curt
    Pas de demande par MP, sinon j'correctionne plus, j'dynamite, j'disperse, j'ventile !!!
    ---------------------------------------------------------------------
    Vous avez un talent insoupçonné... Faites-en profitez les autres. Un p'tit CLIC pour une grande cause.
    Et si vous faisiez un bon geste en 2020 ? Soyez utile, ça vous changera ! Moi, ça m’a changé !

  3. #3
    Rédacteur

    Bonjour Curt,
    Merci pour ton appréciation
    Philippe
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Quelques contributions : USERFORM - Créer, Consulter, Modifier et Supprimer des enregistrements à l'aide d'un formulaire - Géolocalisation d'une adresse avec Excel et Google sans VBA

  4. #4
    Membre à l'essai
    Bien l'bonsoir braves gens,

    Cher Philippe, que n'avez-vous réalisé ce travail splendide, remarquable, et assurément utile, la semaine passée ??
    Vous m'auriez permis, ainsi qu'à un petit monde d'autres âmes en peine, d'avancer mon petit travail avec plus de célérité, c'est évident.
    C'est quelque chose tout de même que le hasard ; vous venez de répondre à plusieurs questions que j'ai soumises au forum pas plus tard que les jours passés.
    Questions auxquelles ce forum de têtes bien pensantes à toujours répondu avec rapidité, ce dont, bien entendu, je le remercie grandement.

    Mille mercis l'ami.
    A vous relire encore.

  5. #5
    Rédacteur

    Bonsoir,
    Cher Philippe, que n'avez-vous réalisé ce travail splendide, remarquable, et assurément utile, la semaine passée ??
    J'ai tellement de projets de contributions dans mes cartons mais dans une journée, il n'y a que 24 heures et dans celles-ci il n'y a pas hélas que le travail.
    Vous m'auriez permis, ainsi qu'à un petit monde d'autres âmes en peine, d'avancer mon petit travail avec plus de célérité, c'est évident.
    C'est quelque chose tout de même que le hasard ; vous venez de répondre à plusieurs questions que j'ai soumises au forum pas plus tard que les jours passés.
    J'en suis heureux
    Questions auxquelles ce forum de têtes bien pensantes à toujours répondu avec rapidité, ce dont, bien entendu, je le remercie grandement.
    Mille mercis l'ami.
    Mille mercis à toi aussi de l'écrire.
    Un merci est la plus belle récompense pour ce travail.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Quelques contributions : USERFORM - Créer, Consulter, Modifier et Supprimer des enregistrements à l'aide d'un formulaire - Géolocalisation d'une adresse avec Excel et Google sans VBA

  6. #6
    Membre habitué
    Bonsoir à tous,

    Je viens juste dire mon contentement pour cet excellent travail d’orfèvre...

    Ce tuto est sur ma table de chevet... J'en apprend à chaque ligne...

    Mille mercis à Philippe ! !

    Denis...
    Windows 7, 8 et 10 / Debian et RaspBian / LibreOffice 5.3.0.1 et bientôt,
    "Fini MicroSoft", je compte passer à tout Linux chez moi (seul problème : AutoCAD)...
    Un clavier azerty en vaut deux...

  7. #7
    Membre éclairé
    Bonjour Phillipe, bonjour le forum,

    Excellent travail, simple et efficace, je suis impressionné
    Citation Envoyé par Oscar Wilde
    Je déteste les discussions: elles vous font parfois changer d'avis.

  8. #8
    Rédacteur

    Bonjour,
    Denis et Nico, merci pour vos congratulations qui encouragent à continuer à écrire de nouvelles contributions et ravi qu'elles servent.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Quelques contributions : USERFORM - Créer, Consulter, Modifier et Supprimer des enregistrements à l'aide d'un formulaire - Géolocalisation d'une adresse avec Excel et Google sans VBA

  9. #9
    Membre averti
    Bonjour Philippe,

    Suite à un des messages du forum dans lequel tu parlais de ce sujet, je suis venu voir... et c'est une super présentation.
    Merci pour l'exemple et les idées qui guideront mes futurs développements.

    Une remarque:
    Il me semble que dans "UserForm_Activate", la mise à jour de l'index de "cboMember" n'est (à mon sens) pas utile hormis pour l'exemple car déjà réalisé via "InitRowSource".

    Cordialement.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  10. #10
    Rédacteur

    Bonjour GastonLagaffe25,
    Merci pour ton appréciation à cette contribution.
    Une remarque:
    Il me semble que dans "UserForm_Activate", la mise à jour de l'index de "cboMember" n'est (à mon sens) pas utile hormis pour l'exemple car déjà réalisé via "InitRowSource".
    Tu as tout à fait raison, il y a une redite dans la ligne With Me: .cboMember.ListIndex = Me.Tag: End With de la procédure UserForm_Activate et la ligne .ListIndex = 0 dans la procédure InitRowSource (voir ci-dessous)
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub InitRowSource()
     With Me.cboMember
     .RowSource = rng.Address(external:=True)
     .ListIndex = 0 ' Force la sélection du premier enregistrement
     End With
    End Sub

    Je ne me souviens plus de la raison pour laquelle, j'ai placé ces deux instructions à deux endroits différents, mais voici une explication
    La procédure InitRowSource est appelée par plusieurs procédures InitComboBox, UserForm_Activate, cmdConfirm_Click et RemoveRecord.
    Si l'utilisateur souhaite avoir un enregistrement précis sélectionné lors de l'ouverture du formulaire, il peut le placer dans la procédure UserForm_Activate alors que dans tous les autres cas où l'on invoque la procédure InitRowSource.

    Cependant cette ligne dans la procédure événementielle n'est évidemment pas obligatoire et je te remercie d'avoir soulevé ce point qui prouve que tu as bien lu cette contribution.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Quelques contributions : USERFORM - Créer, Consulter, Modifier et Supprimer des enregistrements à l'aide d'un formulaire - Géolocalisation d'une adresse avec Excel et Google sans VBA

  11. #11
    Membre confirmé
    bonjour a tous et toutes et en particulier a Mr Philippe THULLIEZ :

    chapeau pour ce merveilleux classeur mis a disposition et si bien fait et simple d'utilisation que j'en ai fait mon classeur client
    le seul bémol est que le numéro est toujours afficher mais ce n'est qu'un détail dans ce classeur magnifique
    et la cboMember est débordé par le nombre de clients a dérouler

    encore merci pour cette contribution

    Pascal

  12. #12
    Rédacteur

    Bonjour Pascal,
    Merci pour tes congratulations et ravi que ce classeur te serve.
    Qu'entends-tu par
    le seul bémol est que le numéro est toujours afficher mais ce n'est qu'un détail
    S'agit-il du n° en colonne A qui s'affiche dans le contrôle Frame ? Si oui, il suffit d'enlever la ligne de code ci-dessous qui se trouve dans la procédure ReadRecord.
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Me.frmMember.Caption = "Fiche " & Format(RecordNumber, "R000")
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Quelques contributions : USERFORM - Créer, Consulter, Modifier et Supprimer des enregistrements à l'aide d'un formulaire - Géolocalisation d'une adresse avec Excel et Google sans VBA

  13. #13
    Membre confirmé
    bonjour Philppe THULLIEZ

    Merci de ta réponse mais j'ai oublier de préciser que c'est dans l'usf et il occupe le 1er textbox et j'ai été obliger de l'inscrire en tête des procédures write et read dont voici la procédure read
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Private Sub ReadRecord(ByVal RecordNumber As Long)
     ' Lecture de l'enregistrement
     RecordNumber = RecordNumber + 1
     With rng
     Me.numero = .Cells(RecordNumber, 1)<============================ICI
     Me.Txtcivil = .Cells(RecordNumber, 2)
      Me.txtName = .Cells(RecordNumber, 3)
      Me.txtFirstName = .Cells(RecordNumber, 4)
       Me.Txtattention = .Cells(RecordNumber, 5)
      Me.txtAdress = .Cells(RecordNumber, 6)
      Me.Txtcomplement = .Cells(RecordNumber, 7)
      Me.Txtcp = .Cells(RecordNumber, 8)
      Me.Txtville = .Cells(RecordNumber, 9)
      Me.Txtfixe = .Cells(RecordNumber, 10)
      Me.Txtmobile = .Cells(RecordNumber, 11)
      Me.Txtemail = .Cells(RecordNumber, 12)
      'If UCase(.Cells(RecordNumber, 13)) = "F" Then Me.optFemale.Value = True Else Me.optMale = True
      'Me.frmMember.Caption = "Fiche " & Format(RecordNumber, "R000") 'frmember est la frame entourant les textbox
     End With
    End Sub


    autrement j'ai un bug avec les 2 lignes en commentaires pour Ucase et Format avec un bug projet où bibliothèque introuvable mis a part parfait
    il faudrait aussi que le nom et ville soit en ucase automatiquement

    Pascal

  14. #14
    Rédacteur

    Bonjour Pascal,
    La correction que je te proposais faisait également partie de la même procédure ReadRecord du UserForm.
    Je n'ai donc pas compris alors quel est le problème.
    Dans mon exemple la référence se trouvant en colonne A est un nombre correspondant au n° d'enregistrement formaté "R000" (format personnalisé) et celui-ci est créé automatiquement dans la procédure WriteRecord en me basant sur la valeur maximale des nombres contenu en colonne A additionné de 1.

    [EDIT]
    autrement j'ai un bug avec les 2 lignes en commentaires pour Ucase et Format avec un bug projet où bibliothèque introuvable mis a part parfait
    il faudrait aussi que le nom et ville soit en ucase automatiquement
    Je viens de lire la suite, pas vu en première lecture.
    Je regarde cela plus tard et reviendrai pour y répondre.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Quelques contributions : USERFORM - Créer, Consulter, Modifier et Supprimer des enregistrements à l'aide d'un formulaire - Géolocalisation d'une adresse avec Excel et Google sans VBA

  15. #15
    Membre confirmé
    RE
    j'ai essayer comme ci dessous et j'ai le même buga ucase
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub txtFirstName_Change()
    Me.txtFirstName.Text = UCase(Me.txtFirstName.Text)
    End Sub


    Pascal

  16. #16
    Rédacteur

    Bonjour Pascal,
    Je n'ai sans doute pas compris ton problème car pour ma part, je n'ai pas de soucis avec les procédures événementielles dont tu parles (J'ai fais des tests avec Change et AfterUpdate
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub txtFirstName_Change()
      Me.txtFirstName = UCase(Me.txtFirstName)
    End Sub
     
    Private Sub txtFirstName_AfterUpdate()
     '  Me.txtFirstName = UCase(Me.txtFirstName)
    End Sub


    Je rappelle que chez moi la référence (ID) se trouvant en colonne A est construite automatiquement et ne fait donc pas l'objet d'encodage de la part de l'utilisateur (pas de TextBox) Il faut donc adapter le code si l'on souhaite créer sa propre référence.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Quelques contributions : USERFORM - Créer, Consulter, Modifier et Supprimer des enregistrements à l'aide d'un formulaire - Géolocalisation d'une adresse avec Excel et Google sans VBA

  17. #17
    Nouveau membre du Club
    Bonjour

    Avant tout merci pour cette contribution.

    Je me suis aperçu que quand on supprime une ligne le n° ID est différent de celui inscrit sur la fiche

    Exemple dans votre fichier en téléchargement

    la ligne 2 a pour réf R002 (Nom Gentil) et sur la fiche formulaire il est inscrit Fiche R001.

    Voili voilo

  18. #18
    Rédacteur

    Ce message n'a pas pu être affiché car il comporte des erreurs.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Quelques contributions : USERFORM - Créer, Consulter, Modifier et Supprimer des enregistrements à l'aide d'un formulaire - Géolocalisation d'une adresse avec Excel et Google sans VBA

  19. #19
    Membre confirmé
    bonsoir Philippe TULLIEZ

    l'erreur d'écriture d'un code est toujours possible et venant d'un bénévole il n'y a pas d'excuses qui tiennent
    d'autant plus que le classeur fonctionne très bien et le code que tu as mis en correctif est mis en commentaire sur le classeur que j'utilise, bon je vais essayer avec cette ligne rectifiée

    Merci beaucoup pour ce classeur mis a disposition

    Pascal

    ca fonctionne très bien le nom de la frame affiche bien les numéros correspondant
    la ou je suis le plus gêné, c'est pour la gestion cp et villes j'ai un classeur qui le fait mais je n'ai pas pris le temps de le faire, pendant la transition 2015/2016 peut etre

    Pascal

  20. #20
    Nouveau membre du Club
    Bonsoir

    Merci Philippe pour la correction

    J'en profite pour exposer mon problème

    j'ai ajouté plusieurs textbox pour insérer des dates et j’utilise Cdate pour les convertir en format date
    Voici le code mis dans la procédure d’écriture nommée WriteRecord

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    .Cells(NumeroEnrg, 17) = CDate(Me.txtDateEnrg)


    le problème est que si je laisse un textbox date vide j'ai un message d'erreur "Erreur d’exécution '13' Incompatibilité de Type".

    Merci de votre aide

###raw>template_hook.ano_emploi###