Vba userform et macro problème

Résolu
Bonjour,

J'ai un petit soucis avec mes userform et ma macro et là je ne sais plus quoi tester alors j'espère que quelqu'un pourra m'aider.

J'ai 5 userforms dans mon fichier. Le premier sert à rentrer des informations sur une fiche, le second à répondre à une question, le troisième à écrire des commentaires, le quatrième à rentrer d'autres informations et le dernier à quitter ou à revenir sur le premier. Le seul problème que j'ai c'est que si je veux quitter le premier directement je n'arrive pas sur le dernier userform il va m'afficher quand même les autres entre. alors j'ai essayé de mettre dans le code du bouton quitter qu'il ouvre le dernier userform mais il m'ouvre quand même les autres ensuite, après j'ai essayé dans le code général ça me le fermi bien mais le problème c'est que ça ne m'ouvrai plus les autres quand je faisiat continuer. Alors ça doit être un truc tt bête mais bon je ne sais pas. J'espère que vous avez compri mon problème je vous met les code du premier formulaire et le code général.

code formulaire identification (1er) :
Option Explicit
Private Sub DateEr_Change()
Dim Valeur As Byte
DateEr.MaxLength = 10 'nb caractères maxi autorisé dans le textbox
Valeur = Len(DateEr)
If Valeur = 2 Or Valeur = 5 Then DateEr = DateEr & "/"
End Sub
Private Sub DateI_Change()
Dim Valeur As Byte
DateI.MaxLength = 10 'nb caractères maxi autorisé dans le textbox
Valeur = Len(DateI)
If Valeur = 2 Or Valeur = 5 Then DateI = DateI & "/"
End Sub
Private Sub Continuer_Click()
Dim Reponse
Dim MSG
Range("a1").Select
Ligne = Identification.NumFiche.Value
'Ensuite pour vérifier que c'est bien une date qui a été saisie
If Not IsDate(DateEr) Then
MsgBox "Format incorrect"
DateEr = ""
Exit Sub
Else
End If
If Not IsDate(DateI) Then
MsgBox "Format incorrect"
DateI = ""
Exit Sub
Else
End If
If Me.DateEr.Value = "" And Me.Service.Value = "" And Me.Fonction.Value = "" And Me.Concerne.Value = "" And Me.DateI.Value = "" And Me.Indice.Value = "" Then
MsgBox "Il faut que tout les champs soit remplit"
Exit Sub
Else

If Sheets("Saisie initiale").Cells(Ligne + 3, 1).Text = "" Then
If Sheets("Saisie initiale").Cells(Ligne + 2, 1).Text = "" Then
MsgBox "Vous avez oublié de saisir une fiche de signalement" & Chr(13) & "Verifiez vos references", vbCritical
Exit Sub
End If
GoTo valider

Else

MSG = "Attention, Vous avez deja saisie des données !!"
MSG = MSG & Chr(13) & "Voulez Vous modifier les données du formulaire N° " & Sheets("Saisie initiale").Cells(Ligne + 3, 1).Text & " ?"
Reponse = MsgBox(MSG, vbYesNo)
If Reponse = vbYes Then
If Sheets("Saisie initiale").Cells(Ligne + 3, 1).Value = Me.NumFiche.Value Then
GoTo valider
Else
MsgBox "Pour pouvoir modifier, Il faut que se soit le Meme!!!"
Exit Sub
End If
Else
Exit Sub
End If
End If
End If

Exit Sub

valider:
Sheets("Saisie initiale").Cells(Ligne + 3, 1).Value = UCase(Me.NumFiche.Value)
Sheets("Saisie initiale").Cells(Ligne + 3, 2).Value = UCase(Me.Indice.Value)
Sheets("Saisie initiale").Cells(Ligne + 3, 4).Value = CDate(Me.DateEr.Value)
Sheets("Saisie initiale").Cells(Ligne + 3, 5).Value = UCase(Me.Fonction.Value)
Sheets("Saisie initiale").Cells(Ligne + 3, 6).Value = UCase(Me.Service.Value)
Sheets("Saisie initiale").Cells(Ligne + 3, 7).Value = UCase(Me.Concerne.Value)
Sheets("Saisie initiale").Cells(Ligne + 3, 8).Value = CDate(Me.DateI.Value)
Unload Me
Load Questions1
End Sub

Private Sub Quitter_Click()
Unload Identification
NombreQuestion = 0
End Sub

code général :
Option Explicit

Public Ligne As Integer
Public NombreQuestion As Integer
Public NumQuestion As Integer

Sub Saisie()
Dim section
Dim Reponse

NombreQuestion = ActiveWorkbook.Sheets("Saisie initiale").Range("NbrQuestion").Text
Load Identification
Identification.Show
Unload Identification

If Identification.Quitter Then
Exit Sub
Else

If Sheets("Saisie initiale").Cells(Ligne + 3, 2) = "1" Then
Questions1.Label1.Visible = True
Questions1.I1.Visible = True
Questions1.Ok.Visible = True
Questions1.Label1.Enabled = True
Questions1.I1.Enabled = True
Questions1.Ok.Enabled = True
Questions1.Caption = Sheets("Saisie initiale").Cells(2, 9).Value
End If
If Sheets("Saisie initiale").Cells(Ligne + 3, 2) = "2" Then
Questions1.Label2.Visible = True
Questions1.I2.Visible = True
Questions1.Ok.Visible = True
Questions1.Label2.Enabled = True
Questions1.I2.Enabled = True
Questions1.Ok.Enabled = True
Questions1.Caption = Sheets("Saisie initiale").Cells(2, 10).Value
End If
If Sheets("Saisie initiale").Cells(Ligne + 3, 2) = "3,1" Then
Questions1.Label3.Visible = True
Questions1.I31.Visible = True
Questions1.Ok.Visible = True
Questions1.Label3.Enabled = True
Questions1.I31.Enabled = True
Questions1.Ok.Enabled = True
Questions1.Caption = Sheets("Saisie initiale").Cells(2, 11).Value
End If
If Sheets("Saisie initiale").Cells(Ligne + 3, 2) = "3,2" Then
Questions1.Label4.Visible = True
Questions1.I32.Visible = True
Questions1.Ok.Visible = True
Questions1.Label4.Enabled = True
Questions1.I32.Enabled = True
Questions1.Ok.Enabled = True
Questions1.Caption = Sheets("Saisie initiale").Cells(2, 12).Value
End If
If Sheets("Saisie initiale").Cells(Ligne + 3, 2) = "4" Then
Questions1.Label5.Visible = True
Questions1.I4.Visible = True
Questions1.Ok.Visible = True
Questions1.Label5.Enabled = True
Questions1.I4.Enabled = True
Questions1.Ok.Enabled = True
Questions1.Caption = Sheets("Saisie initiale").Cells(2, 13).Value
End If

Load Questions1
Questions1.Show
Unload Questions1

For NumQuestion = 1 To (NombreQuestion)
section = Sheets("Saisie initiale").Cells(3, NumQuestion + 13).Value

Select Case section

Case 1
Questions2.TexteLibre.Visible = True
Questions2.Ok.Visible = True
Questions2.TexteLibre.Enabled = True
Questions2.Ok.Enabled = True

End Select

Questions2.Caption = Sheets("Saisie initiale").Cells(2, NumQuestion + 13).Value
Load Questions2
Questions2.Show
Unload Questions2
Next NumQuestion

Load Questions3
Questions3.Show
Unload Questions3

Reponse = MsgBox("Voulez vous enregistrer les modifications", vbQuestion & vbYesNo, "Sauvegarde")
If Reponse = vbYes Then Application.ActiveWorkbook.Save

End If
Load Quitters
Quitters.Show

End Sub

4 réponses

  1. Bonjour,

    Il semble que le problème se trouve ici:
    Identification.Show
    Unload Identification


    Show() ouvre le formulaire et Unload() le ferme juste après.

    Load nomDuFormulaire ne sert pas à grand chose.

    Je n'ai pas tout lu, c'est assez rébarbatif de se taper tout le code à déchiffrer.

    ;o)
    0
    1. Et donc il faudrait que j'enlève unload Identification ? c'est bien ça ? mais je crois que si je fais ça il restera ouvert alors que je veux qu'il se ferme avant de passer aux autres. C'est vrai que mon code est assez long mais j'ai pas trouver plus simple pour faire ce que je voulais. Passer en base de données serait surement mieux mais pr le peu de données qu ej'ai ça ne sert à rien.
      0
      1. en fait mon problème se situe soit dans ce code là :
        Private Sub Quitter_Click()
        Unload Identification
        NombreQuestion = 0
        End Sub

        soit dans celui ci :

        If Identification.Quitter Then
        Exit Sub
        Else
        ....
        End if
        Quitters.Show
        End Sub

        Je veux juste que après avoir cliquer sur le bouton quitter du formulaire Identification il arrête Saisie et il ouvre Quitters. mais il m'ouvre les autres quand même ! Je sais pas si je suis très claire dans ce que je veux. Merci déjà d'avoir répondu ;)
        0
      2. Le plus simple est de mettre ton fichier sur https://www.cjoint.com/ et de coller ici le lien.

        NombreQuestion, identification.Quitter etc pour moi ne représentent rien. Je n'ai aucune idée de ce que cela peut être.

        ;o)
        0
      3. Il faut rajouter ça dans le formulaire Identification:

        Private Sub Quitter_Click()
           Unload Me
           NombreQuestion = 0
           End
        End Sub


        ;o)
        0
      4. Ouiiiiiiii merciiiiii !!! Enfin je vai spouvoir avancer au lieu de bloquer sur un truc débile comme ça !! lol merci beaucoup bonne fin de journée ;)

        A++
        0
    2. Contributeur
      Bonjout,
      J'ai commencé à débugué ton code mais je me suis vite arrèté.
      Il n'y a aucune logique dans ta démarche et si ça ne fonctionne pas c'est bien pour cela.
      Tu dois entièrement revoir ta conception.
      Moi ce que j'en dis... c'est à toi de voir. Toutefois pour répondre à ta question.
      Dans un module général mettre un Drapeau par exemple.
      Public Quitter as Boolean


      Dans le bouton quitter de tes autres UF mettre Quitter = True
      et dans la boucle de ton premier UF

          For NumQuestion = 1 To (NombreQuestion)
              section = Sheets("Saisie initiale").Cells(3, NumQuestion + 13).Value
          
              Select Case section
              'Ne sert a rien, peu être déterminer dans le design.
              Case 1
                  Questions2.TexteLibre.Visible = True
                  Questions2.Ok.Visible = True
                  Questions2.TexteLibre.Enabled = True
                  Questions2.Ok.Enabled = True
              End Select
          
              Questions2.Caption = Sheets("Saisie initiale").Cells(2, NumQuestion + 13).Value
              Load Questions2 'inutile, double emploi avec Show
              Questions2.Show
              Unload Questions2 'inutile sera déjà fermer par le bouton quitter
              
              If Quitter Then Quitter = False: Exit Sub
          
          Next NumQuestion
      
          Load Questions3 'inutile, double emploi avec Show
          Questions3.Show
          Unload Questions3 'inutile sera déjà fermer par le bouton quitter


      Et ce code aussi n'est pas valable, cette question ne sera jamais appellée dés qu'un des TextBox aurra une lettre dedans.
      If Me.DateEr.Value = "" And Me.Service.Value = "" And Me.Fonction.Value = "" And Me.Concerne.Value = "" And Me.DateI.Value = "" And Me.Indice.Value = "" Then
      MsgBox "Il faut que tout les champs soit remplit"

      Faut remplacer les AND par des OR
      A+
      0
      1. Ok je vais essayer mais c'est vrai que mon code est compliqué mais je m'y connais pas assez pour recommencer complètement autre chose. Merci je vous dirais si ça marche

        A++
        0
        1. Bon ben j'ai essayer avec la méthode du Quitter en boolean mais ça ne fonctionne pas non plus. Si vous avez d'autres idées hésitez pas ! J'aimerai bien revoir ma conception mais je vois pas comment j'ai récupéré cette macro et je l'ai adaptée à mon fichier ou du moins j'ai essayé elle marche mais il y ce petit bug que je n'arrive pas à résoudre. Dans un autre fichier ou je l'ai également utilisé ça marche très bien mais il est beaucoup moins compliqué !! Merci d'avance à ceux qui prendrons le temps de jeter un coup d'oeil à mon problème.
          0