IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Contribuez Discussion :

USERFORM - Créer, Consulter, Modifier et Supprimer des enregistrements à l'aide d'un formulaire.


Sujet :

Contribuez

  1. #1
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 773
    Points : 28 634
    Points
    28 634
    Billets dans le blog
    53
    Par défaut 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
    Nom : UserForm CRUD.png
Affichages : 41535
Taille : 52,2 Ko
    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.
    Fichiers attachés Fichiers attachés
    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
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  2. #2
    Membre émérite Avatar de curt
    Homme Profil pro
    Ingénieur Etudes
    Inscrit en
    Mars 2006
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Etudes
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 566
    Points : 2 525
    Points
    2 525
    Par défaut
    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 2024 ? Soyez utile, ça vous changera ! Moi, ça m’a changé !

  3. #3
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 773
    Points : 28 634
    Points
    28 634
    Billets dans le blog
    53
    Par défaut
    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
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  4. #4
    Membre à l'essai
    Homme Profil pro
    Retraité
    Inscrit en
    Janvier 2015
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Janvier 2015
    Messages : 26
    Points : 19
    Points
    19
    Par défaut
    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
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 773
    Points : 28 634
    Points
    28 634
    Billets dans le blog
    53
    Par défaut
    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
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  6. #6
    Membre habitué Avatar de DenisHen
    Homme Profil pro
    Dessinateur / projeteur
    Inscrit en
    Novembre 2013
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Dessinateur / projeteur
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2013
    Messages : 384
    Points : 198
    Points
    198
    Par défaut
    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 / RaspBian / AutoCAD 3D 2023

    Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
    Davantage d'avantages, avantagent davantage (Bobby Lapointe).
    La connaissance s'accroît quand on la partage (Socrate).
    Tant va la cruche à l'eau que l'habit n'amasse pas mousse. (Moi)
    Un clavier azerty en vaut deux (developpez.net).

  7. #7
    Membre éclairé Avatar de Nico Chg
    Homme Profil pro
    Apprenti ingénieur Business Development
    Inscrit en
    Juillet 2014
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Apprenti ingénieur Business Development
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2014
    Messages : 352
    Points : 758
    Points
    758
    Par défaut
    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
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 773
    Points : 28 634
    Points
    28 634
    Billets dans le blog
    53
    Par défaut
    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
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  9. #9
    Membre averti
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2011
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 212
    Points : 334
    Points
    334
    Par défaut
    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
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 773
    Points : 28 634
    Points
    28 634
    Billets dans le blog
    53
    Par défaut
    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
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  11. #11
    Membre confirmé Avatar de grisan29
    Homme Profil pro
    ouvrier poseur
    Inscrit en
    Octobre 2006
    Messages
    866
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ouvrier poseur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2006
    Messages : 866
    Points : 520
    Points
    520
    Par défaut
    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
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 773
    Points : 28 634
    Points
    28 634
    Billets dans le blog
    53
    Par défaut
    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
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  13. #13
    Membre confirmé Avatar de grisan29
    Homme Profil pro
    ouvrier poseur
    Inscrit en
    Octobre 2006
    Messages
    866
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ouvrier poseur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2006
    Messages : 866
    Points : 520
    Points
    520
    Par défaut
    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
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 773
    Points : 28 634
    Points
    28 634
    Billets dans le blog
    53
    Par défaut
    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
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  15. #15
    Membre confirmé Avatar de grisan29
    Homme Profil pro
    ouvrier poseur
    Inscrit en
    Octobre 2006
    Messages
    866
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ouvrier poseur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2006
    Messages : 866
    Points : 520
    Points
    520
    Par défaut
    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
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 773
    Points : 28 634
    Points
    28 634
    Billets dans le blog
    53
    Par défaut
    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
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  17. #17
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 75
    Points : 40
    Points
    40
    Par défaut
    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
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 773
    Points : 28 634
    Points
    28 634
    Billets dans le blog
    53
    Par défaut
    Bonjour skyzix,
    Avant tout merci pour cette contribution.
    Merci à toi
    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.
    Effectivement je viens d'effectuer un test et de plus ce n'est pas que dans le cas d'une suppression.
    Le numéro affiché dans le contrôle Frame nommé frmMember affiche le n° de la ligne de la liste de données et pas le n° se trouvant dans la cellule de la colonne 1 de l'enregistrement parcouru.

    Le bug provient de la ligne 9 de la procédure ReadRecord
    Remplacer RecordNumber par .Cells(RecordNumber, 1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.frmMember.Caption = "Fiche " & Format(RecordNumber, "R000")
    Ci-dessous, la procédure corrigée
    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(.Cells(RecordNumber, 1), "R000")
     End With
    End Sub
    Merci pour ton retour.

    [EDIT]
    Du coup, je présente mes excuses à Pascal qui il me semble à dû me relever le même problème dans le fil #20, mais surtout dans le fil #22 mais que je n'avais pas compris.
    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
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  19. #19
    Membre confirmé Avatar de grisan29
    Homme Profil pro
    ouvrier poseur
    Inscrit en
    Octobre 2006
    Messages
    866
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ouvrier poseur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2006
    Messages : 866
    Points : 520
    Points
    520
    Par défaut
    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
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 75
    Points : 40
    Points
    40
    Par défaut
    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

Discussions similaires

  1. Userform : modifier et supprimer des enregistrements
    Par hylis dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 27/03/2015, 12h00
  2. [MySQL] supprimer des enregistrements de ma base
    Par arti2004 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 26/06/2006, 15h08
  3. Réponses: 3
    Dernier message: 13/06/2006, 14h16
  4. Réponses: 4
    Dernier message: 14/10/2005, 09h54
  5. HELP!Comment supprimer des enregistrements de tables jointes
    Par ROOTPARIS dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 10/06/2004, 16h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo