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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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
    13 169
    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 : 13 169
    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 : 43302
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 Expert Avatar de curt
    Homme Profil pro
    Ingénieur Etudes
    Inscrit en
    Mars 2006
    Messages
    1 579
    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 579
    Par défaut
    Bonsoir Philippe,

    plutôt sympa comme approche. Beau travail !

    Curt

  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
    13 169
    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 : 13 169
    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 averti
    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
    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
    13 169
    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 : 13 169
    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 éclairé Avatar de DenisHen
    Homme Profil pro
    Dessinateur / projeteur
    Inscrit en
    Novembre 2013
    Messages
    415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Yonne (Bourgogne)

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

    Informations forums :
    Inscription : Novembre 2013
    Messages : 415
    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...

  7. #7
    Nouveau candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 3
    Par défaut Bonjour phillipe
    Bonjour phillipe, tout d'abord mercis pour votre tuto qui est excellent, vous avez demandé que l'on vous communique les erreurs, en lançant l'application je reçoit un message d'erreur "sub ou fonction non défini "
    Et il sélectionne Variable dans userform activate pouvez vous m'expliquer ce que j'ai mal fait s'il vous plaît

    Merci d'avance

    F

  8. #8
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 6
    Par défaut
    Bonjour Philippe et merci encore pour cet incroyable travail qui m'a beaucoup aidé, bien qu'on vous l'aie déja dit maintes fois.

    J'ai adapté votre fichie à mon utilisation les fonctions marchent tr`s bien mais j'avais quand même deux questions.

    1) tout d'abord j'ai une ligne qui engendre des erreurs :
    With Me: .cboMember.ListIndex = Me.Tag: End With
    dans le user form activate,
    le programme semble fonctionner corrrectement sans, est-elle nécessaire ?

    2) Je dois en plus du formulaire mettre en place des outils d'analyse de données par exemple ( exemple bête), la somme des âges des membres.
    La commade suppression, supprime la ligne ce qui m'engendre des soucis de #REF dans mes calculs,
    sauriez-vous comment je pourrais contourner le problème ?

    Dites moi si vous avez besoin de mon fichier en pièce jointe pour y voir plus clair.

    Merci d'avance pour votre réponse et encore merci pour cette aide indirectement précieuse !!

  9. #9
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 11
    Par défaut
    Bonjour à tous,
    J'ai une erreur qui apparaît lors de l'enregistrement du fichier en "Excel prenant en charge les macros" :
    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
     
    <?xml version="1.0" encoding="UTF-8" standalone="true"?>
     
    -<recoveryLog xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
     
    <logFileName>error081880_03.xml</logFileName>
     
    <summary>Des erreurs ont été détectées dans le fichier « C:\Users\Anthony\Downloads\UserForm - CRUD (C)reate (R)ead (U)pdate (D)elete - Version 3_2.xlsm »</summary>
     
     
    -<removedRecords summary="Liste des enregistrements supprimés ci-dessous :">
     
    <removedRecord>Enregistrements supprimés: Tri dans la partie /xl/worksheets/sheet1.xml</removedRecord>
     
    </removedRecords>
     
    </recoveryLog>
    Avez-vous une idée du problème lié au format d'enregistrement ?

    Merci d'avance
    Anthony

  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
    13 169
    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 : 13 169
    Billets dans le blog
    53
    Par défaut
    Bonjour Anthony,
    Citation Envoyé par k6s33 Voir le message
    Bonjour à tous,
    J'ai une erreur qui apparaît lors de l'enregistrement du fichier en "Excel prenant en charge les macros" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <?xml version="1.0" encoding="UTF-8" standalone="true"?>
    -<recoveryLog xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
    <logFileName>error081880_03.xml</logFileName>
    <summary>Des erreurs ont été détectées dans le fichier « C:\Users\Anthony\Downloads\UserForm - CRUD (C)reate (R)ead (U)pdate (D)elete - Version 3_2.xlsm »</summary>
    -<removedRecords summary="Liste des enregistrements supprimés ci-dessous :">
    <removedRecord>Enregistrements supprimés: Tri dans la partie /xl/worksheets/sheet1.xml</removedRecord>
    </removedRecords>
    </recoveryLog>
    Avez-vous une idée du problème lié au format d'enregistrement ?
    Merci d'avance
    Anthony
    Hélas non, je n'ai pas encore rencontré ce genre de problème.
    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
    Nouveau candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Octobre 2016
    Messages : 2
    Par défaut
    Bonjour Philippe ,

    Impressionnant ce que tu nous offre merci.

    Je suis partis de votre travail et je l'ai personnaliser pour mes besoins. Tout va bien, mais je bloque sur 2 points
    1) lorsque je cree un nouveau record, j'ai ajouter l'instruction date de creation, et cela fonctionne.
    Private Sub UserForm_Initialize()
    txtDateF.Text = Date
    End Sub

    Ce que je voudrais, ajouter une Date Supression, ET que la ligne avant d'etre supprimer soit copier dans un Onglet Archives. Pourrais-tu me guider?

    2) J'ai fait export/import de ton formulaire, dans mon classeur, et tout a bien ete. Par la suite apres avoir personnalise mon formulaire, j'ai refait la meme procedure dans mon classeur pour avoir un autre formulaire. (Objectif : Mon classeur a plusieurs Onglets, et chaque Onglets ont leur formulaire. Mon probleme se situe avec un code d'erreur quand j'ouvre mon 2 ieme formulaire : J'ai alors ce message d'erreur ERREUR DE COMPILATION, NOM AMBIGUE DETECTE : Status ... alors je dois mettre ces lignes en message
    'Enum Status
    'Consultation = 0: Modify = 1: NewRec = 2: Remove = 3
    'End Enum
    Pourquoi? Je cherche et je compare, et je ne vois pas.

    Indice : J'ai modifier le R00, pour le ID, car chaque formulaire aura un ID different. (C-A-D : C00, D00 .. )

    Private Sub ReadRecord(ByVal RecordNumber As Long)
    ' Lecture de l'enregistrement
    RecordNumber = RecordNumber + 1
    With rng
    Me.txtName = .Cells(RecordNumber, 2)
    Me.txtDateF = .Cells(RecordNumber, 3)
    If UCase(.Cells(RecordNumber, 4)) = "F" Then Me.optFemale.Value = True Else Me.optMale = True
    Me.frmMember.Caption = "Fiche " & Format(.Cells(RecordNumber, 1), "C000")
    End With
    End Sub

    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 = "\C000" ' Format
    End With
    .Cells(RecordNumber, 2) = Me.txtName
    .Cells(RecordNumber, 3) = Me.txtDateF
    .Cells(RecordNumber, 4) = IIf(Me.optFemale = True, "Inactif", "Actif")
    .Cells(RecordNumber, 5) = Me.txtName
    End With
    Me.cboMember.ListIndex = CurrentRecord
    End Sub


    Merci a l'avance
    Michel

  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
    13 169
    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 : 13 169
    Billets dans le blog
    53
    Par défaut
    Bonjour Michel,
    Merci pour ton appréciation
    Mon probleme se situe avec un code d'erreur quand j'ouvre mon 2 ieme formulaire : J'ai alors ce message d'erreur ERREUR DE COMPILATION, NOM AMBIGUE DETECTE : Status ... alors je dois mettre ces lignes en message
    'Enum Status
    'Consultation = 0: Modify = 1: NewRec = 2: Remove = 3
    'End Enum
    Pourquoi? Je cherche et je compare, et je ne vois pas.
    Le message d'erreur signifie dans ce cas précis qu'il y a une constante énumérée qui porte le même nom dans le même projet (classeur).
    Il faut faire précéder Enum par Private, comme ci-dessous et cela devrait fonctionner.
    Je ne garanti pas qu'il n'y aura pas une autre procédure portant le même nom car lors de mes tests, je n'avais qu'un seul UserForm dans le projet.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Enum Status
     Consultation = 0: Modify = 1: NewRec = 2: Remove = 3
    End Enum
    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
    Nouveau candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Octobre 2016
    Messages : 2
    Par défaut
    Cela fonctionne maintenant.

    Merci de m'avoir expliquer la cause et la correction a apporter.
    Car je n'aurais pense a cela, une notion que je ne connaissais pas encore, pourtant logique.

  14. #14
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2013
    Messages : 4
    Par défaut fichiers compléments
    Bonjour,

    Tout d'abord, je vous félicite pour ce travail remarquable.
    Vous avez parlé de fichiers compléments. Pourrez-vous svp m'indiquer l'endroit où je peux les télécharger?
    Merci

  15. #15
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 169
    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 : 13 169
    Billets dans le blog
    53
    Par défaut
    Bonjour DameG,
    Tout d'abord, je vous félicite pour ce travail remarquable
    Merci pour ton appréciation.

    Vous avez parlé de fichiers compléments. Pourrez-vous svp m'indiquer l'endroit où je peux les télécharger?
    Cela ne me dit rien. Pourrais-tu me rafraîchir la mémoire en m'indiquant le lien de la discussion où j'en parle ?
    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

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