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

IHM Discussion :

Sélection sur plusieurs listes déroulantes dans un bouton


Sujet :

IHM

  1. #41
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,

    • Ce que j'ai configuré pour la touche Entrée, c'est que le formulaire appelle la Sub Form_KeyPress(KeyAscii As Integer) chaque fois qu'une touche est utilisée.
      Dans cette procédure j'appelle le code du bouton CmdFiltre.
      Ça ne modifie pas le comportement standard, à savoir, passer au contrôle suivant si c'est configuré comme ça dans les options avancées d'Access..

      Le comportement que tu décris me laisse penser que rien ne se passe.
      Est-ce que tu as bien "Aperçu des touches" à "Oui" et "procédure événementielle" en face de "sur touche activée".
      Re-cliques sur le petit bouton |...|


    • Le critère sur les jours ne peut plus fonctionner si on ne compare pas les mêmes choses. "Lun" <> "Lundi"
      Il faut donc deux colonnes dans la zone de liste déroulante.
      Une par récupérer la valeur (Lun, Mar, Mer, ...) et une pour l'affichage (Lundi, Mardi, ...).
      "Nbre de colonnes" = 2
      "Largeurs colonnes" = 2,5cm;0cm
      "Colonne liée" = 1
      "limiter à la liste" = Non
      Code requête Jour : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      SELECT Jour_semaine.Nom_jour, Total.JSem
      FROM Total INNER JOIN Jour_semaine ON Total.JSem = Jour_semaine.Jour
      GROUP BY Jour_semaine.Nom_jour, Total.JSem, Jour_semaine.NumJour
      ORDER BY Jour_semaine.NumJour;
      Le code modifié pour prendre la deuxième colonne au lieu de la colonne liée (colonne 1)
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      ' SELECTION DU JOUR DE LA SEMAINE
      strVal = Nz(Me.Rjour_sem.Column(1), "") ' colonne 2
      If strVal <> "" Then
         If f <> "" Then f = f & " AND "
         f = f & "Jsem = """ & strVal & """"
      End If
      Attention l'indice de Column(n) commence à 0.

    • pour la possibilité de faire plusieurs choix dans une liste : avant que je modifie quoique ce soit, sera-t-il toujours possible de ne faire qu'un seul choix ou pas de choix du tout ?
      Oui. Essaie mon code sur une copie de ta base.


    Je n'ai pas encore regardé ta deuxième base.
    Trop de questions en même temps
    Je ne connais pas toutes les réponses par cœur. Je suis obligé de tester avant et, parfois, de contourner certains blocages.

    A+

  2. #42
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 115
    Points : 41
    Points
    41
    Par défaut
    Salut,

    Merci pour toutes ces réponses. Je vais modifier tout çà...

    Je n'ai pas encore regardé ta deuxième base.
    Trop de questions en même temps
    Donc, pas de questions cette fois-ci...

    Bonne fin de journée. A+, surement dans le WE

  3. #43
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,

    une première fournée de réponses.

    comment pourrais-je faire pour sélectionner une heure exacte et non une tranche horaire ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     Dim dtHeure As Date
     
    'SELECTION DE L'HEURE PRECISE
    dtHeure = Nz(Me.TxtHeure, #1/1/1900#)
    If dtHeure <> #1/1/1900# Then
       If f <> "" Then f = f & " AND "
       f = f & "[Heure]=#" & Format(dtHeure, "hh:nn") & "#"
    End If
    je voudrais supprimer le volet qui se situe sur la gauche du formulaire...c'est une sorte de bande grise avec une flèche..
    Est-ce le sélecteur d'enregistrement ?
    On peut l'enlever en affichant les propriétés du formulaire (onglet Format).
    "Afficher sélecteur" : Non

    Même question pour l'avertissement de sécurité à chaque ouverture de la base...
    Cliquer sur le bouton Office, puis sur "Options Access" (en bas à droite).
    Cliquer sur "Centre de gestion de la confidentialité" (partie gauche), puis sur "Paramètres du Centre de gestion de la confidentialité".
    A partir de là on a plusieurs options/stratégies.
    • Éditeurs approuvés : Liste les certificats utilisés pour signer du code VBA, auxquels on fait confiance.
    • Emplacements approuvés : Liste les emplacements (chemins) pour lesquels aucun contrôle de sécurité ne sera effectué.
    • Paramètre des macros : Comment traiter les fichiers se trouvant en dehors des emplacements approuvés.
      Si tu choisis "Activer toutes les macros" (sécurité nulle) tu n'auras plus jamais le message d'avertissement.

    Personnellement j'ai définit plusieurs dossiers en tant qu'emplacements approuvés, et j'ai laissé le niveau de sécurité (Paramètres des macros) sur "Désactiver toutes les macros avec avertissement".

    Voir également l'aide en ligne, rubrique "Sécurité et confidentialité", puis "Activer ou désactiver les macros dans les documents Office".
    C'est sûrement mieux expliqué.

    bouton effacer deuxième base de données.
    Il faut juste changer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For Each ctl In Me.Section(acHeader).Controls
            ...
    Next
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For Each ctl In Me.Section(acDetail).Controls
            ...
    Next
    Section(acHeader) est la section en-tête de formulaire.
    Section(acDetail) est la section Détail.


    Comptage et pourcentage.
    J'ai vu les contrôles qui sont dans le pied de formulaire.
    Tu utilises la fonction de formulaire Compte.
    On peut faire autrement en réutilisant le filtre.
    Dans le pied de formulaire, ajoutes une zone de texte txtFiltre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub Cmd_Rechercher_Click()
     
    Dim f As String
     
    f = Creerfiltre
    Me.txtFiltre = f
    ' Activation du filtre
    Me.Filter = f              ' on peut se passer de
    Me.FilterOn = True         ' ces deux lignes
     
    End Sub
    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
    Private Sub Cmd_Effacer_Click()
     
    Dim ctl As Access.Control
     
    For Each ctl In Me.Section(acDetail).Controls
        Select Case ctl.ControlType
            Case acComboBox, acTextBox
                 If Len(ctl.DefaultValue) > 0 Then
                    ctl = Eval(ctl.DefaultValue)
                 Else
                    ctl = Null
                 End If
        End Select
    Next
    Me.txtFiltre = ""
    Me.FilterOn = False      ' on peut se passer de
    Me.Filter = ""           ' ces deux lignes
    End Sub
    Nombre de trajets sélectionnés : =CpteDom("*";"Val_Thorens";[txtFiltre])
    Part de ces trajets sur l'ensemble : =CpteDom("*";"Val_Thorens";[txtFiltre])*100/CpteDom("*";"Val_Thorens") & "%"

    CpteDom (DCount en Visual Basic) est une fonction de regroupement Domaine, utilisable dans les formulaires et les requête, et en VB sous sont nom anglais.

    Tu n'as même plus besoin d'avoir une source de données pour ton formulaire.
    Donc plus besoin de filtrer le formulaire. C'est pour ça que j'ai mis en commentaire "on peut se passer de ces deux lignes".

    On peut aussi faire les calculs en VB et mettre directement le résultat dans les zones de textes.
    Par exemple si les zones de textes s'appelaient txtNbTrajetsSelection et txtNbTrajetsSelectionPct.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub Cmd_Rechercher_Click()
    Dim f As String
    Dim lgNbTrajetsTot As Long, lgNbTajestSelection As Long
     
    f = Creerfiltre
     
    lgNbTrajetsTot = DCount("*", "Val_Thorens")
    lgNbTajestSelection = DCount("*", "Val_Thorens", f)
     
    Me.txtNbTrajetsSelection= lgNbTajestSelection
    Me.txtNbTrajetsSelectionPct= lgNbTajestSelection * 100 / lgNbTrajetsTot & " %"
    End Sub
    et à la fin de la procédure Cmd_Effacer_Click() on ajoute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Me.txtNbTrajetsSelection= DCount("*", "Val_Thorens")
    Me.txtNbTrajetsSelectionPct= "100 %"
    A+

  4. #44
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 115
    Points : 41
    Points
    41
    Par défaut
    Bonsoir,

    J'ai donc regardé ton message. Merci.

    - Alors j'ai vu que ton code est différent du mien pour l'heure. Alors, en quoi le mien est faux (ou moins bon?) ?

    - pour le volet, c'était bien çà. Problème résolu. A quoi il sert ce sélecteur ?

    - pour l'avertisseur de sécurité, tu me conseilles de l'enlever ou pas alors ? Parce que c'est un peu lourd de devoir cliquer sur "Activer le contenu" à chaque ouverture de la base. Après, si tu me conseilles de le laisser, pas de souci.

    - Ok pour le 2e bouton "Effacer". Erreur d'inattention.

    - enfin, pour les contrôles en bas de formulaire : çà veut donc dire que tout le code (même la fonction) derrière le bouton Rechercher ne sert à rien en fait ?
    Et donc la zone texte TxtFiltre donne donc une info sur le filtre qui a été lancé...c'est çà ?

    Et avec cette méthode, est-ce qu'on peut par exemple, savoir çà : alors l'utilisateur sélectionne une ville d'origine. Dans les txtbox d'en-bas, on obtient donc le total de déplacements venant de telle ville. Alors, est-ce que sur ce total, il serait possible d'afficher qqchose (un sous-formulaire, une liste...?) permettant d'avoir la répartition des professions (par exemple) dans le total de ces déplacements ou/et les destinations principales ?
    En fait, c'est çà qui m'intéresse. Ce genre d'infos statistiques. Tu vois à peu près ou pas ?

    Bon, c'est tout pour l'instant.

    Je te remercie en tout cas. Bonne soirée et à demain sans doute

  5. #45
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,
    • ton code est différent du mien pour l'heure. Alors, en quoi le mien est faux (ou moins bon?) ?
      Dans la base que tu as attachée ici, il n'y a aucun code pour l'heure complète, c'est à dire le contrôle TxtHeure.
      Le code que j'ai posté ne concerne que ce contrôle.
      On peut donc saisir une heure (HH:MN) ou une tranche horaire.


    • Le sélecteur d'enregistrement(s) sert à sélectionner un ou plusieurs enregistrements.
      Tu peux ensuite faire un copier, puis coller dans Excel par exemple.
      Ou tu peux appuyer sur Suppr.
      Quand tu modifies un enregistrement, ou que tu en saisis un nouveau, tu peux le sauvegarder en cliquant sur le sélecteur (la petite flèche devient un crayon quand les modifications ne sont pas sauvegardées dans la ou les tables sous-jacentes).
      Sur ton formulaire il ne se passe rien car les contrôles sont indépendants (pas liés à un champ de la source de données du formulaire).


    • Dans les paramètres du Centre de gestion de la confidentialité , je te conseilles de définir au moins un emplacement approuvé, en cochant "Les sous-dossiers de cet emplacement sont également approuvés".
      Par exemple, si je définis C:\Mes Documents\Access comme emplacement approuvé, toutes les bases Access de ce dossier seront approuvées.
      Si en plus, j'ai coché "Les sous-dossiers de cet emplacement sont également approuvés", tout ce qui se trouve sous C:\Mes Documents\Access est également approuvé.
      C'est à dirre qu'il suffit que le chemin d'accès à la base commence par C:\Mes Documents\Access


    • enfin, pour les contrôles en bas de formulaire : çà veut donc dire que tout le code (même la fonction) derrière le bouton Rechercher ne sert à rien en fait ?
      Et donc la zone texte TxtFiltre donne donc une info sur le filtre qui a été lancé...c'est çà ?
      La seule chose inutile, est d'avoir une source de données pour le formulaire Frm_Requêtes, puisqu'il n'affiche aucune données.
      Et par voie de conséquence, le filtrage est inutile.

      Il est plus avantageux d'utiliser les fonctions de regroupement. Et en particulier DCount pour compter des enregistrements.

      La zone de texte TxtFiltre ne sert que dans le cas où le contrôle est basé sur une expression ( = expression).
      Dans un contrôle on peut mettre une expression dans laquelle interviennent d'autres contrôles.
      exemple
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      =CpteDom("*";"Val_Thorens";[txtFiltre])


    • Et avec cette méthode, est-ce qu'on peut par exemple, savoir çà : alors l'utilisateur sélectionne une ville d'origine. Dans les txtbox d'en-bas, on obtient donc le total de déplacements venant de telle ville. Alors, est-ce que sur ce total, il serait possible d'afficher qqchose (un sous-formulaire, une liste...?) permettant d'avoir la répartition des professions (par exemple) dans le total de ces déplacements ou/et les destinations principales ?
      Là, je pense que tu peux mettre des sous-formulaires.
      En effet, on peut par code VB, modifier les propriétés Filter et FilterOn d'un sous-formulaire.

      Exemple :
      Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      Private Sub Cmd_Rechercher_Click()
      Dim f As String
      Dim lgNbTrajetsTot As Long, lgNbTajestSelection As Long
       
      f = Creerfiltre
      ' Appliquer filtre au sous-formulaire sfm_Destinations
      Me.sfm_Destinations.Form.Filter = f
      If Len(f) > 0 Then
         Me.sfm_Destinations.Form.FilterOn = True
      Else
         Me.sfm_Destinations.Form.FilterOn = False
      End If
      Le formulaire sfm_Destinations peut être en affichage mode formulaire, tableau croisé dynamique, ou graphique croisé dynamique.

      Une zone de liste, c'est également possible.
      Mais je trouve que ça fait des requêtes de sélection compliquées.

      Sinon, je pense que j'aurais une démarche inverse à la tienne.
      Je partirai de ce que je veux montrer.
      Donc j'essaie créer une requête ou un formulaire pour analyser un point particulier.
      Ensuite, j'ajoute des critères de filtrage.
      Parce que si je n'arrive pas à créer ma requête ou mon formulaire, pas la peine de chercher comment les filtrer.

      Par exemple la requête statistique sur les destinations :
      Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      SELECT Val_Thorens.Destination, Count(*) AS NB, 100*(Count(*)/DCount("*","Val_Thorens","(Origine) Like '[A-Z]*'")) AS PCT
      FROM Val_Thorens
      WHERE (((Val_Thorens.Origine) Like '[A-Z]*'))
      GROUP BY Val_Thorens.Destination
      ORDER BY Count(*) DESC;
      (J'ai mis un "faux" critère qui prend tout : Like '[A-Z]*')
      Le code SQL pourrait servir de contenu à une zone de liste et je pourrai faire en sorte d'avoir une référence
      à une zone de liste déroulante avec toutes les origines.
      (Comment faire correspondre deux zones de listes
      Concevoir une liste qui en alimente une autre).
      Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      SELECT Val_Thorens.Destination, Count(*) AS NB, 100*(Count(*)/DCount("*","Val_Thorens","(Origine) Like '" & [NomZoneDeListe] & "'")) AS PCT
      FROM Val_Thorens
      WHERE (((Val_Thorens.Origine) Like [NomZoneDeListe]))
      GROUP BY Val_Thorens.Destination
      ORDER BY Count(*) DESC;


    Bon, j'arrête là pour aujourd'hui.

    Et n'hésite pas créer plusieurs discussions (en principe une question par discussion). Comme ça tu peux avoir plusieurs avis.
    Je ne suis pas compétant dans tous les domaines

    A+

  6. #46
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 115
    Points : 41
    Points
    41
    Par défaut
    Bonjour,

    De nouveau merci pour ces explications.

    - Je pense donc mettre des sous-formulaires en bas de mon formulaire principal afin d'avoir le détail de la répartition des critères que je veux.

    Mais le souci, c'est que je vais sans doute manquer de place...alors la solution est peut-être l'ouverture d'un formulaire de résultats comprenant tous les sous-formulaires...

    D'ailleurs, je ne saisie pas trop les différences ou plutôt les avantages et les inconvénients d'un tableau croisé dynamique et/ou graphique croisé dynamique ?

    Mais bon, on en reparlera quand j'aurais essayé de me débrouiller avec tes indications. Là, je vais manquer de temps pour ce projet et il faut que je finisse autre chose avant.

    - Sinon, j'ai une petite question d'ordre esthétique plutôt : si tu te souviens bien, on a fait une textbox comprenant un pourcentage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =CpteDom("*";"Val_Thorens";[txtFiltre])*100/CpteDom("*";"Val_Thorens") & "%"
    Mais quand le calcul s'effectue, on a pas mal de décimales...est-ce qu'il y aurait un moyen de limiter le résultat à 1 chiffre après la virgule ?

    - jusqu'à présent, pour mes filtres, je travaillais avec des listes déroulantes ou des textbox. Alors, comment faire la même chose avec des cases à cocher ? Par exemple, pour ma base des accidents, je désire sélectionner uniquement une possibilité dans une colonne (par exemple, uniquement les veilles de fête, codées avec VFet dans ma colonne Cjour) : si on coche la case, comment spécifier que seul ce critère m'intéresse ? et est-il possible de cumuler ces cases cochées dans le filtre ?
    Je pensais à quelque chose du style : si case cochée alors ...
    En gros, çà doit revenir à une sélection SQL non dans le contenu de ce contrôle, non ?

    Merci beaucoup. Bonne journée

  7. #47
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,

    L'avantage des formulaires affichés en mode tableau croisé dynamique ou graphique croisé dynamique, est qu'ils utilisent la source de données du formulaire.
    On peut donc agir facilement sur le filtre.
    Dans ces deux modes d'affichages, ces formulaires sont assez semblables à ce qui se fait dans Excel.
    Tu peux également définir les champs sur lesquels on peut filtrer en déposant des champs dans la zone de dépot "champs de filtre".

    Si tu utilises le contrôle Graphique, il faut agir sur la propriété contenu (instruction SQL ou requête).
    Si tu veux filtrer il faudra, par code, modifier l'instruction SQL en ajoutant une clause WHERE suivie de critères SQL.


    Pour la zone de texte avec pourcentage, le fait que l'expression se termine par en fait une zone de texte contenant du texte.
    Je propose de changer l'expression en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =CpteDom("*";"Val_Thorens";[txtFiltre])/CpteDom("*";"Val_Thorens")
    et de mettre la propriété "Format" à "Pourcentage".
    Ensuite, tu définie le nombre de décimales à 1.


    Pour les cases à cocher, on teste en VB si la case est cochée.
    Si oui, on ajoute le critère. C'est un critère fixe.
    Si non, on n'ajoute rien.
    Exemple si la case à cocher s'appelle chkVFet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ' Contrôle chkVFet
    If Me.chkVFet = True Then
       If f <> "" Then f = f & " AND "
       f = f & "Cjou = 'VFet'"
    End If
    Donc tu vois, le principe reste le même.
    Ça reviens à dire, je rajoute le critère Cjou = 'VFet' si chkVFet est cochée (sa valeur est alors à True).

    A+

  8. #48
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 115
    Points : 41
    Points
    41
    Par défaut
    Salut,

    Merci pour ces réponses.

    - çà fonctionne bien pour le pourcentage

    - par contre, pour les cases à cocher, çà ne fonctionne pas. Alors peut-être est-ce du fait que j'ai fait un groupe d'options. Alors la solution est-elle de supprimer ce groupe d'options et de créer une case à cocher par critère (sans groupe), ou est-ce juste un petit paramètre à changer pour que çà fonctionne ? D'ailleurs, est-ce qu'on peut sélectionner 2 options dans ce genre de groupe (par exemple cocher Veille de fête et Fête) ?Tu peux voir la base en pièce jointe (formulaire "Requêtes multi").

    - ensuite, j'ai une question concernant ma 1ère base...désolé de revenir dessus mais c'est le plus pressé en ce moment je pense. Donc, pour te rafraichir la mémoire, je redépose cette base actualisée (avec l'avancement des différents formulaires). Donc, comme tu peux le voir, le premier formulaire (intitulé "Total" et correspondant aux requêtes simples) est quasiment terminé. Le dernier choix (formulaire "Statistiques") n'est pas commencé.
    C'est donc le 2e formulaire ("requêtes multi") qui me pose quelques soucis. Il est en effet un peu plus complexe car il permet de cumuler et de croiser tous les critères de la base. L'interface est provisoire d'ailleurs. Faut que j'embellisse tout çà par la suite avec des fonds d'écran...
    Donc, sur ce formulaire, j'ai donc réutilisé la fonction qu'on a utilisé pour le premier formulaire.
    Mais je bloque pour certains critères, notamment la sélection d'une période. J'ai bien tenté d'adapter ce que l'on avait fait pour l'heure mais çà ne fonctionne pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    ' SELECTION DE LA PERIODE
    dtperiode1 = Nz(Me.Rperiode1, #1/1/1900#)
    dtperiode2 = Nz(Me.Rperiode2, #1/1/1900#)
     
    If (dtperiode1 <> #1/1/1900#) And (dtperiode2 <> #1/1/1900#) Then
       If f <> "" Then f = f & " AND "
       If dtperiode1 <= dtperiode2 Then
          f = f & "[Date] BETWEEN #" & Format(dtperiode1, "mm\/dd\/yyyy") & "# AND #" & Format(dtperiode2, "mm\/dd\/yyyy") & "#"
       Else
          f = f & "([date] BETWEEN #" & Format(dtperiode1, "mm\/dd\/yyyy") & "# AND #23:59:59#"
          f = f & " OR "
          f = f & "[Date] BETWEEN #00:00:00# AND #" & Format(dtperiode2, "mm\/dd\/yyyy") & "#)"
       End If
    End If
    - ensuite, pour les résultats, j'ai créé un bouton rechercher qui ouvre un formulaire avec tous les critères. Et tu verras, j'ai tenté de recréer le bandeau de statistiques en bas de formulaire (comme dans le formulaire "total") sauf que çà ne fonctionne pas. Est-ce du fait que les colonnes correspondantes ne sont pas dans ce formulaire de résultats ?

    Bon, c'est tout pour le moment, mais c'est déjà pas mal. Merci beaucoup LedZeppII. Bonne journée
    Fichiers attachés Fichiers attachés

  9. #49
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonsoir,

    • Cases à cocher et groupe d'options
      Dans un groupe d'options on peut mettre des cases d'options ou des cases à cocher.
      Le fait que ces cases soient dans un groupe d'option modifie leur propriété Valeur.
      En dehors d'un groupe d'option, la valeur est de type booléenne (True ou False).
      Dans un groupe d'options, la valeur est de type numérique.
      Les cases sont mutuellement exclusives.
      Une seule peut être cochée à la fois, et le groupe d'option prend la valeur de la case qui est cochée.

      Pour ce que tu veux faire, il ne faut pas les mettre dans un groupe d'options.
      Sélectionne les cases d'options.
      Fais un Couper (Ctrl+X)
      Cliques sur l'onglet "caractéristiques générales", puis fais un Coller (Ctrl+V).
      Ensuite tu dessines un rectangle autour et tu remets une étiquette.
      Clic-droit sur l'étiquette > Position > Mettre au premier plan

      Dans la fonction Creerfiltre(), j'ajoute une variable pour créer la liste du critère CJou IN (Liste valeurs)
      Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
      Dim strListeCJou As String
      Le code pour filtrer :
      Code vba : 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
      29
      30
      31
      32
      33
      ' Si toutes les options sont sélectionnées : pas de critère sur champ CJou
      '                                           (Pas de critère = tout)
      ' Sinon ...
      If Not (Me.OptWE And Me.OptSemaine And Me.OptVFete And Me.OptFete) Then
          ' SELECTION DU WEEK-END
          If Me.OptWE = True Then
             If strListeCJou <> "" Then strListeCJou = strListeCJou & ", "
             strListeCJou = strListeCJou & "'Sam', 'Dim'"
          End If
       
          ' SELECTION DE LA SEMAINE
          If Me.OptSemaine = True Then
             If strListeCJou <> "" Then strListeCJou = strListeCJou & ", "
             strListeCJou = strListeCJou & "'Sem'"
          End If
       
          ' SELECTION DE LA VEILLE DE FETE
          If Me.OptVFete = True Then
             If strListeCJou <> "" Then strListeCJou = strListeCJou & ", "
             strListeCJou = strListeCJou & "'VFet'"
          End If
       
          ' SELECTION DE LA FETE
          If Me.OptFete = True Then
             If strListeCJou <> "" Then strListeCJou = strListeCJou & ", "
             strListeCJou = strListeCJou & "'Fet'"
          End If
       
          ' Ajout du critère sur champ CJou
          If Len(strListeCJou) > 0 Then
             If f <> "" Then f = f & " AND "
             f = f & "CJou IN (" & strListeCJou & ")"
          End IfEnd If
      Pour optimiser un peu, je ne mets pas de critère si toutes les cases d'options sont cochées.
      J'utilise le critère champ IN (liste valeurs) pour éviter de devoir mettre des OR.
      ... AND (champ = valeur1 OR Champ = valeur2 OR Champ = valeur3) AND ... par exemple
      Enfin, pour réinitialiser les cases d'options (un Case supplémentaire avec acOptionButton)
      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
      Private Sub CmdEffacer_Click()
       
      Dim ctl As Access.Control
       
      For Each ctl In Me.Section(acDetail).Controls
          Select Case ctl.ControlType
              Case acComboBox, acTextBox
                   If Len(ctl.DefaultValue) > 0 Then
                      ctl = Eval(ctl.DefaultValue)
                   Else
                      ctl = Null
                   End If
              Case acOptionButton
                   ctl = False
          End Select
      Next
       
      Me.FilterOn = False
      Me.Filter = ""
       
      End Sub

    • Intervalle dates
      Le code que tu as réutilisé s'applique uniquement à un champ Date ne contenant que l'heure.
      Il gère en plus le passage à minuit.

      Pour des dates, je ferai simplement comme ça.
      Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      ' SELECTION DE LA PERIODE
      dtPeriode1 = Nz(Me.Rperiode1, #1/1/1900#)
      dtPeriode2 = Nz(Me.Rperiode2, #1/1/1900#)
       
      If (dtPeriode1 <> #1/1/1900#) And (dtPeriode2 <> #1/1/1900#) Then
         If f <> "" Then f = f & " AND "
         f = f & "[Date] BETWEEN #" & Format(dtPeriode1, "mm\/dd\/yyyy") & "# AND #" & Format(dtPeriode2, "mm\/dd\/yyyy") & "#"
      End If

    • Résultats
      J'ai eu du mal avec ça.
      1. [NTu], [NBH], [NBNH] ne sont ni des contrôles du formulaire, ni des champs de la source de données.
        Il faut au minimum que les champs fassent partie de la source de données.
      2. Pour le total tu peux utiliser

      Il a fallu que je ferme plusieurs fois le formulaire pour qu'il se décide à ne plus afficher #Erreur.
    A+

  10. #50
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 115
    Points : 41
    Points
    41
    Par défaut
    Bonjour,

    Merci pour les réponses d'hier soir. Alors, plusieurs remarques de ma part :

    - j'ai donc modifié le groupe d'options. Cependant, le filtre ne marche pas tout le temps et seulement pour les critères Vfete et Fete...et encore, çà fonctionne une fois sur 3. C'est assez bizarre. Et en testant différentes choses, je me suis rendu compte que les autres critères fonctionnaient si et seulement si j'avais sélectionné un autre critère avant. Enfin bon, tout çà pour dire que c'est assez bizarre.
    Le bouton Effacer fonctionne bien quant à lui.

    - Ok pour l'intervalle Date. Ça fonctionne bien.

    - Pour le formulaire "Résultats" :
    # [NTu], [NBH], [NBNH] ne sont ni des contrôles du formulaire, ni des champs de la source de données.
    Il faut au minimum que les champs fassent partie de la source de données.
    Alors je comprends pas trop ce que tu veux dire, car ce sont bien des champs présents dans la table "Total". Ils correspondent respectivement au nombre de tués, de blessés hospitalisés, et de blessés non hospitalisés. J'ai vérifié si j'avais spécifié une source de données et c'est bien le cas. Ai-je omis quelque chose ?
    Pour le total (tu parles bien de ma textbox "Nombre d'accidents sélectionnés" ?), le code =Compte (*) ne fonctionne toujours pas.

    Il a fallu que je ferme plusieurs fois le formulaire pour qu'il se décide à ne plus afficher #Erreur.
    Là non plus, je ne vois pas. Tu parles des # qui s'affichent tout le temps ?

    - pour l'onglet "Véhicules impliqués" : tu as pu remarqué que j'avais 3 possibilités d'usagers. C'est-à-dire qu'on peut sélectionner jusqu'à 3 personnes impliquées dans l'accident. Ce que j'aimerais faire, c'est d'afficher par défaut seulement le premier usager (Usager A) et de donner la possibilité d'afficher les listes des usagers B et C en cliquant sur l'étiquette de titre. En gros, rendre visible et sélectionnable toutes les options liées à ce type d'usager (avec les étiquettes liées aux listes déroulantes). J'ai donc rendu ces contrôles non visibles par défaut. Et j'ai donc voulu appliquer un code sur Clic mais çà ne fonctionne pas. Et comment faire en sorte de les rendre invisible si on reclique ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub VehiculeB_Click()
     
            Me.EtCat_vehB.Visible = True
            Me.RCat_vehB.Visible = True
            Me.EtSensB.Visible = True
            Me.RSensB.Visible = True
    ....
     
    End Sub
    Et n'hésite pas créer plusieurs discussions (en principe une question par discussion). Comme ça tu peux avoir plusieurs avis.
    Je ne suis pas compétent dans tous les domaines
    Je suis d'accord (pour ce que tu écris au début) mais je trouve que c'est quand même plus pratique quand c'est un suivi de tout un projet. Je veux dire, pour celui qui a besoin d'aide comme celui qui aide principalement. D'ailleurs, je te rassure si besoin est : tu es largement compétent pour moi.

    Je te remercie. A la prochaine. Bonne journée LedZepII

  11. #51
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    bonjour,
    • Il y peut-être un problème de copier/coller du code.
      Je te mets toute la fonction
      Code vba : 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
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
      71
      72
      73
      74
      75
      76
      77
      78
      79
      80
      81
      82
      83
      84
      85
      86
      87
      88
      89
      90
      91
      92
      93
      94
      95
      96
      97
      98
      99
      100
      101
      102
      103
      104
      105
      106
      107
      108
      109
      110
      111
      112
      113
      114
      115
      116
      117
      118
      119
      120
      121
      122
      123
      124
      125
      126
      127
      128
      129
      130
      131
      132
      133
      134
      135
      136
      137
      138
      139
      140
      141
      142
      143
      144
      145
      146
      147
      148
      149
      150
      151
      152
      153
      154
      155
      156
      157
      158
      159
      160
      161
      162
      163
      164
      165
      166
      167
      168
      169
      170
      171
      172
      173
      174
      175
      176
      177
      178
      179
      180
      181
      182
      183
      184
      185
      186
      187
      188
      189
      190
      191
      192
      193
      194
      195
      196
      197
      198
      199
      200
      201
      202
      203
      204
      205
      206
      207
      208
      209
      210
      211
      212
      213
      214
      215
      216
      217
      218
      219
      220
      221
      222
      223
      224
      225
      226
      227
      228
      229
      230
      231
      232
      233
      234
      235
      236
      237
      238
      239
      240
      241
      242
      243
      244
      245
      246
      247
      248
      249
      250
      251
      252
      253
      254
      255
      256
      257
      258
      259
      260
      261
      262
      263
      264
      265
      266
      267
      268
      269
      270
      271
      272
      273
      274
      275
      Function Creerfiltre() As String
       
      'Déclaration des variables
       Dim f As String, strVal As String, lgAge1 As Long, lgAge2 As Long, dtHeure1 As Date, dtHeure2 As Date
       Dim strListeCJou As String
       Dim dtPeriode1 As Date, dtPeriode2 As Date
       
      f = ""
       
      ' SELECTION DE LA DATE PRECISE
      strVal = Nz(Me.Rdate, "")
      If strVal <> "" And IsDate(strVal) Then
         If f <> "" Then f = f & " AND "
         f = f & "[Date]=#" & Format(CDate(strVal), "mm\/dd\/yyyy") & "#"
      End If
       
      ' SELECTION DU JOUR DE LA SEMAINE
      strVal = Nz(Me.Rjour_sem.Column(1), "") ' colonne 2
      If strVal <> "" Then
         If f <> "" Then f = f & " AND "
         f = f & "Jsem = """ & strVal & """"
      End If
       
      ' SELECTION DU MOIS
      strVal = Nz(Me.Rmois.Column(1), "")
      If strVal <> "" And strVal <> "- - Choisir - -" Then
         If f <> "" Then f = f & " AND "
         f = f & "Month([Date])=" & strVal
      End If
       
      ' SELETION DE L'ANNEE
      strVal = Nz(Me.RAnnee, "")
      If strVal <> "" And strVal <> "- - Choisir - -" Then
         If f <> "" Then f = f & " AND "
         f = f & "Year([Date])=" & strVal
      End If
       
      ' SELECTION DE L'HEURE (tranche horaire)
      dtHeure1 = Nz(Me.Rtranche_horaire1, #1/1/1900#)
      dtHeure2 = Nz(Me.Rtranche_horaire2, #1/1/1900#)
       
      If (dtHeure1 <> #1/1/1900#) And (dtHeure2 <> #1/1/1900#) Then
         If f <> "" Then f = f & " AND "
         If dtHeure1 <= dtHeure2 Then
            f = f & "[Heure2] BETWEEN #" & Format(dtHeure1, "hh:nn") & "# AND #" & Format(dtHeure2, "hh:nn") & "#"
         Else
            f = f & "([Heure2] BETWEEN #" & Format(dtHeure1, "hh:nn:ss") & "# AND #23:59:59#"
            f = f & " OR "
            f = f & "[Heure2] BETWEEN #00:00:00# AND #" & Format(dtHeure2, "hh:nn:ss") & "#)"
         End If
      End If
       
      ' SELECTION DE LA PERIODE
      dtPeriode1 = Nz(Me.Rperiode1, #1/1/1900#)
      dtPeriode2 = Nz(Me.Rperiode2, #1/1/1900#)
       
      If (dtPeriode1 <> #1/1/1900#) And (dtPeriode2 <> #1/1/1900#) Then
         If f <> "" Then f = f & " AND "
         f = f & "[Date] BETWEEN #" & Format(dtPeriode1, "mm\/dd\/yyyy") & "# AND #" & Format(dtPeriode2, "mm\/dd\/yyyy") & "#"
      End If
       
      ' Si toutes les options sont sélectionnées : pas de critère sur champ CJou
      '                                           (Pas de critère = tout)
      ' Sinon ...
      If Not (Me.OptWE And Me.OptSemaine And Me.OptVFete And Me.OptFete) Then
          ' SELECTION DU WEEK-END
          If Me.OptWE = True Then
             If strListeCJou <> "" Then strListeCJou = strListeCJou & ", "
             strListeCJou = strListeCJou & "'Sam', 'Dim'"
          End If
       
          ' SELECTION DE LA SEMAINE
          If Me.OptSemaine = True Then
             If strListeCJou <> "" Then strListeCJou = strListeCJou & ", "
             strListeCJou = strListeCJou & "'Sem'"
          End If
       
          ' SELECTION DE LA VEILLE DE FETE
          If Me.OptVFete = True Then
             If strListeCJou <> "" Then strListeCJou = strListeCJou & ", "
             strListeCJou = strListeCJou & "'VFet'"
          End If
       
          ' SELECTION DE LA FETE
          If Me.OptFete = True Then
             If strListeCJou <> "" Then strListeCJou = strListeCJou & ", "
             strListeCJou = strListeCJou & "'Fet'"
          End If
       
          ' Ajout du critère sur champ CJou
          If Len(strListeCJou) > 0 Then
             If f <> "" Then f = f & " AND "
             f = f & "CJou IN (" & strListeCJou & ")"
          End If
      End If
       
       
      ' SELECTION DE LA LUMINOSITE
      strVal = Nz(Me.RLuminosite, "")
      If strVal <> "" And strVal <> "- - Choisir - -" Then
         If f <> "" Then f = f & " AND "
         f = f & "Lumi = """ & strVal & """"
      End If
       
      ' SELECTION DES CONDITIONS ATMOSPHERIQUES
      strVal = Nz(Me.RAtmo, "")
      If strVal <> "" And strVal <> "- - Choisir - -" Then
         If f <> "" Then f = f & " AND "
         f = f & "Atmo = """ & strVal & """"
      End If
       
      ' SELECTION DU PROFIL EN LONG
      strVal = Nz(Me.RProfil, "")
      If strVal <> "" And strVal <> "- - Choisir - -" Then
         If f <> "" Then f = f & " AND "
         f = f & "Plong = """ & strVal & """"
      End If
       
      ' SELECTION DU TRACE EN PLAN
      strVal = Nz(Me.RTrace, "")
      If strVal <> "" And strVal <> "- - Choisir - -" Then
         If f <> "" Then f = f & " AND "
         f = f & "[TPlan] = """ & strVal & """"
      End If
       
      ' SELECTION DE L'ETAT DE SURFACE
      strVal = Nz(Me.REtat, "")
      If strVal <> "" And strVal <> "- - Choisir - -" Then
         If f <> "" Then f = f & " AND "
         f = f & "[Surf] = """ & strVal & """"
      End If
       
      ' SELECTION DE L'AMENAGEMENT DE L'INFRASTRUCTURE
      strVal = Nz(Me.RAmenagement, "")
      If strVal <> "" And strVal <> "- - Choisir - -" Then
         If f <> "" Then f = f & " AND "
         f = f & "[Amen] = """ & strVal & """"
      End If
       
      ' SELECTION DE LA COMMUNE
      strVal = Nz(Me.RCom, "")
      If strVal <> "" And strVal <> "- - Choisir - -" Then
         If f <> "" Then f = f & " AND "
         f = f & "[Com] = """ & strVal & """"
      End If
       
      ' SELECTION D'UNE INTERSECTION
      ' LIKE permet de ne pas écrire exactement l'adresse
      'strVal = Nz(Me.RInter, "")
      'If strVal <> "" And strVal <> "- - Choisir - -" Then
      '   If f <> "" Then f = f & " AND "
      '   f = f & "Intersection LIKE ""*" & strVal & "*"""
      'End If
       
      ' SELECTION DU TYPE D'INTERSECTION
      strVal = Nz(Me.Rtype_inter, "")
      If strVal <> "" And strVal <> "- - Choisir - -" Then
         If f <> "" Then f = f & " AND "
         f = f & "Inter = """ & strVal & """"
      End If
       
      ' SELECTION DE L'ADRESSE
      ' LIKE permet de ne pas écrire exactement l'adresse
      strVal = Nz(Me.Radresse, "")
      If strVal <> "" And strVal <> "- - Choisir - -" Then
         If f <> "" Then f = f & " AND "
         f = f & "Adresse_concatenee_1 LIKE ""*" & strVal & "*"""
      End If
       
      ' SELECTION DE LA CATEGORIE DE VOIE
      strVal = Nz(Me.RCat_voie, "")
      If strVal <> "" And strVal <> "- - Choisir - -" Then
         If f <> "" Then f = f & " AND "
         f = f & "CatR = """ & strVal & """"
      End If
       
      ' SELECTION DU NUMERO (adresse)
       
      ' SELECTION DE LA VOIE SPECIALE
      strVal = Nz(Me.RVoie_spec, "")
      If strVal <> "" And strVal <> "- - Choisir - -" Then
         If f <> "" Then f = f & " AND "
         f = f & "VoiSp = """ & strVal & """"
      End If
       
      ' SELECTION DE LA LOCALISATION DE L'ACCIDENT
      strVal = Nz(Me.RLoca, "")
      If strVal <> "" And strVal <> "- - Choisir - -" Then
         If f <> "" Then f = f & " AND "
         f = f & "Situa = """ & strVal & """"
      End If
       
      ' SELECTION DE LA PROXIMITE OU NON D'UNE ECOLE
       
      ' SELECTION DU VEHICULE A IMPLIQUE
      'strVal = Nz(Me.RvehiculeA, "")
      'If strVal <> "" And strVal <> "- - Choisir - -" Then
      '  If f <> "" Then f = f & " AND "
      '   f = f & "CAdmin = """ & strVal & """"
      'End If
       
      ' SELECTION DU VEHICULE B IMPLIQUE
      'strVal = Nz(Me.RvehiculeB, "")
      'If strVal <> "" And strVal <> "- - Choisir - -" Then
      '   If f <> "" Then f = f & " AND "
      '   f = f & "Cadmin_2 = """ & strVal & """"
      'End If
       
      ' SELECTION DU TYPE DE COLLISION
      'strVal = Nz(Me.Rtypecol, "")
      'If strVal <> "" And strVal <> "- - Choisir - -" Then
      '   If f <> "" Then f = f & " AND "
      '   f = f & "Tcol = """ & strVal & """"
      'End If
       
      ' SELECTION DE L AGE (tranche d'âge)
      'lgAge1 = Nz(Me.Txtage1, 0)
      'lgAge2 = Nz(Me.Txtage2, 0)
      'If lgAge1 <> 0 And lgAge2 <> 0 Then
      '   If f <> "" Then f = f & " AND "
      '   f = f & "AgU BETWEEN " & CStr(lgAge1) & " AND " & CStr(lgAge2)
      'End If
       
      ' SELECTION DU SEXE
      'strVal = Nz(Me.Rsexe, "")
      'If strVal <> "" And strVal <> "- - Choisir - -" Then
      '   If f <> "" Then f = f & " AND "
      '   f = f & "Sexe = """ & strVal & """"
      'End If
       
      ' SELECTION DE LA CATEGORIE DE L'USAGER
      'strVal = Nz(Me.Rcat_usager, "")
      'If strVal <> "" And strVal <> "- - Choisir - -" Then
      '   If f <> "" Then f = f & " AND "
      '   f = f & "CatU = """ & strVal & """"
      'End If
       
      ' SELECTION DU NOMBRE DE VEHICULES IMPLIQUES
      'strVal = Nz(Me.Rnbvehic, "")
      'If strVal <> "" And strVal <> "- - Choisir - -" Then
      '   If f <> "" Then f = f & " AND "
      '   f = f & "Nveh = " & strVal
      'End If
       
      ' SELECTION DU NOMBRE D'USAGERS IMPLIQUES
      'strVal = Nz(Me.Rnbusagers, "")
      'If strVal <> "" And strVal <> "- - Choisir - -" Then
      '   If f <> "" Then f = f & " AND "
      '   f = f & "Nusa = " & strVal
      'End If
       
      ' NOMBRE DE TUES
      'strVal = Nz(Me.RNbtues, "")
      'If strVal <> "" And strVal <> "- - Choisir - -" Then
      '   If f <> "" Then f = f & " AND "
      '   f = f & "Ntu = " & strVal
      'End If
       
      ' NOMBRE DE BLESSES HOSPITALISES
      'strVal = Nz(Me.RNbBH, "")
      'If strVal <> "" And strVal <> "- - Choisir - -" Then
      '   If f <> "" Then f = f & " AND "
      '   f = f & "NBH = " & strVal
      'End If
       
      ' NOMBRE DE BLESSES NON HOSPITALISES
      'strVal = Nz(Me.RNbBNH, "")
      'If strVal <> "" And strVal <> "- - Choisir - -" Then
      '   If f <> "" Then f = f & " AND "
      '   f = f & "NBNH = " & strVal
      'End If
       
      Creerfiltre = f
      ' Me.txtFiltre = f
      End Function
      Attention aussi aux critère incompatibles entre eux.
      ex: Jour = Dim et Cjou = Sem


    • Formulaire résultats

      Si en source de données, on met le nom d'une table, on a tous les champs.
      Si on met le nom d'une requête ou une instruction, on n'a que les champs choisis.

      La source du formlaire est cette instruction SQL
      Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      SELECT Total.[Org/Unite/PV], Total.Date, Total.JSem, Total.Cjou, Total.Lumi, Total.Com, Total.Agglo, Total.Inter, Total.Atmo, Total.Tcol, Total.Numero, Total.Plong, Total.TPlan, Total.Surf, Total.Amen, Total.Intersection, Total.Adresse_concatenee_1, Total.CatR, Total.VoiSp, Total.Situa, Total.Pecole
      FROM Total;
      Il manque NTu, NBH, NBNH .

      Il manque aussi le champ [Heure2], ce qui empêche de filtrer dessus.
      J'ai pas tout testé, mais il faut que tous les champs sur lesquels on filtre soient dans le SELECT.

      Pour le total (tu parles bien de ma textbox "Nombre d'accidents sélectionnés" ?), le code =Compte (*) ne fonctionne toujours pas.
      Oui. Mais, moi aussi tous les contrôles ayant une formulaire étaient en erreur (les ####), tant que je n'ai solutionné le problème de champ absent de la source de données.

    • onglet "Véhicules impliqués"
      Voila ce que je ferai.
      Je lie la propriété Visible du premier contrôle, je l'inverse avec l'opérateur Not et j'applique cette nouvelle valeur à la propriété Visible des contrôles concernés.
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      Private Sub VehiculeB_Click()
      Dim bVal As Boolean
      ' Inverse valeur prop. Visible
      bVal = Not Me.RCat_vehB.Visible
       
      Me.RCat_vehB.Visible = bVal
      Me.RSensB.Visible = bVal
      Me.Modifiable183.Visible = bVal
      Me.RManoeuvreB.Visible = bVal
      Me.RObs_fixeB.Visible = bVal
      Me.RObs_mobB.Visible = bVal
      Me.RPt_chocB.Visible = bVal
      End Sub
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      Private Sub VehiculeC_Click()
      Dim bVal As Boolean
      ' Inverse valeur prop. Visible
      bVal = Not Me.RCat_vehC.Visible
       
      Me.RCat_vehC.Visible = bVal
      Me.RSensC.Visible = bVal
      Me.Modifiable197.Visible = bVal
      Me.RManoeuvreC.Visible = bVal
      Me.RObs_fixeC.Visible = bVal
      Me.RObs_mobC.Visible = bVal
      Me.RPt_chocC.Visible = bVal
      End Sub


    • Je voulais t'inciter à ouvrir une discussion par question/sujet technique, parce que ...
      • Ce sont les règles du forum
      • Cela permet à un visiteur de mieux s'y retrouver.
        Là je te garantie que personne n'ira lire une discussion de plus de 2 pages.
        C'est devenu une discussion privée.
      • C'est plus simple pour celui qui répond (moi )
        En principe je répond aux questions qui m'intéressent, où pour lesquelles je me sens à l'aise


      La question d'origine porte sur le filtrage de données (recherche multicritères).
      Donc aucun problème à ce que la discussion se poursuive la-dessus (c'est à dire la fonction Creerfiltre()).

      Par contre des questions sur la sécurité, comment masquer des contrôles en cliquant sur une étiquette, comment masquer le sélecteur d'enregistrements, ... ce sont d'autres sujets.

      D'ailleurs, je te rassure si besoin est : tu es largement compétent pour moi
      Merci. C'était dans ton intérêt que j'avouais ne pas compétent dans tout Access.

    A+

  12. #52
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 115
    Points : 41
    Points
    41
    Par défaut
    Salut,

    Merci pour ces réponses et ton suivi.
    Alors les remarques :

    -
    Il y peut-être un problème de copier/coller du code.
    Alors j'ai vérifié et testé d'autres choses et je me suis dit que c'était sans doute pas une erreur de copié-collé. Alors je t'explique. Quand on ouvre le formulaire, les cases à cocher ne sont pas vides mais un peu grisées...je sais pas si tu vois. En fait, rien n'est sélectionné mais elles ne sont pas vides non plus. Je sais pas si je suis clair. Donc, en fait, si je clique sur mon bouton "Effacer", elles se vides (elles deviennent blanches) et à partir de là, les filtres fonctionnent super bien. Donc, la solution, çà devrait être de vider les cases à chaque ouverture du formulaire non ?

    - Ok pour le formulaire "Résultats" : j'ai donc mis ma table "Total" en source et tout fonctionne bien

    - Ok pour les codes sur les étiquettes : tout s'affiche bien.

    - ensuite, petite question pour la fonction CreerFiltre() : notamment sur les cases à cocher : alors, si tu te souviens, on a une case à cocher "Week-end" et donc dans le code, tu proposes logiquement de prendre le samedi et le dimanche. Sauf que, je viens de lire dans une doc que pour les accidents, on considère que le week-end commence le vendredi à 18H et se finit le lundi vers 5h du matin...donc ma question est : est-ce qu'il est possible d'intégrer une requête SQL dans le code afin de sélectionner çà ?

    Bon je crois que c'est tout pour le moment. Encore merci. A+

  13. #53
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,

    • Pour les cases à cocher (ou cases d'options), il faut mettre la propriété "Valeur par défaut" à Faux (False).
      Quand elles sont grisées, cela signifie qu'elles ne sont pas initialisées.
      Elles ne contiennent Null, ce qui veut dire aucune valeur.
      Null est valable quel que soit le type du champ.
      En gros ça veut dire vide.

    • on a une case à cocher "Week-end" et donc dans le code, tu proposes logiquement de prendre le samedi et le dimanche. Sauf que, je viens de lire dans une doc que pour les accidents, on considère que le week-end commence le vendredi à 18H et se finit le lundi vers 5h du matin
      En fait, je n'ai pas résonné sur le jour de la semaine, mais en fonction du contenu du champ CJou.
      Comme il n'y avait que 'Sem', 'VFet', 'Fet', 'Sam', 'Dim', j'en ai déduit que Weekend correspondait à 'Sam' ou 'Dim'.

      D'après ce que tu me dis, dans le champ CJou on peut exploiter que 'VFet' et 'Fet'.
      Ça complique beaucoup les choses.
      En effet, pour Semaine et Weekend le critère porte sur les champs JSem et Heure2
      Pour Veille de fête et fête, le critère porte sur le champ CJou.

      En basant le critère sur le seul champ Cjou, chaque option (weekend, semaine, veille de fête, fête) représente un sous-ensemble disjoint.
      La somme de ces sous-ensembles est la totalité des enregistrements.

      Si je fais comme indiqué plus haut (critères WE et Sem sur JSem et Heure2; critères Vfet et Fet sur CJou), les sous-ensembles peuvent se chevaucher.

      La question est donc, comment doit-on combiner ces quatre options ?
      Avec des ET ou des OU ?
      Par exemple si je sélectionne Semaine et Weekend et Fête.
      Semaine + Weekend représente déjà tous les enregistrement.

      Je ne sais pas trop si tu me suis ?

      Je vois en gros deux solutions.
      1. Eclater les quatre options en deux groupes :
        Semaine / Weekend
        Veille Fête / Fête
        Le critère sera (Semaine ET/OU Weekend) ET (Veille Fête ET/OU Fête)
      2. Mettre à jour le champ CJou de telle sorte que son contenu ne puisse être qu'une des quatre valeurs possibles :
        Fet ou VFet ou Sem ou WE
        Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
        1
        2
        3
        UPDATE Total 
        SET Total.Cjou = IIf(([JSem]='Ven' And [Heure2]>=#18:0:0#) Or ([JSem] In ('Sam','Dim')) Or ([JSem]='Lun' And [Heure2]<#5:0:0#),"WE","Sem")
        WHERE (((Total.Cjou) Not In ('Fet','VFet')));

      La solution 2 est la plus simple.
      Une fois le champ à CJou à jour, il suffit de modifier le code
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
          ' SELECTION DU WEEK-END
          If Me.OptWE = True Then
             If strListeCJou <> "" Then strListeCJou = strListeCJou & ", "
             strListeCJou = strListeCJou & "'Sam', 'Dim'"
          End If
      en
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
          ' SELECTION DU WEEK-END
          If Me.OptWE = True Then
             If strListeCJou <> "" Then strListeCJou = strListeCJou & ", "
             strListeCJou = strListeCJou & "'WE'"
          End If
    A+

  14. #54
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 115
    Points : 41
    Points
    41
    Par défaut
    Bonjour,

    Désolé pour le retard, je n'avais pas fait vu que tu m'avais répondu aussi vite...

    Bon, donc je reprends un peu.

    - alors pour les cases d'option, c'est bon, le problème est réglé. Il fallait donc bien modifier les valeurs par défaut.

    -
    Je ne sais pas trop si tu me suis ?
    Si je te suis. C'est exactement çà, et c'était logique aussi pour moi de penser que week-end était égal au samedi et dimanche... Je vais modifier mon champ.

    Ensuite, j'ai quelques questions (des "bugs" sont apparus...) :

    - pour la sélection de la tranche d'âge : je ne peux pas faire commencer la tranche d'âge à zéro et l'âge maxi est 99 ans...alors qu'il se pourrait qu'un passager (car on prend en compte aussi les passagers dans ce champ) ait plus de 100 ans. Comment résoudre ce problème et pendant qu'on y est, comment spécifier un âge maxi (comme 150 ans par exemple) ?

    - pour toutes les listes déroulantes, parfois le champ est vide, et donc dans la liste, on peut choisir le champ vide, sauf que dans les résultats, on n'obtient pas le nombre de champs vides mais tout l'ensemble. Je sais pas si tu vois ce que je veux dire ?

    - une erreur se produit tout le temps quand je clique sur le bouton Effacer lorsque des critères sur des chiffres sont en cause : par exemple, si je fais une sélection sur le nombre de tués et que je clique sur Effacer, il y a un bug. A quoi est-ce du et comment faire pour résoudre ce problème ?

    - enfin, comment faire pour qu'une msgbox apparaisse dès qu'on clique sur Rechercher afin de savoir combien de critères sont pris en compte ? En fait, c'est juste qu'avec les onglets, des fois, on oublie qu'on a déjà un critère sélectionné et çà fausse la requête que l'on veut vraiment...C'est juste pour aider l'utilisateur en fait...

    Bon, je crois que c'est déjà pas mal pour le moment. Merci et encore désolé pour le retard. Bonne journée LedZepII

  15. #55
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut sélection de la tranche d'âge
    Bonsoir,

    Pour autoriser la valeur 0, modifier comme suit dans la fonction Creerfiltre()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ' SELECTION DE L AGE (tranche d'âge)
    lgAge1 = Nz(Me.Txtage1, 999)
    lgAge2 = Nz(Me.Txtage2, 999)
    If lgAge1 <> 999 And lgAge2 <> 999 Then
       If f <> "" Then f = f & " AND "
       f = f & "AgU BETWEEN " & CStr(lgAge1) & " AND " & CStr(lgAge2)
    End If
    Comme les zones de texte Txtage1 et Txtage2 contiennent des nombres ou rien,
    mets la propriété "Format" à "Nombre général".

    J'ai essayé d'améliorer les contrôles de validité :
    Code vba : 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
    29
    Private Sub Txtage1_Exit(Cancel As Integer)
    Dim lgAge1 As Long, lgAge2 As Long
     
    lgAge1 = Nz(Me.Txtage1, 999)
    lgAge2 = Nz(Me.Txtage2, 999)
     
    If lgAge1 = 999 Then
       ' Âge1 vide
       If lgAge2 <> 999 Then
          ' Âge2 non vide
          MsgBox "Entrez une valeur inférieure à " & CStr(lgAge2)
          Cancel = True
       End If
    Else
       ' Âge1 non vide
       If lgAge2 <> 999 Then
          ' Âge2 non vide
          If lgAge1 < 0 Or lgAge1 > lgAge2 Then
             MsgBox "Entrez une valeur entre 0 et " & CStr(lgAge2)
             Cancel = True
          End If
       ElseIf lgAge1 < 0 Or lgAge1 > 150 Then
          ' Âge2 vide et Âge1 non compris en 0 et 150
          MsgBox "Entrez une valeur entre 0 et 150"
          Cancel = True
       End If
    End If
     
    End Sub
    Code vba : 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
    Private Sub Txtage2_Exit(Cancel As Integer)
    Dim lgAge1 As Long, lgAge2 As Long
     
    lgAge1 = Nz(Me.Txtage1, 999)
    lgAge2 = Nz(Me.Txtage2, 999)
    If lgAge1 <> 999 Then
       ' Âge1 est saisi. On vérifie que Âge2 >= Âge1
       If lgAge2 < lgAge1 Or lgAge2 > 150 Then
          MsgBox "Entrez une valeur entre " & CStr(lgAge1) & " 150"
          Cancel = True
       End If
    Else
       ' Âge1 n'est pas saisi
       If lgAge2 >= 0 And lgAge2 <= 150 Then
          ' Âge2 est valide, mais Âge1 est vide. On force la saisie de Âge1
          MsgBox "Vous devez entrer un âge minimum"
          Me.Txtage1.SetFocus
       ElseIf lgAge2 <> 999 Then
          ' Âge2 n'est pas valide
          MsgBox "Entrez une valeur entre 0 et 150"
          Cancel = True
       End If
    End If
     
    End Sub
    Mais bon. Pas facile de prendre en compte tous les cas de figures.

    Je regarde les autres problèmes.

    A+

  16. #56
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut Erreur bouton Effacer
    Effectivement la valeur texte "- - Choisir - -" ne semble pas compatible avec la colonne liée lorsque celle-ci est un champ numérique.

    Problème rencontré avec la liste déroulant Année.

    Solution : remplacer la première colonne par une colonne de type texte.
    Je l'ai fait pour les requêtes convernées :
    Code sql requête "Nombre de véhicules impliqués" : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT CStr([Nveh]) AS Expr1, Total.Nveh
    FROM Total
    GROUP BY CStr([Nveh]), Total.Nveh
    ORDER BY Total.Nveh;
    Code sql requête "Nombre d'usagers impliqués" : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT CStr([Nusa]) AS Expr1, Total.Nusa
    FROM Total
    GROUP BY CStr([Nusa]), Total.Nusa
    ORDER BY Total.Nusa;
    Code sql requête "Nombre de tués" : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT CStr([NTu]) AS Expr1, Total.NTu
    FROM Total
    GROUP BY CStr([NTu]), Total.NTu
    ORDER BY Total.NTu;
    Code sql requête "Nombre de BH" : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT CStr([NBH]) AS Expr1, Total.NBH
    FROM Total
    GROUP BY CStr([NBH]), Total.NBH
    ORDER BY Total.NBH;
    Code sql requête "Nombre de BNH" : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT CStr([NBNH]) AS Expr1, Total.NBNH
    FROM Total
    GROUP BY CStr([NBNH]), Total.NBNH
    ORDER BY Total.NBNH;

    En mode création dans la requête, je duplique la 1ère colonne dans la deuxième (qui est vide).
    Sur la deuxième colonne, je mets un trie ascendant.
    Je modifie le champ de la première colonne de nom_champ en CChaîne([nom_champ])
    Expr1 se rajoute tout seul.

    Cette solution est valable pour des nombres entiers.
    Sur des nombres décimaux il faudrait en plus modifier le code de CreerFiltre()

  17. #57
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut listes déroulantes avec valeur vide (Null)
    Voila un exemple pour gérer le cas d'un champ Null.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ' SELECTION DU VEHICULE B IMPLIQUE
    strVal = Nz(Me.RvehiculeB, "")
    If strVal <> "- - Choisir - -" Then
       If f <> "" Then f = f & " AND "
       If IsNull(Me.RvehiculeB) Then
          f = f & "(Cadmin_2) Is Null"
       Else
          f = f & "Cadmin_2 = """ & strVal & """"
       End If
    End If
    Lorsque qu'on veut sélectionner des champs vides, il faut comparer le contenu à la valeur Null et l'opérateur de comparaison est Is à la place de = .

    Avec cette liste déroulante (RvehiculeB), il est possible de distinguer le Null consécutif à l'absence de sélection,
    du Null venant d'une sélection, du fait de la valeur par défaut qui n'appartient pas à la liste.
    Dans le cas contraire, il faut coder autrement.

    Exemple pour une liste déroulante ou une liste à sélection simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ' SELECTION DU VEHICULE A IMPLIQUE
    If Me.RvehiculeA.ListIndex <> -1 Then
       strVal = Nz(Me.RvehiculeA, "")
       If f <> "" Then f = f & " AND "
       If IsNull(Me.RvehiculeA) Then
          f = f & "(CAdmin) Is Null"
       Else
          f = f & "CAdmin = """ & strVal & """"
       End If
    End If

  18. #58
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut compter critères de sélection
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    comment faire pour qu'une msgbox apparaisse dès qu'on clique sur Rechercher afin de savoir combien de critères sont pris en compte ?
    Je ne vois qu'une solution bête et méchante.
    Incrémenter un compteur à chaque ligne du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
          f = f & "Nom_Champ ....." .......
    Dans le module de code du formulaire, ajouter un variable globale
    Dans CreerFiltre, mettre le compteur à zéro au début
    A chaque concaténation d'un critère à la variable f, incrémenter le compteur
    Penser aussi à le remettre à zéro dans le code du bouton d'effacement des critères.
    Pas forcément pertinent, mais on ne sait jamais.

    Dans le code du bouton pour filtrer, mettre (après l'appel à Creerfiltre)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox lgNbCrit & " critère(s)
    A+

  19. #59
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 115
    Points : 41
    Points
    41
    Par défaut
    Salut,

    Waouh, merci pour toutes ces réponses...quelle bonne surprise ce matin !
    Alors, je fais le point :

    - pour autoriser la valeur zéro pour les tranches d'âge ainsi qu'une valeur max, c'est réglé. Ta solution me convient parfaitement. Merci

    - pour le problème avec le bouton Effacer et les chiffres (notamment listes nombre de véhicules impliqués, nombre de tués...) : j'ai essayé ton code sauf qu'il persiste un petit problème. Je t'explique : à l'ouverture du formulaire, si je clique sur une liste déroulante, je choisis le chiffre 1 pour le nombre de véhicules impliqués. Puis je ne clique pas sur Rechercher mais sur Effacer tout de suite, et c'est là qu'apparait l'erreur. Sans doute à cause de la valeur par défaut...("- - choisir - -"). Faut-il que je l'enlève pour que çà fonctionne ? Ensuite, si je clique sur rechercher, çà fonctionne.

    Effectivement la valeur texte "- - Choisir - -" ne semble pas compatible avec la colonne liée lorsque celle-ci est un champ numérique.

    Problème rencontré avec la liste déroulant Année.
    Quel problème rencontres-tu avec la liste sur l'année ?

    - pour prendre en compte les champs vides des listes déroulantes (exemple de la sélection du véhicule B) : pas de problème, çà fonctionne. Mais par contre, je ne comprends pas la distinction avec çà :
    Avec cette liste déroulante (RvehiculeB), il est possible de distinguer le Null consécutif à l'absence de sélection,
    du Null venant d'une sélection, du fait de la valeur par défaut qui n'appartient pas à la liste.
    Dans le cas contraire, il faut coder autrement.
    Tu veux dire que c'est un code particulier quand on a pas de valeur par défaut comme "- - Choisir - -" ? ou c'est autre chose ?

    - enfin, pour la msgbox, j'ai oublié de préciser (et je crois que çà va compliquer un peu les choses) que j'aimerais savoir quels critères sont sélectionnés également. Donc c'est sans doute la bonne méthode mais est-il possible de retrouver quels critères sont sélectionnés ? Si c'est trop compliqué, tant pis. Je posterai peut-être plus tard dans un nouveau sujet (mais bon, c'est juste de l'esthétique çà...).

    - une petite question pour la route : je voudrais rajouter des cases à cocher dans mon onglet "Véhicules impliqués" afin de sélectionner uniquement les VL (véhicule léger) par exemple. Ça veut donc dire que la requête va se baser sur plusieurs champs (CAdmin, Cadmin_2, Cadmin_3) ou bien sur le champ de récapitulation NVL (qui correspond à nombre de VL). Pour l'instant, j'ai fait çà :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ' SELECTION DES VL UNIQUEMENT
    If Me.OptVL = True Then
       If f <> "" Then f = f & " AND "
       f = f & "NVL >= 1"
    End If
    Il faut sans doute que je spécifie que le nombre de PL (poids lourds) doit être égal à zéro...ce genre de chose non ?

    - enfin, dans mon état "Résultats", sur lequel on arrive quand on clique sur "Rechercher", j'ai créé de nouvelles txtbox permettant d'avoir le détail des véhicules concernés (nombre de VL, de PL, de 2 roues légers, et 2 roues motorisés...). J'ai également créé une autre txtbox correspondant aux autres catégories que celles évoquées ci-dessous (car ce sont les principales) : dans le code, j'ai donc voulu faire le total des véhicules moins la somme des 4 txtbox (VL, PL, 2RL, 2RM) mais çà ne fonctionne pas. Est-ce que tu saurais où est-ce que je me plante ? est-ce parce que je me base sur des calculs qui se font en même temps à l'ouverture de l'état ?

    Bon, merci pour tout. Bonne journée et à bientôt. A+

  20. #60
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonsoir,

    • bouton Effacer
      Chez moi ça fonctionne, depuis que j'ai modifié les requêtes, de manière à ce que la première colonne (celle qui est liée à la propriété .Value) soit du texte.
      Ma réponse s'appliquait au formulaire "Total"

      Pour Année, je faisais référence à ce post.

    • Valeur Null sélectionnée
      Ce que je voulais dire, c'est que la propriété .Value d'une liste déroulante peut contenir Null dans deux cas :
      1. Null est une des valeurs de la colonne liée de la liste.
      2. Aucune sélection n'a été faite.

      Mon code d'origine était basé sur le fait que Null n'était pas une valeur possible, et était interprété comme "Aucune sélection".
      Lorsque qu'aucune sélection n'est faite et qu'une valeur par défaut est définie, la propriété Value est égale à la valeur par défaut.
      On n'a donc pas Null, et cela évite la confusion entre les cas 1. et 2.

    • MsgBox critères
      Ce n'est pas difficile à faire. Juste long à écrire.
      En parallèle, on alimente la variable f et une variable globale.
      Je l'ai fait pour le formulaire "Total"

    Pour ce qui concerne le bouton effacer et la MsgBox, regarde le formulaire Total.

    A+
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. Requête sur plusieurs listes déroulantes
    Par Olivierporcinet dans le forum Access
    Réponses: 3
    Dernier message: 07/05/2012, 09h50
  2. Liste déroulante dans cellule. Bouton n'apparait pas
    Par pat91 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 07/05/2010, 16h23
  3. Liste déroulante dans cellule. Bouton n'apparait pas
    Par JML62400 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 24/02/2009, 06h44
  4. [MySQL] Faire apparaître la sélection d'une liste déroulante dans une zone de texte
    Par emmy99 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 30/03/2008, 14h11
  5. Réponses: 2
    Dernier message: 15/02/2008, 14h48

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