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 :

faire une routine de comparaison en VBA


Sujet :

VBA Access

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2021
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Février 2021
    Messages : 7
    Points : 2
    Points
    2
    Par défaut faire une routine de comparaison en VBA
    bonjour à toutes et à tous


    Je suis novice en programmation VBA et SQL pour mocrosoft Access

    J'ai crée une table avec 3 champs (un champ de données "HV" numérique ,un champ "pourcentage" en numérique et un champ réponse "HE" suivant l'entrée des 2 premiers champs) , j'ai réussi à crée un requête qui fonctionne qui m'affiche le troisième champ "HE" suivant la quantité "HV" demandée ainsi que le pourcentage souhaité.
    code de la requete :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM HE
    WHERE (((HV_ml)=[Quelle quantité en ml ? ])) AND (((Pourcentage) =[Quel pourcentage voulez-vous ?]));

    le problème est que lorsque l'utilisateur tape la valeur voulue qui correspond au premier champ HV si cette valeur n'existe pas dans le champ , le programme renvoie une solution vide idem pour la comparaison avec le champ "pourcentage".

    J'aimerai pouvoir créer une routine en sql ou en vba qui teste si la donnée entrée par l'utilisateur correspond à une valeur du premier champ "HV" si ce n'est pas le cas renvoyer un message et la demande entrée une autre valeur à l'utilisateur pour qu'il retape une valeur qui existe dans ce champ "HV" , idem pour la seconde valeur pour le champ "pourcentage"

    Merci pour votre réponse

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Hum, HE n'est à priori pas un champ mais une table (une collection d'enregistrements ou de lignes).
    Si aucun enregistrement ne correspond à tes critères il est normal que tu obtiennes 0 enregistrement.

    La solution la plus simple, selon moi, est de faire un formulaire de saisie avec 2 listes déroulantes qui présentent les valeurs possibles.
    Les SQL pour les listes pourrait ressembler à :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select [HE].[HV_ml] from [HE]
    group by [HE].[HV_ml]
    order by [HE].[HV_ml]
    Il y a un assistant de création de liste déroulante qui va te guider.
    L'avantage des listes c'est qu'elles ne présentent que des valeurs qui existent et limite ainsi le choix des utilisateurs.
    Attention, il ne faut pas qu'il y ai trop de valeurs dans tes listes, passé le millier Access a du mal à suivre.

    Je vais supposer que ton formulaire s'appelle frmParam.

    Après tu peux faire une requête du genre :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Select [HE].* from [HE]
    where [HE].[HV_ml] = [Forms]![frmParam]![HV_ml] and [HE].[pourcentage] = [Forms]![frmParam]![pourcentage]

    MV_ml et pourcentage sont les noms que tu as donné aux listes dans le formulaire frmParam.
    Tu peux par exemple mettre les listes dans l'entête du formulaire et le résultat dans les détails.

    Le seul code qui sera peut-être nécessaire devrait ressembler à cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    private sub MAJ_Data()
        if me.HV_ML<>"" and me.pourcentage<>"" then
           me.requery 'Force la recherche seulement si les 2 listes sont renseignées
        end if
    end sub
    À appeler depuis le code de la procédure événementielle associée aux champs HV_ml et pourcentage comme ceci :

    ou

    Un conseil avec l'écriture de SQL dans Access, la meilleur façon de le faire est de laisser faire Access en utilisant l'éditeur de requête. La syntaxe SQL de Access peut être assez exotique.

    Je t'invite aussi à regarder les tutoriaux sur les formulaires de recherches : https://access.developpez.com/cours/...#formrecherche. Il y en a pour tous les goûts du plus simple au plus complexe.

    Et enfin pourquoi passer par un formulaire ?
    Parce qu'il est recommandé de ne pas donner un accès direct aux requêtes et aux tables de la BD aux utilisateurs.
    Une bonne interface masque la complexité de la solution en permettant à l'utilisateur de se concentrer sur son travail (ici trouver la valeur) et protège ta BD des modifications inattendues.
    Si on veut faire une métaphore mécanique, quand tu conduits une voiture tu prends le volant, tu ne vas pas sous le capot pour trouver la mécanique qui fait pivoter les roues et tirer dessus. Le volant (l'interface) te masque la complexité du mécanisme de la direction.
    Elle a un autre avantage c'est que si tu décides de changer la façon de procéder pour l'utilisateur l'interface reste la même. Si on file ma métaphore automobile, si tu décides de remplacer la colonne de direction et la cramaillière par un moteur électrique et un capteur de rotation sous le volant tu n'as pas réapprendre à conduire la voiture, tu te contentes de tourner le volant comme avant. De ton point de vue rien n'a changé.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2021
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Février 2021
    Messages : 7
    Points : 2
    Points
    2
    Par défaut Remerciement à Marot_r
    Je te remercie sincèrement pour ta réponse , ainsi que le petit cours sur la façon de programmer ACCESS , je suis juste à utilisateur d'ACCESS , je trouve qu'il est très pratique
    Pour revenir au sujet qui me préoccupait,j'avais créer suite à ma requëte un formulaire qui m'affichait les valeurs saisies par l'utilisateur ainsi que le résultat.
    J'ai bien pris note de ce que tu m'as expliqué, pourquoi il fallait passer par le formulaire ( chose que je ne savais pas )
    Encore merci pour ton aide , je te souhaite une très agréable journée

    Très cordialement Rabah

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2021
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Février 2021
    Messages : 7
    Points : 2
    Points
    2
    Par défaut explication du projet
    Bonjour marot_r,

    je me demande comment faire pour créer les 2 listes pour comparer les valeurs à ceux entrées par l'utilisateur

    J'ai essayé ce que tu m'as envoyé mais je n'y arrive pas , je ne suis pas très doué désolé

    Pour information ,j'ai essayé le code VBA que tu as écris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private sub MAJ_Data()
        if me.HV_ML<>"" and me.pourcentage<>"" then
           me.requery 'Force la recherche seulement si les 2 listes sont renseignées
        end if
    me.HV_ML et me.pourcentage ? (quand je le lance Access me revoie erreur de compilation : "utilisation incorrecte du mot clé Me"

    Me est-ce le nom de la table ou de la requête ?

    J'ai pensé à la table HE , en remplaçant me par HE mais Access me revoie "erreur d'exècution '424' objet requis"

    Pour simplifier, mon projet était de faire grâce à Access une base de données permettant de calculer le mélange Huile végétale et Huile essentielle
    comme je te l'ai déjà formulé dans mon premier message cela fonctionne seulement quand l'utilisateur entre les données existantes dans les 2 champs.
    D'ailleurs je t'envoie le fichier Word pour plus de clarté

    Je te souhaite une bonne journée

    Très cordialement
    Rabah
    Fichiers attachés Fichiers attachés

  5. #5
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Dans un formulaire Me. réfère au formulaire lui-même.
    Là je m'attendais à ce que tu ais 2 champs (listes déroulantes), une qui s'appelle HV_ml et l'autre pourcentage.
    C'est généralement une bonne idée de nommer les champs de saisie comme les champs qui sont dans ta source de données.
    Ça facilite la maintenance le nom d'une chose est le même partout donc quand tu le vois tu sais que c'est cette chose ou quelque chose qui s'y réfère.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2021
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Février 2021
    Messages : 7
    Points : 2
    Points
    2
    Par défaut Merci pour ton retour
    Bonjour,

    Merci pour l'information

    Bon week-end

    Trés Cordialement

  7. #7
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Comme j'avais un peu de temps je t'ai fait une micro BD exemple.

    MiniBD.zip

    J'ai utilisé une structure Formulaire + SousFormulaire qui offre plus de possibilités de présentations et interactions.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  8. #8
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2021
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Février 2021
    Messages : 7
    Points : 2
    Points
    2
    Par défaut projet "mesurer la quantité Huile essentielle selon pourcentage souhaité par rapport au contenant utilisé"
    Merci pour ton fichier, je t'envoie le mien pour information
    Je voudrais le conserver tel qu'il est en ajoutant simplement le test d'entrée de l'utilisateur ( juste renvoyé un message si le choix entré n'est pas dans le champ HV_ml (contenance totale du bocal utilisé pour le mélange) de la table, si ce n'est pas le cas proposer à l'utilisateur de retapez la valeur avec un message qui affiche les contenances existantes), idem pour les pourcentages voulus (% de l'huile essentielle mélangée avec l'huile végétale (exemple huile d'olive)).
    Est-ce possible sans utiliser les listes ?
    Si tu as une idée qui permet cela soit avec le langage SQL ou en VBA , cela serait cool.

    Merci encore pour ton aide

    Rabah
    Fichiers attachés Fichiers attachés

  9. #9
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Oui on peut se passer des listes, c'est juste un peu plus compliqué.

    Pour valider si une valeur est dans la table tu peux faire un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if isnull(dfirst("TonChamp", "TaTable", "[TonChamp]=" & me.TonChampSaisie)) then
       msgbox "Il n'y a pas de valeur : " & me.TonChampSaisie & " dans la base. Merci de corriger", vbExclamation
    end if
    Le truc avec cette option c'est que l'utilisateur doit deviner quelle valeur il pourrait bien mettre alors qu'avec les listes il sait directement ce que le système attend.

    Note que bien que les 2 valeurs saisies peuvent exister, elles ne sont pas forcément dans le même enregistrement donc tu pourrais quand même ne pas avoir de réponse à afficher.

    On peut faire du code pour cela aussi avec un truc du genre après avoir demandé la mise à jour des données

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if me.recordet.count=0 then
       'Aucun enregistrement retourné
       msgbox "Il n'y a pas de données correspondant à vos critères. Merci de corriger", vbExclamation
    end if
    A+
    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  10. #10
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2021
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Février 2021
    Messages : 7
    Points : 2
    Points
    2
    Par défaut Remerciement
    Bonjour Marot_r,

    Merci pour toutes tes informations cela m'a bien aidé,j'ai essayé avec VBA (c'est trop prise de tête, je ne suis pas assez doué , je n'ai pas réussi à faire le test)
    En fait c'est toi qui a raison,je vais finalement opter en utilisant les listes cela parait plus pratique pour l'utilisateur.

    Je te tiendrais au courant si j'y arrive

    Bonne fin de semaine

    Encore Merci pour ton aide


    Très cordialement

  11. #11
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2021
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Février 2021
    Messages : 7
    Points : 2
    Points
    2
    Par défaut fichier Access en utilisant les listes
    Bonjour marot_r ,

    J'ai réussi à trouver une solution avec l'aide des listes.Je t'envoie le fichier Access correspondant.
    Désolé,pour soigner la présentation, j'ai essayé d'agrandir la photo de fond, j'aurais voulu qu'elle prenne tout le fond.Je crois que cela vient surement du format de la photo.

    Je suis content d'avoir réussi à comprendre comment fonctionnent les listes

    Merci encore de ton aide

    Prends soins de toi en ces temps de pandémie


    Très cordialement

    Rabah
    Fichiers attachés Fichiers attachés
    • Type de fichier : rar he.rar (755,2 Ko, 32 affichages)

  12. #12
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Pour la photo, c'est à mon avis un des propriétés du contrôle d'affichage (je ne me souviens plus de son nom) mais elle offre Zoom qui agrandi la photo à la taille dispo, mosaïque (de mémoire) qui répète la photo si elle est trop petite pour couvrir la surface. Perso je ne me suis jamais servi que de Zoom et cela fait un bail que je ne mets plus de photo en fond de formulaire.
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

Discussions similaires

  1. Faire une selection par mois en Vba
    Par Ram34 dans le forum VBA Access
    Réponses: 4
    Dernier message: 01/08/2012, 13h41
  2. [XL-2007] comment faire une Jointure SQL en excel VBA
    Par Maxim0 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 01/07/2011, 19h04
  3. faire une routine sur ts les fichiers xls d'un répertoire ?
    Par tibofo dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 25/03/2010, 23h45
  4. Faire une copie d'écran en vba
    Par deubelte dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 21/10/2009, 12h10
  5. Faire une MAJ de recordsetclone par VBA.
    Par electrosat03 dans le forum Access
    Réponses: 4
    Dernier message: 03/02/2006, 17h42

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