Microsoft 365 Modification impossible d'une TextBox

NONO14

XLDnaute Impliqué
Bonjour,
J'ai mis en place ces 2 codes qui permettent de la rapatrier les données d'une ListBox dans des TextBox après un clic sur une ligne et ensuite, après modification et en appuyant sur le bouton "Modifier" de remplacer les données existantes dans le TS (t_Noms) de la feuille "List_agents".
Hors, dès que je modifie une TextBox autre que le Nom, la donnée revient systématiquement après tabulation automatique à celle de la ListBox sans la modifier.
Pouvez-vous m'éclairer s'il vous plaît ? Je ne comprends pas.
Merci par avance

Code lorsque l'on clique sur une ligne de la ListBox
VB:
Private Sub Lst_Employ_Click()
'Vérifie si une ligne a été sélectionné
With Me
 With .Lst_Employ
    If .ListIndex <> -1 Then
'On récupère les valeurs de la ligne sélectionnée dans les TextBox
         Me.Txt_Nom.Value = .List(.ListIndex, 1)
         Me.Txt_Code.Value = .List(.ListIndex, 0)
         Me.Txt_Prénom.Value = .List(.ListIndex, 2)
         Me.Txt_Temps.Text = Application.Text(.List(.ListIndex, 3), "[h]:mm")
    End If
  End With
End With
End Sub

Module pour transférer les données modifiées vers le TS
Code:
Sub RemplacerTableau()
Dim Ws As Worksheet
Dim Tbl As ListObject
Dim Cell As Range
Dim CodRec As String

'On définie la feuille de calcul
    Set Ws = Sheets("Liste_agents")
    
'On définie le TS
    Set Tbl = Ws.ListObjects("t_Noms")
    
'On définie le code à rechercher
    CodRec = UfGestTemps.Txt_Code.Value

'On recherche le code dans la 1ère colonne du TS
    Set Cell = Tbl.ListColumns(1).DataBodyRange.Find(What:=CodRec, LookIn:=xlValues, LookAt:=xlWhole)

'Si le code est trouvé, on remplace les données de la ligne
    If Not Cell Is Nothing Then
        Cell.Offset(0, 1).Value = UfGestTemps.Txt_Nom.Value 'On remplace la valeur de la colonne 2
        Cell.Offset(0, 2).Value = UfGestTemps.Txt_Prénom.Value 'On remplace la valeur de la colonne 3
        Cell.Offset(0, 3).Value = UfGestTemps.Txt_Temps.Value 'On remplace la valeur de la colonne 4
    Else
        MsgBox "Code non trouvé"
    End If
End Sub
 

Pièces jointes

  • GestPersonnnel (3).xlsm
    498 KB · Affichages: 6
Solution
Une proposition modifiant le moins possible de choses (seulement 4 lignes de code à ajouter) :

- Ajouter une variable booléenne ayant pour portée le classeur.
VB:
Dim MaJ_en_cours As Boolean

- Mettre à True ladite variable au début de la macro But_ModifP1_Click et la remettre à False à la fin.
VB:
Private Sub But_ModifP1_Click()
'
    MaJ_en_cours = True
    RemplacerTableau
    MaJ_en_cours = False

End Sub

- Ajouter un test sur la valeur de ladite variable au début de la macro Lst_Employ_Click.
VB:
If MaJ_en_cours Then Exit Sub

wDog66

XLDnaute Occasionnel
Bonjour,
Perso, je ne vois pas comment cela fonctionne 🤔
Mais avec le module de classe et les évènements dans l'USF je ne suis pas étonné qu'il y est des interactions non souhaité
Il faudra vous armer de patience et mettre un point d'arrêt F9 là où il faut pour visualiser le déroulement du code avec F8
 

laurent950

XLDnaute Barbatruc
Bonjour

Code:
Private Sub Lst_Employ_Click()
    On Error GoTo ErrorHandler
    
    'Vérifie si une ligne a été sélectionnée dans la ListBox
    With Me.Lst_Employ
        If .ListIndex <> -1 Then
            'On récupère les valeurs de la ligne sélectionnée dans les TextBox
            Me.Txt_Nom.Value = .List(.ListIndex, 1)
            Me.Txt_Code.Value = .List(.ListIndex, 0)
            Me.Txt_Prénom.Value = .List(.ListIndex, 2)
            Me.Txt_Temps.Text = Application.Text(.List(.ListIndex, 3), "[h]:mm")
        End If
    End With
    
    Exit Sub

ErrorHandler:
    MsgBox "Erreur lors de la récupération des données. Veuillez vérifier les valeurs.", vbExclamation
End Sub

Code:
Sub RemplacerTableau()
    Dim Ws As Worksheet
    Dim Tbl As ListObject
    Dim Cell As Range
    Dim CodRec As String

    'On définit la feuille de calcul
    Set Ws = Sheets("Liste_agents")
    
    'On définit le tableau structuré (TS)
    Set Tbl = Ws.ListObjects("t_Noms")
    
    'On définit le code à rechercher dans la première colonne
    CodRec = UfGestTemps.Txt_Code.Value
    
    'On recherche le code dans la première colonne du tableau structuré
    Set Cell = Tbl.ListColumns(1).DataBodyRange.Find(What:=CodRec, LookIn:=xlValues, LookAt:=xlWhole)

    'Si le code est trouvé, on remplace les données de la ligne
    If Not Cell Is Nothing Then
        Ws.Cells(Cell.Row, 2).Value = UfGestTemps.Txt_Nom.Value   'On remplace la valeur de la colonne 2
        Ws.Cells(Cell.Row, 3).Value = UfGestTemps.Txt_Prénom.Value 'On remplace la valeur de la colonne 3
        Ws.Cells(Cell.Row, 4).Value = UfGestTemps.Txt_Temps.Value  'On remplace la valeur de la colonne 4
    Else
        MsgBox "Code non trouvé", vbExclamation
    End If
End Sub
 

NONO14

XLDnaute Impliqué
Bonjour

Code:
Private Sub Lst_Employ_Click()
    On Error GoTo ErrorHandler
   
    'Vérifie si une ligne a été sélectionnée dans la ListBox
    With Me.Lst_Employ
        If .ListIndex <> -1 Then
            'On récupère les valeurs de la ligne sélectionnée dans les TextBox
            Me.Txt_Nom.Value = .List(.ListIndex, 1)
            Me.Txt_Code.Value = .List(.ListIndex, 0)
            Me.Txt_Prénom.Value = .List(.ListIndex, 2)
            Me.Txt_Temps.Text = Application.Text(.List(.ListIndex, 3), "[h]:mm")
        End If
    End With
   
    Exit Sub

ErrorHandler:
    MsgBox "Erreur lors de la récupération des données. Veuillez vérifier les valeurs.", vbExclamation
End Sub

Code:
Sub RemplacerTableau()
    Dim Ws As Worksheet
    Dim Tbl As ListObject
    Dim Cell As Range
    Dim CodRec As String

    'On définit la feuille de calcul
    Set Ws = Sheets("Liste_agents")
   
    'On définit le tableau structuré (TS)
    Set Tbl = Ws.ListObjects("t_Noms")
   
    'On définit le code à rechercher dans la première colonne
    CodRec = UfGestTemps.Txt_Code.Value
   
    'On recherche le code dans la première colonne du tableau structuré
    Set Cell = Tbl.ListColumns(1).DataBodyRange.Find(What:=CodRec, LookIn:=xlValues, LookAt:=xlWhole)

    'Si le code est trouvé, on remplace les données de la ligne
    If Not Cell Is Nothing Then
        Ws.Cells(Cell.Row, 2).Value = UfGestTemps.Txt_Nom.Value   'On remplace la valeur de la colonne 2
        Ws.Cells(Cell.Row, 3).Value = UfGestTemps.Txt_Prénom.Value 'On remplace la valeur de la colonne 3
        Ws.Cells(Cell.Row, 4).Value = UfGestTemps.Txt_Temps.Value  'On remplace la valeur de la colonne 4
    Else
        MsgBox "Code non trouvé", vbExclamation
    End If
End Sub
Bonjour laurent950,
Merci pour votre code, mais j'ai toujours le même problème. Je ne peux que modifier le Nom et pas le reste.
Je cherche de mon côté également.
 

ChTi160

XLDnaute Barbatruc
Re
Passer par les propriétés du tableau structuré genre
VB:
Tbl.ListColumns(2).DataBodyRange.cells(cell.row)=UfGestTemps.Txt_Nom.Value
Non testé lol
Ou passer par un tableau temporaire
Sur lequel on boucle pour chercher le CodeAgent etc etc
Depuis mon téléphone.
Jean marie
 

NONO14

XLDnaute Impliqué
Je n'ai pas réussi à trouver, dès que je modifie le Prénom ou le temps de travail, les données tournent en boucle, elles reviennent à la 1ère saisie sans avoir enregistré les modifications. L'enregistrement se fait à l'aide du bouton "Modifier", sur le même principe qu'un bouton "Valider".
Je vais continuer à chercher, peut-être vais-je avoir une petite lumière qui va s'allumer...
 

NONO14

XLDnaute Impliqué
Voici le code pour remplacer les données dans le TS (dans un module)
VB:
Sub RemplacerTableau()
Dim Ws As Worksheet
Dim Tbl As ListObject
Dim R As ListRow
Dim Found As Boolean

    Set Ws = Sheets("Liste_agents") 'On identifie la feuille de calcul
    Set Tbl = Ws.ListObjects("t_Noms") 'On identifie le TS
   
    Found = False
   
    For Each R In Tbl.ListRows
        If R.Range(1, 1).Value = UfGestTemps.Txt_Code.Value Then 'On recherche le code agent dans le TS
            R.Range(1, 2).Value = UfGestTemps.Txt_Nom.Value 'Si on le trouve, on recopie les données en 2ème colonne du TS
            R.Range(1, 3).Value = UfGestTemps.Txt_Prénom.Value 'Puis le Prénom en 3ème
            R.Range(1, 4).Value = UfGestTemps.Txt_Temps.Value 'Et le temps en 4ème
           
            Found = True
    Exit For
        End If
    Next R
   
    If Not Found Then
        MsgBox "Code agent non trouvé", vbExclamation 'Si le code n'est pas trouvé un message
    End If
End Sub

et celui pour charger les TextBox après un clic sur une ligne de la ListBox
Code:
Private Sub Lst_Employ_Click()
    On Error GoTo ErrorHandler
 
    'Vérifie si une ligne a été sélectionnée dans la ListBox
    With Me.Lst_Employ
        If .ListIndex <> -1 Then
            'On récupère les valeurs de la ligne sélectionnée dans les TextBox
            Me.Txt_Nom.Value = .List(.ListIndex, 1)
            Me.Txt_Code.Value = .List(.ListIndex, 0)
            Me.Txt_Prénom.Value = .List(.ListIndex, 2)
            Me.Txt_Temps.Text = Application.Text(.List(.ListIndex, 3), "[h]:mm")
        End If
    End With
 
    Exit Sub

ErrorHandler:
    MsgBox "Erreur lors de la récupération des données. Veuillez vérifier les valeurs.", vbExclamation
End Sub
 

Pièces jointes

  • GestPersonnnel (3).xlsm
    499.6 KB · Affichages: 4

Discussions similaires

Réponses
49
Affichages
1 K

Statistiques des forums

Discussions
315 083
Messages
2 116 043
Membres
112 641
dernier inscrit
chab77