Msgbox ne se ferme qu'au 2e clic [RESOLU]

cathodique

XLDnaute Barbatruc
Bonjour:),

Faisant suite à ce fil https://www.excel-downloads.com/threads/formulaire-de-modification.20027552/

J'ai eu des propositions qui ne correspondent pas exactement à mes attentes.
Je dois aussi bien comprendre les codes pour essayer de les adapter à mes besoins.
Sur mon userform, une textbox récupère un numéro de facture au clic dans une listbox.
Le code ci-dessous ne plante mais je ne comprends pas pourquoi, je dois cliquer à 2 reprises sur ok pour que le message (MsgBox) se ferme.
VB:
Private Sub ComboBox2_Change()
   If Me.TextBox2 <> "" Then 'signifie aussi: aucune ligne sélectionnée dans la Listbox
      Me.TextBox3.Value = ComboBox2.List(Me.ComboBox2.ListIndex, 1)
      Me.TextBox9.Value = ComboBox2.List(Me.ComboBox2.ListIndex, 2)
   Else
      Me.ComboBox2="": Me.TextBox3 = "": Me.TextBox9 = ""
      MsgBox "Sélectionnez la ligne à modifier.", vbCritical, "ERREUR DE MANIPULATION"
   End If
End Sub
Merci pour votre précieuse aide.

Bon dimanche.

ps: le fichier joint est en cours de correction.
 

Pièces jointes

  • Modifications - Copie.xlsm
    85 KB · Affichages: 12

youky(BJ)

XLDnaute Barbatruc
Bonjour Cath,
combobox2_change interviens dès changement...
Comme tu as combobox2.clear la macro est re-excécutée
Un conseil teste en mettant un point d'arrêt en ligne combobox2.clear
Fait tourner le formulaire jusqu'au retour VBA et presse F8 autant de fois
que tu veux pour voir l'exécution et ou va la macro.
Pour ma part pour résoudre un cas comme cela je déclare en tête de Module
Cela peut servir aussi pour d'autres controles
Public kit As Boolean
et en macro
Private Sub ComboBox2_Change()
if kit=true then exit sub
If Me.TextBox2 <> "" Then
Me.TextBox3.Value = ComboBox2.List(Me.ComboBox2.ListIndex, 1)
Me.TextBox9.Value = ComboBox2.List(Me.ComboBox2.ListIndex, 2)
Else
kit=true
Me.ComboBox2.Clear: Me.TextBox3 = "": Me.TextBox9 = ""
kit=false
MsgBox "Sélectionnez la ligne à modifier.", vbCritical, "ERREUR DE MANIPULATION"
End If
End Sub
Bruno
 

cathodique

XLDnaute Barbatruc
Bonjour youky(BJ):),

Effectivement, en utilisant F8 j'ai remarqué la double exécution de la procédure change.
J'ai donc modifié la procédure, j'ai utilisé la clic. ça semble donné un bon résultat.
VB:
Private Sub ComboBox2_Click()
If Me.TextBox2 = "" Then
         MsgBox "Sélectionnez la ligne à modifier.", vbCritical, "ERREUR DE MANIPULATION"
         Me.ComboBox2 = ""
      Exit Sub
   Else
      Me.TextBox3.Value = ComboBox2.List(Me.ComboBox2.ListIndex, 1)
      Me.TextBox9.Value = ComboBox2.List(Me.ComboBox2.ListIndex, 2)
   End If
End Sub

Merci pour ta solution que je vais tester et surement adopter.

Permets-moi de te suggérer l'utilisation des balises de code afin que l'édition soit comme celle de ci-dessus.
[ code=VB ]ici ton code[ /code ] qui se fait au moment de l'édition du code (image), sinon il faut supprimer les espaces entre-crochets.
Balise de code VB.JPG


Encore merci. Bon dimanche.
 

laurent950

XLDnaute Accro
Bonjour,

la solution ' Solution 1
VB:
Private Sub ComboBox2_Change()
    If Me.TextBox2 <> "" Then
        Me.TextBox3.Value = ComboBox2.List(Me.ComboBox2.ListIndex, 1)
        Me.TextBox9.Value = ComboBox2.List(Me.ComboBox2.ListIndex, 2)
    Else
        If Me.ComboBox2.Value <> "" Then
        Application.EnableEvents = False ' => désactive les événements
        ' Le code ...
            Me.ComboBox2.Clear: Me.TextBox3 = "": Me.TextBox9 = ""
            MsgBox "Sélectionnez la ligne à modifier.", vbCritical, "ERREUR DE MANIPULATION"
        Application.EnableEvents = True ' => réactive les événements
        End If
    End If
End Sub
 
Dernière édition:

cathodique

XLDnaute Barbatruc
Youky(BJ):),Laurent950:),

Merci beaucoup. J'ai adopté la solution Bruno comme ci-dessous
VB:
Private Sub ComboBox2_Change()
   If MAJ = True Then Exit Sub
   If Me.TextBox2 <> "" Then
      Me.TextBox3.Value = ComboBox2.List(Me.ComboBox2.ListIndex, 1)
      Me.TextBox9.Value = ComboBox2.List(Me.ComboBox2.ListIndex, 2)
   Else
      MAJ = True
      Me.ComboBox2.Clear: Me.TextBox3 = "": Me.TextBox9 = ""
      MAJ = False
      MsgBox "Sélectionnez la ligne à modifier.", vbCritical, "ERREUR DE MANIPULATION"
   End If
End Sub
ps: je n'ai encore testé la proposition de Laurent.
Bon dimanche.
 

laurent950

XLDnaute Accro
Re :
Une autres solution
la solution ' Solution 2
VB:
Private Sub ComboBox2_Change()
With Me
    If .TextBox2 <> "" Then
        .TextBox3.Value = .ComboBox2.List(.ComboBox2.ListIndex, 1)
        .TextBox9.Value = .ComboBox2.List(.ComboBox2.ListIndex, 2)
    Else
        If .ComboBox2 <> Empty Then
                .ComboBox2.Clear: .TextBox3 = "": .TextBox9 = ""
            MsgBox "Sélectionnez la ligne à modifier.", vbCritical, "ERREUR DE MANIPULATION"
        End If
    End If
End With
End Sub
 
Dernière édition:

cathodique

XLDnaute Barbatruc
Re :
Une autres solution
la solution ' Solution 2
VB:
Private Sub ComboBox2_Change()
With Me
    If .TextBox2 <> "" Then
        .TextBox3.Value = .ComboBox2.List(.ComboBox2.ListIndex, 1)
        .TextBox9.Value = .ComboBox2.List(.ComboBox2.ListIndex, 2)
    Else
        If .ComboBox2 <> Empty Then
                .ComboBox2.Clear: .TextBox3 = "": .TextBox9 = ""
            MsgBox "Sélectionnez la ligne à modifier.", vbCritical, "ERREUR DE MANIPULATION"
        End If
    End If
End With
End Sub
Merci beaucoup, ça fonctionne aussi bien que les codes proposés.

Bonne journée.;)