Vba userform et macro problème

Résolu/Fermé
vansk - 10 août 2010 à 11:28
 vansk - 10 août 2010 à 15:04
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




A voir également:

4 réponses

Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
10 août 2010 à 11:45
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
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
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
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
10 août 2010 à 12:35
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
https://www.cjoint.com/?ikooONQG3g

Voici le lien ça sera surement plus facile à comprendre comme ça.

Encore merci de votre aide
0
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
10 août 2010 à 14:35
Il faut rajouter ça dans le formulaire Identification:

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


;o)
0
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
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
10 août 2010 à 12:49
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
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
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
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
10 août 2010 à 14:48
0