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 :

problème avec DLookup (access 2003)


Sujet :

VBA Access

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 75
    Points : 42
    Points
    42
    Par défaut problème avec DLookup (access 2003)
    bonjour,

    déjà voici le fichier access en question:
    http://dl.free.fr/qZYYZr3DP

    et le fichier excel duquel il est inspiré (pour mieux comprendre):
    http://dl.free.fr/q3TjS8w58

    Sur le fichier excel, allez dans l'onglet "arbaletrier" et regardez la cellule AF44.
    J'essaie de retrouver ce résultat sur access, mais en vain

    alors dans le fichier access, vous allez dans le "formulaire arbalétrier", et le résultat de la cellule AF44 (excel) doit se retrouver dans le champ "G_oxy".

    j'ai essayé ça comme code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private sub G_longueur_change()
    G_oxy = (0.2+(G_largeur+G_longueur)/ DLookup("vitesse_en_mm/min_X", "temps d'oxy fdb (hors percage)", "G_ep >= entre And G_ep < et")) / 60
    End sub
    mais là il ne se passe rien quand la longueur change. le champ G_oxy reste vide.
    Si maintenant on tente de changer nous memes le champ G_longueur, il nous renvoie:
    erreur d'execution 2001: opération annulée.
    et en le mettant sur d'autres événements (j'en ai essayé plein), il me renvoie:
    erreur d'execution 3075: erreur de syntaxe dans l'expression 'G_ep >= entre And G_ep < et '

    je ne comprends pas pourquoi...

    1) sur quel événement placer la formule de ce champ G_oxy ?
    2) comment bien "syantaxer" cette formule ?

    merci d'avance a tous ceux qui m'aideront.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Plusieurs choses :

    Les noms de champs et de tables entre crochets, l'utilisation de signes comme / est une aberration.

    Ensuite je ne comprends pas ce que signifie cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "G_ep >= entre And G_ep < et"
    C'est quoi entre et et ?
    Si c'est des variables il faut les sortir de la chaine et les rajouter par concaténation.

    Et en prime un peu de lecture : http://starec.developpez.com/tuto/fonctionsdomaines/

    Starec

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 75
    Points : 42
    Points
    42
    Par défaut
    bonsoir Starec,

    quand j'ai débuté le fichier, je ne connaissais rien au code, c'est pour ça qu'il y a des noms avec des espaces, donc des crochets, et des /.
    Par la suite, j'ai essayé de faire + simple.

    pour le "entre" et le "et", en fait, il faut regarder la table "temps d'oxy fdb (hors percage)": ce sont les noms de 2 des champs de cette table.
    exemple, si l'epaisseur de la platine est comprise entre 12 et 13, la vitesse est de 470.

    allé, je vais aller lire...

  4. #4
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    2 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 878
    Points : 4 754
    Points
    4 754
    Par défaut
    Salut l'édoniste,

    Comme Starec, ma première remarque serait de passer un peu de temps à reprendre tes noms de tables de, champs ... car c'est presque déjà indemmerdable ...
    Vois peut-être http://www.developpez.net/forums/d60...s/#post3601441

    Revenons au sujet de :
    Private sub G_longueur_change()
    G_oxy = (0.2+(G_largeur+G_longueur)/ DLookup("vitesse_en_mm/min_X", "temps d'oxy fdb (hors percage)", "G_ep >= entre And G_ep < et")) / 60
    End sub
    Pour commencer, j'ai renommé, par exemple, la table [temps d'oxy fdb (hors percage)] en [T_vitesse_oxy_fdb], les champs sont devenus
    vitesseMinX au lieu de ...
    epaisseurMin au lieu de entre
    epaisseurMax au lieu de et
    Il y avait plusieurs pb :
    . c'est sur l'evt _AfterUpdate qu'il faut mettre ton code VBA
    . plus compliqué : G_ep est de type Single alors dû aux settings régionaux, le séparateur décimal est la virgule (en France) mais dans le code VBA, il faut rétablir le . comme séparateur pour que ce soit correct ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub G_longueur_AfterUpdate()
        Dim sngVitesse As Single
     
        sngVitesse = Nz(DLookup("vitesseMinX", "[T_vitesse_oxy_fdb]", " cSng([epaisseurMin]) <=" & Replace(G_ep, ",", ".") & " AND cSng([epaisseurMax]) >=" & Replace(G_ep, ",", ".")), 0)
        Debug.Print "sngVitesse : " & sngVitesse
        If sngVitesse > 0 Then G_oxy = (0.2 + (G_largeur + G_longueur) / sngVitesse) / 60
        Debug.Print "G_oxy : " & G_oxy
     
    End Sub
    Par ailleurs , bravo , c'est un très gros travail ...
    "Always look at the bright side of life." Monty Python.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 75
    Points : 42
    Points
    42
    Par défaut
    merci du compliment Micniv, et surtout merci pour ton aide tres precieuse!

    j'ai lu les tutoriaux de Starec, mais je ne voyais toujours pas où ça n'allait pas, j'ai tout essayé entre les crochets, les parenthèses, les simple quote, les double, etc...

    après avoir vu ton code, je pense que ce qui ne fonctionnait pas c'était à cause des , et des .
    bref, j'ai repris ton code et ca marche!
    (juste j'ai enlevé les crochets parce que comme j'ai enlevé les espaces dans les noms, c'est pas pour m'embarrasser avec ca, et j'ai rajouter un end if à la fin dont je suis sur que tu l'as omis pour voir si j'etais attentif petit malin! )

    par contre pour l'événement j'ai changé. en fait le "afterupdate" je crois que c'est pour les champs que l'on saisi. sauf que là, la longueur, je ne la saisis pas.
    donc j'ai mis le code sur chacun des 8 boutons et ensuite je l'ai réadapté pour l'oxy des semelle jarret et des ame jarret. il me reste encore les raidisseurs...

    voilà ce que ça donne: (je sais pas si j'ai tout bon mais ça a l'air de fonctionner)
    http://dl.free.fr/rNpI3VO9J

    ce que j'aimerais bien, c'est que tu m'expliques un peu les sng, csng et debug.print, histoire que je comprenne un peu ce que je fais...

  6. #6
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    2 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 878
    Points : 4 754
    Points
    4 754
    Par défaut
    Bonsoir,
    qqls commentaires
    Dim sngVitesse As Single

    sngVitesse = Nz(DLookup("vitesseMinX", "[T_vitesse_oxy_fdb]", " cSng([epaisseurMin]) <=" & Replace(G_ep, ",", ".") & " AND cSng([epaisseurMax]) >=" & Replace(G_ep, ",", ".")), 0)
    Debug.Print "sngVitesse : " & sngVitesse
    If sngVitesse > 0 Then G_oxy = (0.2 + (G_largeur + G_longueur) / sngVitesse) / 60
    Tout d'abord j'ai défini une variable sngVitesse pour recueillir le résultat du Dlookup : la formule de calcul de G_oxy devient plus lisible et c'est toujours mieux de décomposer les difficultés.
    La fonction NZ retourne 0 si jamais le dlookup ne retourne rien.

    maintenant la partie du critère :
    cSng([epaisseurMin]) <=" & Replace(G_ep, ",", ".")
    Dans ta table, epaisseurMin est de type Long et G_ep de type Single ; pour ne pas comparer des choux et des carottes, je convertis [epaisseurMin] en single en utilisant la fonction de conversion CSng().
    Mais ce n'est pas tout car si maintenant, on compare 2 Single, l'expression suivante plante encore :
    cSng([epaisseurMin]) <=" & G_ep
    on voit en debug : cSng([epaisseurMin]) <= 2,56 : la virgule (séparateur décimal "régional" pour la France) fait planter car le code attend le séparateur décimal système (: américain) , càd le . d'où l'utilisation de la fonction Replace (qui remplace la virgule par le point)

    Toutes ces fonctions sont documentées en appuyant sur F1.
    Note aussi l'utilisation de Debug.print qui imprime dans la fenetre exécution les valeurs à tracer : très utile pour le débuggage.

    Sur ce, bonne soirée


    EDIT : Ton très long formulaire Arbaletrier gagnerait à être découpé sur les pages d'un controle d'onglet (ca se présente comme des feuilles Excel) pour qu'il puisse tenir sur un ecran.
    "Always look at the bright side of life." Monty Python.

Discussions similaires

  1. Réponses: 4
    Dernier message: 05/07/2009, 21h05
  2. Function Shell avec Runtime Access 2003
    Par gridin dans le forum Runtime
    Réponses: 5
    Dernier message: 16/11/2007, 22h24
  3. Réponses: 12
    Dernier message: 02/04/2007, 16h17
  4. Problème assistant dans Access 2003
    Par French dans le forum Access
    Réponses: 1
    Dernier message: 09/02/2006, 22h29
  5. [VB5]Problème avec bd access 2002
    Par mpat dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 07/02/2006, 15h33

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