Microsoft 365 VBA - Bouton ne marche pas uniquement la première fois

Kaoler

XLDnaute Nouveau
Bonjour à tous,

Je débute en VBA et j'essaie de créer un classeur Excel ayant pour but de gérer une base de données RH (ressources humaines).
Les différents renseignements sont dans un onglet de mon fichier Excel "Base de données".

J'utilise un userform me permettant de modifier les enregistrements de la base de données (qui ne peut pas être modifiée en directe).

Le fonctionnement est le suivant :
Dans un premier temps, j'utilise une listbox dans l'userform pour que l'on puisse choisir le profil de la personne que l'on souhaite modifier.
Lorsque l'on clique sur une ligne de la listbox, les champs de mon userform sont alimentés automatiquement par les données de la personne recherchée situées dans l'onglet excel "Base de données".

Ensuite, on a alors la possibilité de modifier le contenu des champs de l'userform (nom, prénom, etc.) et de cliquer sur un bouton de commande "valider" pour que mon onglet "Base de données" sur Excel se mette à jour avec les données de l'userform modifiées.

Cependant, lorsque que je clique pour la première fois sur le bouton "valider", ma macro ne marche pas (à l'exception du msgbox qui lui s'affiche bien) : ma base de données ne se met pas à jour et je perds mes modifications saisies dans l'userform. Je suis obligé de refaire la manipulation une deuxième fois en gardant l'userform ouvert pour que cela fonctionne. Cela marche également toutes les fois suivantes du moment que mon userform reste ouvert.
J'ai beau cherché, je ne trouve pas l'explication. Je pense que c'est lié à la listbox car je n'avais pas ce "bug" avant de l'intégrer.

Pouvez-vous m'aider ?

Merci d'avance

Le code qui me permet d'alimenter mon userform selon la sélection sur la listbox :
VB:
Private Sub Listbox_Click()

Dim LigneBDD As Integer
LigneBDD = Me.Listbox.ListIndex + 3 'Cherche le numéro de ligne correspondant dans l'onglet excel (+3 car 3 lignes en entêtes de colonnes)

    'récupération des informations de la BDD pour remplir le formulaire
   
    Sheets("Base de données").Activate
    Cells(LigneBDD, 1).Select
   
    FormulaireModif.Txtmatricule1 = Cells(LigneBDD, 1)
    FormulaireModif.TxtNom = Cells(LigneBDD, 2) 'nom
    FormulaireModif.TxtPrénom = Cells(LigneBDD, 3) 'prénom
    FormulaireModif.CBXGenre = Cells(LigneBDD, 4) 'genre
    FormulaireModif.TxtDateNaissance = Cells(LigneBDD, 5) 'date de naissance
    FormulaireModif.TxtAdresse = Cells(LigneBDD, 6) ' adresse
    FormulaireModif.CBXVille = Cells(LigneBDD, 7) 'ville
    FormulaireModif.TxtMail = Cells(LigneBDD, 8) 'mail
    FormulaireModif.TxtTel = Cells(LigneBDD, 9) 'téléphone
    FormulaireModif.CBXDiplôme = Cells(LigneBDD, 10) 'diplôme
    FormulaireModif.CBXSitupro = Cells(LigneBDD, 11) 'situation professionnelle
   
End Sub

Le code associé à mon bouton de commande "Valider" :
VB:
Private Sub Btnvalider1_Click()

    Sheets("Base de données").Activate
 
    'Affectation des valeurs du formulaire'
   
    ActiveCell.Value = Me.Txtmatricule1.Value 'Matricule
    ActiveCell.Offset(0, 1).Value = Me.TxtNom.Value 'nom
    ActiveCell.Offset(0, 2).Value = Me.TxtPrénom.Value 'Prénom
    ActiveCell.Offset(0, 3).Value = Me.CBXGenre.Value 'Genre
    ActiveCell.Offset(0, 4).Value = CDate(TxtDateNaissance.Value) 'date de naissance
    ActiveCell.Offset(0, 5).Value = Me.TxtAdresse.Value 'adresse
    ActiveCell.Offset(0, 6).Value = Me.CBXVille.Value 'ville
    ActiveCell.Offset(0, 7).Value = Me.TxtMail.Value 'mail
    ActiveCell.Offset(0, 8).Value = Me.TxtTel.Value 'Téléphone
    ActiveCell.Offset(0, 9).Value = Me.CBXDiplôme.Value 'Diplôme
    ActiveCell.Offset(0, 10).Value = Me.CBXSitupro.Value 'Situation professionnelle

 MsgBox "La modification a bien été effectuée.", VB
 
End Sub
 

ChTi160

XLDnaute Barbatruc
Re
Ton problème vient surement du fait que tu alimentes ta "ListBox" par le propriété "RowSource"
il ne permet pas la modification de la plage , ca occasionne le retour a la ListBox
Tu devrais passer par Un tableau !
dans l'attente
jean marie
 

fanch55

XLDnaute Barbatruc
Bonsoir à tous,
Salut Jean-Marie
C'est normal, la listbox ayant en refsource la table listebénévoles,
quand vous mettez à jour une ligne de cette table, c'est comme si vous faisiez un click sur la ligne correspondante de la listbox, ce qui recharge le formulaire tel que le code est fait ...
Un palliatif : dans la sub ci-dessous, renseignez le Tag de la listbox
VB:
Private Sub Btnvalider1_Click()

    Sheets("Base de données").Activate
 
    'Affectation des valeurs du formulaire'
    Listbox.Tag = "Valider"
    ActiveCell.Value = Me.Txtmatricule1.Value 'Matricule
    ActiveCell.Offset(0, 1).Value = Me.TxtNom.Value 'nom
    ActiveCell.Offset(0, 2).Value = Me.TxtPrénom.Value 'Prénom
    ActiveCell.Offset(0, 3).Value = Me.CBXGenre.Value 'Genre
    ActiveCell.Offset(0, 4).Value = CDate(TxtDateNaissance.Value) 'date de naissance au format JJ/MM/YYYY Me.Format(Me.TxtDateNaissance.Value, "DD/MM/YYYY")
    ActiveCell.Offset(0, 5).Value = Me.TxtAdresse.Value 'adresse
    ActiveCell.Offset(0, 6).Value = Me.CBXVille.Value 'ville
    ActiveCell.Offset(0, 7).Value = Me.TxtMail.Value 'mail
    ActiveCell.Offset(0, 8).Value = Me.TxtTel.Value 'Téléphone
    ActiveCell.Offset(0, 9).Value = Me.CBXDiplôme.Value 'Diplôme
    ActiveCell.Offset(0, 10).Value = Me.CBXSitupro.Value 'Situation professionnelle
    Listbox.Tag = ""

 MsgBox "Modifications effectuées.", VB
 
   
End Sub

puis dans l'événement click de la listbox , ne faites rien si le Tag n'est pas vide :
Code:
Private Sub Listbox_Click()

'Déclaration des variables

Dim LigneBDD As Integer
If Listbox.Tag = "" Then
    LigneBDD = Me.Listbox.ListIndex + 3 'Cherche le numéro de ligne dans la listbox

    'récupération des informations de la BDD pour remplir le formulaire
   
    Sheets("Base de données").Activate
    Cells(LigneBDD, 1).Select
   
    FormulaireModif.Txtmatricule1 = Cells(LigneBDD, 1)
    FormulaireModif.TxtNom = Cells(LigneBDD, 2) 'nom
    FormulaireModif.TxtPrénom = Cells(LigneBDD, 3) 'prénom
    FormulaireModif.CBXGenre = Cells(LigneBDD, 4) 'genre
    FormulaireModif.TxtDateNaissance = Cells(LigneBDD, 5) 'date de naissance
    FormulaireModif.TxtAdresse = Cells(LigneBDD, 6) ' adresse
    FormulaireModif.CBXVille = Cells(LigneBDD, 7) 'ville
    FormulaireModif.TxtMail = Cells(LigneBDD, 8) 'mail
    FormulaireModif.TxtTel = Cells(LigneBDD, 9) 'téléphone
    FormulaireModif.CBXDiplôme = Cells(LigneBDD, 10) 'diplôme
    FormulaireModif.CBXSitupro = Cells(LigneBDD, 11) 'situation professionnelle
End If
End Sub
Y'a d'autres moyens ...
 

ChTi160

XLDnaute Barbatruc
Re
Merci fanch
je penserai à utiliser cette astuce !
j'utilise beaucoup le Tag des Contrôles , mais pas dans ce cas de Figure !
merci encore
édit : oupss pas vue Lol
Bonsoir mapomme
Bonne fin de Soirée
jean marie
 

ChTi160

XLDnaute Barbatruc
Bonjour Kaoler
Bonjour mapomme , le Forum
mapomme à quoi sert le :
VB:
Application.EnableEvents = False / True
dans la procédure.
je crois que ça n'a pas d'effet lors du changement dans une ListBox (dans ce cas )!
Bonne journée
jean marie
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @ChTi160 :),

Pauvre de moi! Âne que je suis! Moi, être Gros bêta. Aller utiliser Application.EnableEvents pour un userform !!!!
Je ne sais pas ce qui m'a pris 🙃🤪😡
Je vais aller me faire soigner et très vite dès demain.
Je m'en vais détruire le message débile de ce pas.
Merci de me l'avoir fait remarquer (avec délicatesse) ;)
 

Statistiques des forums

Discussions
315 093
Messages
2 116 136
Membres
112 667
dernier inscrit
foyoman