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 :

Syntaxe instruction VBA avec nz pour tester la valeur d'un compteur [AC-2013]


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti Avatar de altor92
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Janvier 2017
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2017
    Messages : 43
    Par défaut Syntaxe instruction VBA avec nz pour tester la valeur d'un compteur
    Bonjour
    j'ai eu l'occasion d'aborder déjà ce point dans ce forum mais apparemment j'ai toujours le problème :

    Dans mon programme VBA, je récupère un compteur dans un état qui quand il est à 0 plante.
    donc on m'a transmis une instruction qui doit me permettre de tester la valeur du compteur en utilisant la fonction nz :

    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
       'rechercher valeur du compteur d'anomalies dans état E_RDG01
                            DoCmd.OpenReport "E_RDG01", acPreview, , , acHidden
                            If Nz(Reports!E_RDG01!cpt, 0) > 0 Then
                                rstAno.Fields("NbAnos").Value = Reports!E_RDG01!cpt.Value
                                DoCmd.Close
                                
                                'Calcul standard du compteur d'anomalies pondéré AnoRef : NbAnos x PondData = AnoRef
                                AnoRef = rstAno.Fields("NbAnos").Value * rstAno.Fields("PondData").Value
                                Seuil = rstAno.Fields("SeuilAnos").Value
                                'calcul IQD + Cumul IQD dans TotIQD
                                Call Calcul_IQD(IQD, AnoRef, Seuil, TotIQD, AnoPond)
                            Else
                                rstAno.Fields("NbAnos").Value = 0
                                IQD = 4
                            End If
    J'ai près de 40 états dans lequel je prend la valeur compteur (qui correspond à un nbre d'anomalies) et tout va bien tant que celui-ci n'est pas égale à 0....
    si vous avez une idée, MERCI !!!!!!!!!!!!!!!!!!!

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 410
    Par défaut
    Bonjour.

    Et que ce passe-t'il quand il est à 0 ?

    1. Tu as un message d'erreur ? si oui, lequel ?
    2. Tu n'as pas le résultat attendu ? si oui, quel est le résultat, qu'est-ce qui était attendu ?
    3. Tu n'as pas de résultat du tout ?


    Aussi quand tu es dans le cas 0, tu ne fermes pas le rapport. Le problème vient peut-être de là.

    Pour fermer le rapport, je te suggère :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    docmd.close acReport, "E_RDG01"
    qui va fermer spécifiquement le rapport et pas le dernier objet ouvert quel qu'il soit.

    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
    Membre averti Avatar de altor92
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Janvier 2017
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2017
    Messages : 43
    Par défaut syntaxe nz
    Bonjour,

    ok je vais essayer ....
    merci

    Citation Envoyé par marot_r Voir le message
    Bonjour.

    Et que ce passe-t'il quand il est à 0 ?

    1. Tu as un message d'erreur ? si oui, lequel ?
    2. Tu n'as pas le résultat attendu ? si oui, quel est le résultat, qu'est-ce qui était attendu ?
    3. Tu n'as pas de résultat du tout ?


    Aussi quand tu es dans le cas 0, tu ne fermes pas le rapport. Le problème vient peut-être de là.

    Pour fermer le rapport, je te suggère :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    docmd.close acReport, "E_RDG01"
    qui va fermer spécifiquement le rapport et pas le dernier objet ouvert quel qu'il soit.

    A+

  4. #4
    Membre averti Avatar de altor92
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Janvier 2017
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2017
    Messages : 43
    Par défaut syntaxe nz
    Citation Envoyé par altor92 Voir le message
    Bonjour,

    ok je vais essayer ....
    merci
    Bon je rencontre en fait le souci sur la syntaxe nz....je te joins le code
    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
    I = 0
                    'RDG01
                    If rstAno.EOF Then
                                GoTo Traitement_résultats
                    End If
                    I = I + 1
                    'MAJ dans T_compte du nombre d'anomalies RDG01
                    If rstAno.Fields("NumAno") = I Then
                        rstAno.Edit
                        rstRDG.Edit
                    'Calcul IQD RDG01
                        DoCmd.OpenReport "E_RDG01", acPreview, , , acHidden
                            If Nz(Reports!E_RDG01!cpt, 0) > 0 Then
                                rstAno.Fields("NbAnos").Value = Reports!E_RDG01!cpt.Value
                                DoCmd.Close acReport, "E_RDG01"
                                
                        'IIf (Nz(Reports!E_RDG01!cpt, 0) > 0,,0) Then
                            'rstAno.Fields("NbAnos").Value = Reports!E_RDG01!cpt.Value
                            'DoCmd.Close
    et le msg
    Nom : msg_err nz.JPG
Affichages : 460
Taille : 111,9 Ko

    merci à toi

  5. #5
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 410
    Par défaut
    Bonjour.

    c'est if Nz(Reports!E_RDG01!cpt, 0) > 0 Then qui plante ?

    Que vaut Reports!E_RDG01!cpt ?

    Et essaye avec Reports!E_RDG01.cpt.

    En passant, la prochaine fois essaye de cadrer l'image plus prêt du message d'erreur. Là ton code et l'image de ton code avec le message se mélange ce qui fait qu'on se sait plus trop où est quoi.

    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
    Membre averti Avatar de altor92
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Janvier 2017
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2017
    Messages : 43
    Par défaut erreur syntaxe nz compteur à zero
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Reports!E_RDG01!cpt = 0
    ci-après les différents shoots des mes écrans pour être au plus clair
    le premier montre la zone compteur que j'ai nommé cpt
    le deuxième la valeur de cpt pour cet état (pas d'anomalies)
    le troisième le module vba avec son msg erreur
    le quatrième montre la ligne instruction en problème...

    Nom : E_RDG01  cpt.JPG
Affichages : 429
Taille : 66,6 KoNom : E_RDG01  cpt valeur.JPG
Affichages : 402
Taille : 31,8 KoNom : msg_err nz.JPG
Affichages : 546
Taille : 73,6 KoNom : vba erreur tstcpt.JPG
Affichages : 468
Taille : 27,2 Ko

    merci encore de ton aide!

  7. #7
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 410
    Par défaut
    Bonjour.

    Que voit VBA pour Reports!E_RDG01!cpt ?

    Pour le savoir :
    1. Passer en mode debug.
    2. Activer la fenêtre d'exécution immédiate (Touches [Ctrl][G]).
    3. Taper ? Reports!E_RDG01!cpt et appuyer sur la touche [enter].


    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
    Membre averti Avatar de altor92
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Janvier 2017
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2017
    Messages : 43
    Par défaut prob syntaxe nz
    Merci pour ton code debug que je me suis empressé de tester

    Nom : msg_err nz2.JPG
Affichages : 413
Taille : 77,1 Ko

    Nom : msg_err nz2b.JPG
Affichages : 456
Taille : 74,4 Ko

    Nom : msg_err nz2c.JPG
Affichages : 439
Taille : 74,6 Ko

  9. #9
    Membre averti Avatar de altor92
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Janvier 2017
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2017
    Messages : 43
    Par défaut Mon prob test valeur cpt zero dans état non résolu.....
    Bonjour à tous et à toutes bonnes âmes soeurs!!
    je galère depuis un moment sur test d'un compteur que je pioche dans un état et qui plante (instruction testt) quand celui est égal à zéro....
    Mon code est dans les échanges mais suis prêt à donner toutes informations complémentaires à mon futur sauveur.
    en effet dans le cas où mon compteur est à zéro je n'opère pas certains calculs.
    merci à vous

  10. #10
    Expert éminent
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 962
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 962
    Par défaut
    Bonjour,
    Peut-être une piste :
    le contrôle cpt de l'état E_RDG01 a =Compte(*) comme source contrôle : cela veut dire qu'il renvoie le nombre d'enregistrements du Recordset. Mais si le Recordset est vide (pas d'enregistrements) cela provoque une erreur expression sans paramètre.
    Donc il faut tester que le nombre d'enregistrements du RecordSet de l'état est > 0 avant de tester la valeur d'un contrôle. Malheureusement, cette propriété n'est pas disponible dans un état (en tous cas dans la version 2013).

    Une solution serait de compter le nombre d'enregistrements du RecordSource. C'est possible à la condition que la commande DoCmd.OpenReport n'est pas exécutée avec une requête filtre enregistrée ou une condition WHERE car cela renverrait un résultat faux. Mais ce n'est pas ton cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     ...
    'Déclaration de l'objet Report
    Dim rpt As Report
    Set rpt = Report_E_RDG01
     ...
                            DoCmd.OpenReport rpt.Name, acPreview, , , acHidden
                            If DCount("*", rpt.RecordSource) > 0 Then		' teste si le Recordset est vide
                                If Nz(Rpt!cpt, 0) > 0 Then
                                    rstAno.Fields("NbAnos").Value = rpt!cpt.Value
                                End if
    			End If
                            DoCmd.Close
     ...
    Remarque le fait de déclarer l'état en objet Report évite à chaque fois de mettre Reports!E_RDG01 à chaque fois et en plus on bénéficie de l'auto-complétion (invite de la liste des propriétés liées à l'objet).

  11. #11
    Membre averti Avatar de altor92
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Janvier 2017
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2017
    Messages : 43
    Par défaut Merci j'essaye!!!
    Merci tee_grandbois!!
    je tente ma chance avec ta proposition et te tiens au courant


    Citation Envoyé par tee_grandbois Voir le message
    Bonjour,
    Peut-être une piste :
    le contrôle cpt de l'état E_RDG01 a =Compte(*) comme source contrôle : cela veut dire qu'il renvoie le nombre d'enregistrements du Recordset. Mais si le Recordset est vide (pas d'enregistrements) cela provoque une erreur expression sans paramètre.
    Donc il faut tester que le nombre d'enregistrements du RecordSet de l'état est > 0 avant de tester la valeur d'un contrôle. Malheureusement, cette propriété n'est pas disponible dans un état (en tous cas dans la version 2013).

    Une solution serait de compter le nombre d'enregistrements du RecordSource. C'est possible à la condition que la commande DoCmd.OpenReport n'est pas exécutée avec une requête filtre enregistrée ou une condition WHERE car cela renverrait un résultat faux. Mais ce n'est pas ton cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     ...
    'Déclaration de l'objet Report
    Dim rpt As Report
    Set rpt = Report_E_RDG01
     ...
                            DoCmd.OpenReport rpt.Name, acPreview, , , acHidden
                            If DCount("*", rpt.RecordSource) > 0 Then		' teste si le Recordset est vide
                                If Nz(Rpt!cpt, 0) > 0 Then
                                    rstAno.Fields("NbAnos").Value = rpt!cpt.Value
                                End if
    			End If
                            DoCmd.Close
     ...
    Remarque le fait de déclarer l'état en objet Report évite à chaque fois de mettre Reports!E_RDG01 à chaque fois et en plus on bénéficie de l'auto-complétion (invite de la liste des propriétés liées à l'objet).

  12. #12
    Membre averti Avatar de altor92
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Janvier 2017
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2017
    Messages : 43
    Par défaut test compteur à zéro
    Citation Envoyé par altor92 Voir le message
    Merci tee_grandbois!!
    je tente ma chance avec ta proposition et te tiens au courant
    Hello!
    je te donne le résultat final qui marche (j'ai du corriger ta dernière proposition comme suit pour info)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    If Not rstRQR.EOF Then
                            DoCmd.OpenReport "E_RDG01", acPreview, , , acHidden
                            rstAno.Fields("NbAnos").Value = Reports!E_RDG01!cpt.Value
                            DoCmd.Close
                            'Calcul standard du compteur d'anomalies pondéré AnoRef : NbAnos x PondData = AnoRef
                            AnoRef = rstAno.Fields("NbAnos").Value * rstAno.Fields("PondData").Value
    Comme tu l'as dit, il faut s'appuyer sur la requête pour tester le retour à zéro (si non EOF, l'état de sortie contient au moins un enregistrement et donc le cpt > 0 bien-sûr...)

    En tous les cas, MERCI car ça m'a débloqué et permis de finaliser mon traitement.

  13. #13
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 410
    Par défaut
    Bonjour et merci pour la solution.

    Pour info, on peut aussi utiliser .recordcount pour tester si il y a des enregistrements.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if  rstRQR.recordcount <>0
    Attention le non est trompeur, on n'obtient le nombre d'enregistrements exact QUE quand on a lu tous les enregistrements, sinon on obtient 1 quelque soit le nombre réel d'enregistrements.
    Si on veut obtenir le nombre d'enregistrements, il faut faire quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if  rstRQR.recordcount <>0 then
        rstRQR.movelast 'Force Access à lire tous les enregistrements
        rstRQR.movefisrt
    end if
    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.

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

Discussions similaires

  1. [XL-2013] Fonction IF pour tester une liste de valeurs
    Par zedude dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 09/08/2017, 10h31
  2. Réponses: 0
    Dernier message: 15/05/2017, 17h57
  3. [XL-2007] ajouter la serie "X" dans un graphique en VBA avec variables pour Ligne et colonne
    Par maxime-a dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 01/04/2015, 14h40
  4. Réponses: 11
    Dernier message: 28/06/2012, 09h11
  5. Réponses: 9
    Dernier message: 13/03/2012, 11h06

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