Gestion Evenements userForm [RESOLU]

cathodique

XLDnaute Barbatruc
Bonjour:),

Je reviens vers vous afin de me proposer une solution.

Au choix dans combobox1, la Listbox récupère les lignes correspondantes.

Au clic dans la Listbox sur une ligne, les données sont transmises aux différents contrôles (combobox et textbox).

Pour certains on peut en modifier le contenu. Ensuite au clic sur le bouton « modifier ligne », les données sont transmises à la ligne sélectionnée dans la listbox.

En suivant le déroulement au ‘’pas à pas’’, j’ai remarqué que la procédure ListBox1_Clic était sollicitée. Du coup les modifications ne se faisaient pas dans la listbox. Je n’ai pas compris pourquoi cet évènement est déclenché car je n’ai pas effectué de clic dans la listbox.

J’ai ajouté un booléen pour sortir de cet évènement. Ainsi, les données sont bien mises à jour dans la listbox. Cependant, en cliquant sur une autre ligne les données ne sont plus récupérés dans les contrôles, ce qui est normal à cause du booléen. Comment solutionner ce problème. Je tourne en rond.

Merci pour votre aide.

Edit: cette discussion est dans la continuité de cette discussion
 

Pièces jointes

  • Modifications - Copie (2).xlsm
    95.2 KB · Affichages: 27

cathodique

XLDnaute Barbatruc
Bonjour Cath
le Fil ,le Forum
j'ai constaté ceux ci
en remplacant :

par
Bonjour Jean Marie:),

Merci beaucoup de me l'avoir signalé. En fait, je suis pas encore arrivé à ce bouton (dont le code est de Boisgontier que salue).
Le bouton auquel fait référence le code que tu me signales et pour la corrections des lignes correspondantes dans la bd.

Mon problème concerne le bouton "MODIFIER LIGNE", ce dernier transfère les données vers la ligne sélectionnée dans la listbox.
Il me semble que le fait de modifier une ligne par code est assimilé à l'évènement ListBox1_Clic.

Je ne parviens pas à résoudre ce problème. En mettant au début du code: If kit = True Then Exit Sub
La ligne est modifiée, mais quand je clique sur une autre ligne les données de cette ligne ne sont pas transmises aux différents contrôles correspondants pour pouvoir les modifier s'il y a lieu.

Merci encore d'être toujours présent.

Bonne journée;).
 

cathodique

XLDnaute Barbatruc
Re
le fichier à tester
jean marie
Merci beaucoup pour la célérité de ton retour. Mais c'est identique au résultat que j'ai obtenu.
Fait cette manipulation pour te rendre compte:
1- choisit une facture en combobox1 (ex: 3)
2- sélectionne une ligne (ex:1)
3-effectue des modifications des contrôles (ex: un seul, le montant)
4-valide avec le bouton "modifier ligne" (la ligne est modifiée - Contrôle montant aussi)
5-clique sur une autre ligne: là les données de la ligne sélectionnée ne sont pas transmises aux différents contrôles (comboboxs et textboxs).

C'est ça mon problème présentement.
 

ChTi160

XLDnaute Barbatruc
Re
tu as teste le fichier
tu dis
Le bouton auquel fait référence le code que tu me signales et pour la corrections des lignes correspondantes dans la bd.
chez moi ça bugger donc j'ai modifié avant d'aller plus loin!
tu dis :
Il me semble que le fait de modifier une ligne par code est assimilé à l'évènement ListBox1_Clic.
ça je ne l'ai pas constaté , désolé?????
j'espere que JB va passe par là pour régler tout ça !
je crois que j'ai encore rien compris Lol
jean marie
 

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Bonjour,

Dans l'exemple simple joint, j'ai reproduit le problème

Code:
Option Compare Text
Dim TblBD()
Private Sub UserForm_Initialize()
   Set Rng = [A2:B10]
   TblBD = Rng.Value
   Me.ComboBox1.List = Array("*", "Lyon", "Paris")
   Me.ComboBox1.ListIndex = 0        ' déclenche l'événement Click ComboBox
   'Me.ListBox1.ListIndex = 0        ' déclenche l'événement Click ListBox
End Sub

Private Sub ComboBox1_click()
  Dim Tbl(): n = 0
  For i = 1 To UBound(TblBD)
    If TblBD(i, 2) Like Me.ComboBox1 Then
      n = n + 1: ReDim Preserve Tbl(1 To 2, 1 To n)
      For k = 1 To UBound(TblBD, 2): Tbl(k, n) = TblBD(i, k): Next k
    End If
  Next i
  Me.ListBox1.Column = Tbl
End Sub

Private Sub ListBox1_click()
   MsgBox "coucou"
End Sub

Private Sub B_modif_Click()
  Position = Me.ListBox1.ListIndex
  'Me.ListBox1.ListIndex = -1          ' si on active cette ligne, plus de problème d'événement endogène
  Me.ListBox1.List(Position, 0) = "xx"   ' déclenche l'événement Click ListBox
End Sub

-Il faut mémoriser la position de l'élément cliqué dans la ListBox: Position=ListBox1.ListIndex
-Supprimer la sélection avec ListBox1.Listindex=-1
-Faire la modif dans la ListBox : Me.ListBox1.List(position,x)="xxxx"

Boisgontier
 

Pièces jointes

  • EvenementsEndogenes.xls
    56 KB · Affichages: 29

cathodique

XLDnaute Barbatruc
Re
On peut modifier le Montant ?
jean marie
On ne peut modifier que le montant "dépenses" ou "recettes" suivant le cas.
Dans mon précédent post#5, je t'avais informé que j'en étais seulement au codage du bouton "modifier ligne", c-à-d pour modifier la listbox.
Je ne suis pas encore arrivé au bouton "VALIDER LES MODIFCATIONS". Qui modifie les lignes de la listbox sur la feuille comptes.
Je vais refaire le débogage au pas à pas et reviens te dire ce qu'il en est.

@+
 

cathodique

XLDnaute Barbatruc
Bonjour,

Dans l'exemple simple joint, j'ai reproduit le problème

Code:
Option Compare Text
Dim TblBD()
Private Sub UserForm_Initialize()
   Set Rng = [A2:B10]
   TblBD = Rng.Value
   Me.ComboBox1.List = Array("*", "Lyon", "Paris")
   Me.ComboBox1.ListIndex = 0        ' déclenche l'événement Click ComboBox
   'Me.ListBox1.ListIndex = 0        ' déclenche l'événement Click ListBox
End Sub

Private Sub ComboBox1_click()
  Dim Tbl(): n = 0
  For i = 1 To UBound(TblBD)
    If TblBD(i, 2) Like Me.ComboBox1 Then
      n = n + 1: ReDim Preserve Tbl(1 To 2, 1 To n)
      For k = 1 To UBound(TblBD, 2): Tbl(k, n) = TblBD(i, k): Next k
    End If
  Next i
  Me.ListBox1.Column = Tbl
End Sub

Private Sub ListBox1_click()
   MsgBox "coucou"
End Sub

Private Sub B_modif_Click()
  Position = Me.ListBox1.ListIndex
  'Me.ListBox1.ListIndex = -1          ' si on active cette ligne, plus de problème d'événement endogène
  Me.ListBox1.List(Position, 0) = "xx"   ' déclenche l'événement Click ListBox
End Sub

-Il faut mémoriser la position de l'élément cliqué dans la ListBox: Position=ListBox1.ListIndex
-Supprimer la sélection avec ListBox1.Listindex=-1
-Faire la modif dans la ListBox : Me.ListBox1.List(position,x)="xxxx"

Boisgontier
Merci beaucoup Jacques. J'espère comprendre ton code pour l'adapter à mon cas.
Très gentil de ta part.

Bonne journée.
 

cathodique

XLDnaute Barbatruc
-Il ne faut pas qu'un élément de la ListBox soit sélectionné lorqu'on modifie la ListBox (me.ListBox1.ListIndex=-1)
Boisgontier
J'avoue ne pas comprendre. Il faut bien que je sélectionne une ligne pour la modifier. Voici, comment j'ai corrigé mon code, mais ça ne fonctionne pas, la ligne n'est pas modifiée. Merci de me dire ce qui ne va pas.
VB:
Private Sub Cmd_Modif_Click()
   Dim lig As Byte, col As Byte, Nblig As Byte, Position As Byte
 
   If Me.ListBox1.ListCount >= 1 Then
      'Si aucune ligne sélectionnée sortir
      If Me.ListBox1.ListIndex = -1 Then
         MsgBox "Sélectionnez la ligne à modifier!", vbCritical, "CHOIX LIGNE A MODIFIER"
         Exit Sub
      Else
      Position = Me.ListBox1.ListIndex
         'modification date pour toutes les lignes
         For lig = 0 To Me.ListBox1.ListCount - 1
            Me.ListBox1.List(lig, 0) = Me.TextBox1
         Next lig

         '      Me.ListBox1.List(ListBox1.ListIndex, 1) = Me.TextBox2 'n°ecriture
         Me.ListBox1.List(Position, 2) = Me.ComboBox2  'code compte
         Me.ListBox1.List(Position, 3) = Me.TextBox3   'libellé
         Me.ListBox1.List(Position, 4) = Me.ComboBox3   'initiateur
       
         'utilisation textbox4 ou 5 suivant opération
         If Me.TextBox8 = "Dépenses" Then
            Me.ListBox1.List(Position, 5) = Me.TextBox4   'dépenses
            Me.ListBox1.List(Position, 6) = ""   'recettes
         Else
            Me.ListBox1.List(Position, 5) = ""   'dépenses
            Me.ListBox1.List(Position, 6) = Me.TextBox5   'recettes
         End If
       
         Me.ListBox1.List(Position, 7) = Me.TextBox6   'commentaires
       
         'calcul total facture
         Call TotalFacture
         Me.TxtCtrlMontant = TotalFact
       
         'report total dans listbox pour toutes les lignes
         For lig = 0 To Me.ListBox1.ListCount - 1
            Me.ListBox1.List(lig, 8) = Me.TxtCtrlMontant
         Next lig
       
         'Me.ListBox1.List(Position, 8) = TotalFact 'total ecritures
         Me.ListBox1.List(Position, 9) = Me.TextBox8   'type operations
         Me.ListBox1.List(Position, 10) = Me.TextBox9   'montant budget/previsionnel
         Me.ListBox1.List(Position, 11) = Me.TextBox10   'banque
         Me.ListBox1.List(Position, 12) = Me.NoLig   'N° de ligne dans bd

      End If
   End If

   If Me.TxtCtrlMontant = Me.TextBox7 Then
   Me.Cmd_Valider.Enabled = True
   End If

   ''   If Me.TextBox7 = Me.TxtCtrlMontant Then Me.Cmd_Valider.Enabled = True

End Sub
 

Si...

XLDnaute Barbatruc
Salut

Jaques, tu as raison d'insister sur une non sélection d'item de la liste. :)

Cela peut aussi se faire simplement *avec la propriété .Clear avant sa ré-initialistion.
VB:
Private Sub ComboBox1_click()
  Dim Tbl(): n = 0
  ListBox1.Clear  'pas d'item sélectionné ensuite
  For i = 1 To UBound(TblBD)
'…
End Sub
Private Sub ListBox1_click()
  MsgBox ListBox1
End Sub
donc la dernière macro
VB:
Private Sub B_modif_Click()
  Position = Me.ListBox1.ListIndex
  'Me.ListBox1.ListIndex = -1  ' si on active cette ligne, plus de problème d'événement endogène
  Me.ListBox1.List(Position, 0) = "xx"  ' déclenche l'événement Click ListBox
End Sub
peut être supprimée
 

cathodique

XLDnaute Barbatruc
Salut

Jaques, tu as raison d'insister sur une non sélection d'item de la liste. :)

Cela peut aussi se faire simplement *avec la propriété .Clear avant sa ré-initialistion.
VB:
Private Sub ComboBox1_click()
  Dim Tbl(): n = 0
  ListBox1.Clear  'pas d'item sélectionné ensuite
  For i = 1 To UBound(TblBD)
'…
End Sub
Private Sub ListBox1_click()
  MsgBox ListBox1
End Sub
donc la dernière macro
VB:
Private Sub B_modif_Click()
  Position = Me.ListBox1.ListIndex
  'Me.ListBox1.ListIndex = -1  ' si on active cette ligne, plus de problème d'événement endogène
  Me.ListBox1.List(Position, 0) = "xx"  ' déclenche l'événement Click ListBox
End Sub
peut être supprimée
Merci Si...
Cependant tu réponds à l'exemple de Jacques pas au mien.
J'avoue ne pas comprendre cette astuce, et surtout l'adapter à mon code.

Encore merci.
 

Discussions similaires

Statistiques des forums

Discussions
312 173
Messages
2 085 937
Membres
103 052
dernier inscrit
nizar0007