IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

[A-02] Contrôle de saisie


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de azertix
    Homme Profil pro
    Technicien d'assistance informatique
    Inscrit en
    Juin 2007
    Messages
    961
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien d'assistance informatique

    Informations forums :
    Inscription : Juin 2007
    Messages : 961
    Par défaut [A-02] Contrôle de saisie
    Bonjour, ayant terminé mon appli Access, je bosse actuellement à l'optimisation du code.
    Pour faire mes contrôles de saisie, j'ai fait une fonction ControleSaisie et une fonction EstVide (la première appelle la seconde) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Function EstVide(controle As Control) As Boolean
        If IsNull(controle) Or controle = "" Then
            EstVide = True
        Else
            EstVide = False
        End If
    End Function
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    Function ControleSaisie(controle As Control, Optional nul As Boolean) As Boolean
    ' Le paramètre nul indique si le contrôle peut ne pas être rempli
        Dim rep As Integer
     
        If EstVide(controle) And nul = False Then
            rep = MsgBox(controle.ValidationText, vbOKOnly + vbCritical, "Information manquante...")
            controle.SetFocus
            ControleSaisie = False
        Else
            Select Case controle.StatusBarText
                Case "Nombre":
                    If Not IsNumeric(controle) Then
                        rep = MsgBox("Veuillez saisir un numéro valide", vbOKOnly + vbCritical, "Saisie incorrecte...")
                        controle.SetFocus
                        ControleSaisie = False
                    Else: ControleSaisie = True
                    End If
                Case "Date":
                    If Not IsDate(controle) And Not EstVide(controle) Then
                        rep = MsgBox("Veuillez saisir une date valide", vbOKOnly + vbCritical, "Saisie incorrecte...")
                        controle.SetFocus
                        ControleSaisie = False
                    Else: ControleSaisie = True
                    End If
                Case Else: ControleSaisie = True
            End Select
        End If
    End Function
    Je fais ensuite mon contrôle de saisie sur mes contrôles de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    If ControleSaisie(Me.txtNumCli) = False Then
        Exit Sub
    End If
    If ControleSaisie(Me.txtnumSIAC) = False Then
        Exit Sub
    End If
    If ControleSaisie(Me.txtDateNaiss) = False Then
        Exit Sub
    End If
    If ControleSaisie(Me.txtNom) = False Then
        Exit Sub
    End If
    If ControleSaisie(Me.txtPrenom) = False Then
        Exit Sub
    End If
    If ControleSaisie(Me.txtDateExam, True) = False Then
        Exit Sub
    End If
    If ControleSaisie(Me.cboJustif) = False Then
        Exit Sub
    End If
    If ControleSaisie(Me.txtDernJustif, True) = False Then
        Exit Sub
    End If
    If ControleSaisie(Me.txtDateCloture, True) = False Then
        Exit Sub
    End If
    Peut-on optimiser cela ?

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 197
    Par défaut
    Bonjour,

    Essaie de parcourir la collection Controls de ta form, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Dim myCtl As Control, Abort As Boolean
    ...
    Abort = False
    For Each myCtl in Me.Controls
        If ControleSaisie(myCtl) = False Then
            Abort = True
            Exit For
        End If
    Next
    If Abort Then
        Exit Sub
    Endif
    ...

  3. #3
    Membre Expert
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Par défaut
    Bonjour Azertix,
    Il y a plusieurs solutions.
    Une idée est de placer Requis dans la propriété Remarque des contrôles obligatoires.
    Puis dans un module standard :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Public Function SaisieComplete(Optional BtnApply As String) As Boolean
        Dim Completed As Boolean, i As Byte
        Completed = True
        With Screen.ActiveForm
            For i = 0 To .Controls.Count - 1
                If .Controls(i).Tag = "Requis" Then
                    If .Controls(i) Is Screen.ActiveControl then
                       If Nz(Len(.Controls(i).Text),0)=0 Then Completed=False  
                    Else
                        If Nz(len(.Controls(i).Value),0)=0 Then Completed = False
                    End if
                End If
            Next i
       End With
       SaisieComplete = Completed
     
       'Permet de rendre Enabled ou Disable le bouton passer en paramètre
       'Screen.ActiveForm.Controls(BtnApply).Enabled=Completed
    End Function
    Tu appelles la fonction par un bouton dans le formulaire

  4. #4
    Membre émérite Avatar de azertix
    Homme Profil pro
    Technicien d'assistance informatique
    Inscrit en
    Juin 2007
    Messages
    961
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien d'assistance informatique

    Informations forums :
    Inscription : Juin 2007
    Messages : 961
    Par défaut
    Bonjour EddiGordo, bonjour ilank et merci de vos réponses.

    Alors vos deux propositions sont intéressantes car elles me font progresser dans mon optimisation.
    L'idée d'EddiGordo de parcourir tous les contrôles du formulaire est intéressante car elle m'évitera d'avoir à tester individuellement chaque contrôle, en revanche, ça oblige à tester TOUS les contrôles, même ceux qui n'ont pas besoin d'être remplis. Problème résolu par ilank avec l'idée d'utiliser la propriété Remarque pour savoir si le contrôle doit être remplir ou pas.

    En utilisant vos deux idées, je pense arriver à faire ce que je recherchais

    Je posterai ma fonction finale (peut-être dans les contributions, je sais pas)

  5. #5
    Membre émérite Avatar de azertix
    Homme Profil pro
    Technicien d'assistance informatique
    Inscrit en
    Juin 2007
    Messages
    961
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien d'assistance informatique

    Informations forums :
    Inscription : Juin 2007
    Messages : 961
    Par défaut
    Après réflexion, je me demande s'il n'est pas plus rapide de tester les contrôles un par un si nécessaire comme j'ai fait, que de parcourir tous les contrôles du formulaire (y compris les boutons, les groupes d'option et les étiquettes) en regardant à chaque fois si leur propriété Remarque contient "Requis".
    Parce que quand on regarde le code d'ilank, si on veut vérifier que le contrôle ne contient pas une valeur vide ("") et que le type de données saisie correspond bien, ça fait au final une batterie de tests !

  6. #6
    Membre Expert
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Par défaut
    Pour te parler franchement, ce n'est pas non plus ce que je fais.
    Je fournis à la fonction les controles à vérifier. Une variable tableau ou chaine de caractères contient la liste des controles à vérifier.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Contrôle de saisie formulaire
    Par miram dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 02/02/2006, 08h33
  2. contrôle de saisie sur un espace
    Par oceane751 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 12/01/2006, 12h04
  3. contrôle de saisie menu déroulant
    Par shnouf dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 05/01/2006, 16h30
  4. contrôle de saisie
    Par oceane751 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 05/01/2006, 11h24
  5. [debutant] contrôle de saisie et formulaire
    Par oceane751 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 27/11/2005, 22h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo