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

Access Discussion :

Transformer une formule Excel en Access 2016


Sujet :

Access

  1. #21
    Nouveau membre du Club
    Expressions Access
    La formule qui ne fonctionne pas

    PremVrai([fonc_ad]"soutien";"0";[Sur_fo]<=50000;"5";[Sur_fo]>50000 et [Sur_fo]<=100000;"10";[Sur_fo]>100000 et [Sur_fo]<=200000;"20";[Sur_fo]>200000 et [Sur_fo]<=500000;"50";[Sur_fo]>500000 et [Sur_fo]<=750000;"75";[Sur_fo]>750000 et [Sur_fo]<=1000000;"100";[Sur_fo]>1000000 et [Sur_fo]<=1500000;"150";[Sur_fo]>1500000 et [Sur_fo]<=2000000;"200";[Sur_fo]>2000000 et [Sur_fo]<=3000000;"300";[Sur_fo]>3000000 et [Sur_fo]<=4000000;"400";[Sur_fo]>4000000 et [Sur_fo]<=5000000;"500";[Sur_fo]>5000000 et [Sur_fo]>5000000;"+500";faux;"?")

    Celle qui fonctionne très bien sans fonc_ad en fait les surfaces sont en m² alors que les classes en hectares- 9 00 00 ou 10 00 00 ² donnera "10" et 10 00 01 donnera "20" OK

    Expr1: PremVrai([Sur_fo]<=50000;"5";[Sur_fo]>50000 Et [Sur_fo]<=100000;"10";[Sur_fo]>100000 Et [Sur_fo]<=200000;"20";[Sur_fo]>200000 Et [Sur_fo]<=500000;"50";[Sur_fo]>500000 Et [Sur_fo]<=750000;"75";[Sur_fo]>750000 Et [Sur_fo]<=1000000;"100";[Sur_fo]>1000000 Et [Sur_fo]<=1500000;"150";[Sur_fo]>1500000 Et [Sur_fo]<=2000000;"200";[Sur_fo]>2000000 Et [Sur_fo]<=3000000;"300";[Sur_fo]>3000000 Et [Sur_fo]<=4000000;"400";[Sur_fo]>4000000 Et [Sur_fo]<=5000000;"500";[Sur_fo]>5000000 Et [Sur_fo]>5000000;"+500";Vrai;"?")

    D'accord l'expression faux;"?" ne fonctionnera jamais mais si cela n'a pas d'importance ! mais : [fonc_ad]"soutien";"0"; m'intéresse- .
    Je crois l'avoir signaler la requête s'appliquera à tous les enregistrements.

    Alors est ce que je peux inclure cette formule dans le formulaire alors elles appliquerais uniquement a celui-ci et je préférerais.
    Je crois avoir lu que c' étais possible en précédent la formule de =

    Merci pour vos informations

  2. #22
    Responsable
    Office & Excel

    Dans ta formule, il manque le signe = entre [fonc_ad] et "soutien"!


    PremVrai([fonc_ad]="soutien";"0";[Sur_fo]<=50000;"5";...

    Je me demande parfois si les réponses sont lues...




    Et je ne peux que te conseiller d'essayer SANS REPETER TES PLAFONDS, comme je l'ai illustré dans mon message précédent... Ils ne servent à rien et alourdissent ta formule


    Dans ta formule, tout ce que j'ai mis en gras ne sert à rien:

    PremVrai([fonc_ad]="soutien";"0";[Sur_fo]<=50000;"5";[Sur_fo]>50000 et [Sur_fo]<=100000;"10";[Sur_fo]>100000 et [Sur_fo]<=200000;"20";[Sur_fo]>200000 et [Sur_fo]<=500000;"50";[Sur_fo]>500000 et [Sur_fo]<=750000;"75";[Sur_fo]>750000 et [Sur_fo]<=1000000;"100";[Sur_fo]>1000000 et [Sur_fo]<=1500000;"150";[Sur_fo]>1500000 et [Sur_fo]<=2000000;"200";[Sur_fo]>2000000 et [Sur_fo]<=3000000;"300";[Sur_fo]>3000000 et [Sur_fo]<=4000000;"400";[Sur_fo]>4000000 et [Sur_fo]<=5000000;"500";[Sur_fo]>5000000 et [Sur_fo]>5000000;"+500";faux;"?")

    Je ne comprends pas bien le dernier test faux;"?"? A quoi sert-il? Forcément, cette dernière condition ne sera JAMAiS remplie puisqu'il faudrait pour cela que FAUX = VRAI...
    Je suppose donc que tu veux le ? si aucune condition n'est remplie, mais a contrario du Select Case illustré par Tee_Grandbois, il n'y as pas de Else dans PremVrai, qui renvoie Null si aucune condition n'est remplie. Si tu risques d'avoir le cas, ce que je ne comprendrais pas bien avec un plancher infini et un plafond infini, tu dois entourer avec nz

    NZ(PremVrai(...;...;...;...);"?")
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Une fois pour toutes, je donne mon avis. Je ne vais pas le répéter à chaque message...
    Si je propose une solution générique sur votre solution spécifique, c'est parce que, fainéant de nature, je privilégie le réutilisable...
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  3. #23
    Expert éminent
    Dans ta formule, tout ce que j'ai mis en gras ne sert à rien
    Pierre, tu as raison sur ce coup
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...

  4. #24
    Responsable
    Office & Excel

    Citation Envoyé par tee_grandbois Voir le message
    Pierre, tu as raison sur ce coup




    Citation Envoyé par fergut Voir le message
    [...]
    Alors est ce que je peux inclure cette formule dans le formulaire alors elles appliquerais uniquement a celui-ci et je préférerais.
    Je crois avoir lu que c' étais possible en précédent la formule de = [...]
    Oui, si tout ce qui est exprimé dans la formule est connu du formulaire... Attention qu'avec la formule illustrée, tu dois actualiser si tu modifies la valeur de sur_fo...













    Si tu veux ne pas devoir actualiser, et que la modification soit effective dès la validation du contrôle, tu dois suffixer les noms des champs de .[Valeur]...

    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Une fois pour toutes, je donne mon avis. Je ne vais pas le répéter à chaque message...
    Si je propose une solution générique sur votre solution spécifique, c'est parce que, fainéant de nature, je privilégie le réutilisable...
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  5. #25
    Nouveau membre du Club
    Formule Access
    En pièce jointe la formule utilisée dans le champ "classe" du formulaire

    J'ai raccourci les champs qui n'était pas vraiment nécessaire "soutien" et [sur_fo]<=4000000,
    Puisque la longueur était trop importante pour un champ de formulaire.
    Par contre sauf erreur de ma part elle ne fonctionne pas

    =Nz(PremVrai([Sur_fo]<=50000;"5";[Sur_fo]<=100000;"10"; [Sur_fo]<=200000;"20"; [Sur_fo]<=500000;"50"; [Sur_fo]<=750000;"75"; [Sur_fo]<=1000000;"100"; [Sur_fo]<=1500000;"150"; [Sur_fo]<=2000000;"200"; [Sur_fo]<=3000000;"300"; [Sur_fo]<=5000000;"500";"+500"))

    Merci de me renseigner encore

  6. #26
    Nouveau membre du Club
    Espressions access
    Suite

    ça deviens compliqué si le champ formulaire n'accepte pas plus d'arguments

    En fait sur_fo est la superficie totale d'une forêt de sylviculteur et la requête devait servir à déterminer des classes de cotisations.
    Une fois la classe déterminée je devais choisir les cotisations en fonction, dans une table que j'appelais depuis une liste déroulante
    Cette fonction je ne pensais pas l'automatiser
    Si j'ajoute un champ plage de superficie et la classe correspondante associée à une cotisation j'aurais le même résultat.
    Donc dans ma table cotisation j'ajoute un champ plage superficie est le problème serait réglé

    Sauf si on peux régler le problème avec une requête et que l'on puisse l'appeler depuis un formulaire ?
    Merci

  7. #27
    Responsable
    Office & Excel

    Prends le temps de bien lire les réponses qui te sont fournies et de tester exactement les solutions proposées...


    La fonction nz(Expression;ValeurSiExpressionEstNull) permet de capturer le Null renvoyé éventuellement par une expression et de la remplacer par une valeur de ton choix. Or, PREMVRAI renvoie Null si aucune condition n'est rencontrée. nz permet donc, dans ce cas, de renvoyer le "+500".

    Dans la formule que tu donnes, "+500" est mal placée car elle se trouve à l'intérieur de PremVrai alors que c'est le second paramètre de NZ. Voici une formule qui fonctionne. Regarde où j'ai mis le "+500" par rapport à la tienne:

    =Nz(PremVrai([Sur_fo]<=50000;"5";[Sur_fo]<=100000;"10"; [Sur_fo]<=200000;"20"; [Sur_fo]<=500000;"50"; [Sur_fo]<=750000;"75"; [Sur_fo]<=1000000;"100"; [Sur_fo]<=1500000;"150"; [Sur_fo]<=2000000;"200"; [Sur_fo]<=3000000;"300"; [Sur_fo]<=5000000;"500");"+500")

    On remarquera au passage que maintenant, on a bien les inégalités qui vont toutes dans le même sens, ce qui est plus logique que dans tes premières expressions dans lesquelles la dernière "tournait le dos aux autres" . Pour moi, cette syntaxe, qui correspond au Select Case... Case ELSE, est plus logique que de se passer du nz et d'inclure une dernière condition ">5000000";"+500" dans le PremVrai, mais c'est là une appréciation tout à fait personnelle.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Une fois pour toutes, je donne mon avis. Je ne vais pas le répéter à chaque message...
    Si je propose une solution générique sur votre solution spécifique, c'est parce que, fainéant de nature, je privilégie le réutilisable...
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  8. #28
    Responsable
    Office & Excel

    Citation Envoyé par fergut Voir le message
    [...]

    J'ai raccourci les champs qui n'était pas vraiment nécessaire "soutien" et [sur_fo]<=4000000,
    Puisque la longueur était trop importante pour un champ de formulaire.[...]
    La longueur de ta formule n'est pas en cause ici et tu peux sans problème replacer le test sur "Soutien" (voir mon illustration dans un de mes messages précédents où la formule fonctionne parfaitement avec ce premier test).

    Les messages d'erreur d'Access sont parfois peu compréhensibles et mal formulés, mais tu peux sans soucis ajouter quelques conditions avant d'être limité par la taille de la formule.



    Cela étant, comme dit précédemment, un PremVrai avec autant de conditions est normalement remplacé par une requête sur une table des tranches, comme je l'ai illustré précédemment. Tu gagnes en souplesse car
    • tu peux modifier les plafonds et les valeurs des tranches sans devoir modifier ton (tes) formulaires;
    • tu peux supprimer ou ajouter autant de tranches que souhaité et tu n'es plus limité par le nombre de conditions de PremVrai.


    Tu pourrais lier ton formulaire à une requête qui utilise une jointure sur la table des tranches.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Une fois pour toutes, je donne mon avis. Je ne vais pas le répéter à chaque message...
    Si je propose une solution générique sur votre solution spécifique, c'est parce que, fainéant de nature, je privilégie le réutilisable...
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  9. #29
    Nouveau membre du Club
    Expressions Access
    Bonjour

    La formule marche parfaitement dans formulaire

    J'ai essayé avec une requête mais j'ai le message en pièce jointe

    (PremVrai([fonct_ad]="Soutien";"0";[Sur_fo]<=50000;"5";[Sur_fo]<=100000;"10"; [Sur_fo]<=200000;"20"; [Sur_fo]<=500000;"50"; [Sur_fo]<=750000;"75"; [Sur_fo]<=1000000;"100"; [Sur_fo]<=1500000;"150"; [Sur_fo]<=2000000;"200"; [Sur_fo]<=3000000;"300"; [Sur_fo]<=4000000;"400";[Sur_fo]<=5000000;"500");"+500")

    Je ne trouve pas de guillemets manquants !
    Merci de me renseigner

  10. #30
    Responsable
    Office & Excel

    Ce que tu illustres là, ce n'est pas une requête... Si tu dois utiliser cela au niveau d'une requête, alors utilise une table des tranches comme je l'ai illustré plus haut.

    Si tu utilises une formule, tu dois commencer avec le signe = dans le contrôle, comme je l'ai illustré précédemment ^^

    A nouveau, prends le temps de lire les réponses fournies, et vérifie calmement que la syntaxe que tu utilises est conforme à ce que l'on te donne. Les solutions que je t'ai données ont été testées et fonctionnent chez moi, et j'ai créé une table et un formulaire avec TES noms de champs pour être certain que tu puisses transposer mes propositions par simple copier-coller . Je sais difficilement faire plus.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Une fois pour toutes, je donne mon avis. Je ne vais pas le répéter à chaque message...
    Si je propose une solution générique sur votre solution spécifique, c'est parce que, fainéant de nature, je privilégie le réutilisable...
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  11. #31
    Expert éminent
    bonjour,
    en illustration, les corrections:
    - rouge: à enlever
    - bleu: à rajouter
    (PremVrai([fonct_ad]="Soutien";"0";[Sur_fo]<=50000;"5";[Sur_fo]<=100000;"10"; [Sur_fo]<=200000;"20"; [Sur_fo]<=500000;"50"; [Sur_fo]<=750000;"75"; [Sur_fo]<=1000000;"100"; [Sur_fo]<=1500000;"150"; [Sur_fo]<=2000000;"200"; [Sur_fo]<=3000000;"300"; [Sur_fo]<=4000000;"400";[Sur_fo]<=5000000;"500");Vrai;"+500")
    et éventuellement
    Citation Envoyé par Pierre Fauconnier
    Si tu utilises une formule, tu dois commencer avec le signe = dans le contrôle, comme je l'ai illustré précédemment ^^
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...

  12. #32
    Responsable
    Office & Excel

    C'est effectivement la seconde solution que je donnais dans mon message de 7h07

    Citation Envoyé par Pierre Fauconnier Voir le message
    [...]se passer du nz et d'inclure une dernière condition ">5000000";"+500" dans le PremVrai [...]
    Je répète que pour moi, cette solution est bancale sur le plan de l'algorithmie et de la modélisation (ce n'est évidemment pas une attaque perso, juste une considération technique )

    Mais de toute façon, toute la solution d'un PremVrai avec autant de conditions qui mettent "en dur" des valeurs métier dans la structure même de l'application est une chose à éviter à tout prix. Je sais qu'ici, je suppose que fergut ne distribuera pas son appli en frontal/dorsal à plusieurs utilisateurs, mais il me plait de croire que la discussion sera lue par des personnes soucieuses de développer des applis Access de façon professionnelle, et la seule façon de procéder est de déporter les données dans une table de tranches et d'utiliser une requête comme celle que j'ai illustrée précédemment. Et dans une table de tranches, je ne vois pas comment on pourra modéliser les plafonds pour toutes les tranches sauf la dernière où on donnerait la valeur d'un plancher. Ca n'a pas de sens et il faudra passer par une requête qui modélise l'utilisation du nz comme je l'ai fait. (oui, je sais. Lorsque j'ai un os, je le ronge ^^).

    J'ajouterai pour finir que PremVrai devrait être évité comme la peste au delà de deux ou trois conditions intangibles. J'imagine la galère au niveau maintenance de l'application distribuée en frontal/dorsal auprès de x utilisateurs, puisque la moindre modification de donnée au niveau des tranches (ajout, suppression ou modification) va amener à devoir intervenir sur les x applications frontales en modif de formulaire, alors que la table des tranches, située dans la base dorsale, se modifie en une fois en mettant immédiatement les modifications à dispositions des utilisateurs au travers des tables liées.


    Voili voilà
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Une fois pour toutes, je donne mon avis. Je ne vais pas le répéter à chaque message...
    Si je propose une solution générique sur votre solution spécifique, c'est parce que, fainéant de nature, je privilégie le réutilisable...
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  13. #33
    Nouveau membre du Club
    Expressions access
    Merci à tous les deux pour le suivi que vous avez assurés

    J'ai créé une table "en document joint" je l'appellerais dans une liste déroulante de mon formulaire et ferais le choix de la classe du tarif.
    Tu parle de requête, comment elle interviendrais dans le formulaire.
    Excusez moi pour mon ignorance.

    Merci