Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > IHM
IHM Ce forum est dédié aux questions relatives à la création de formulaires et d'états, avec ou sans code VBA, et macros.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 05/01/2011, 20h11   #1
Membre régulier
 
Inscription : janvier 2011
Messages : 307
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 307
Points : 76
Points : 76
Par défaut NZ ne fonctionne pas dans mon formulaire

Bonjour à tous,

Dans des champs calculés de sous formulaires j'ai utilisé pour éviter que ne se propage une erreur sur d'autres champs mais je continue à avoir des messages "#Erreur! ou #Type" lorsque aucun registre ne s'affiche.

Je ne peux pas laisser le formulaire (vide) sans ligne enregistrée au moins avec un zéro dans un des champs sous peine d'avoir ce message d'erreur.
Pourtant est censé remplacer toute valeur nulle ou inexistante comme "0" !

Que fais-je mal ?
clickandgo est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 20h38   #2
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 458
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 458
Points : 7 534
Points : 7 534
Il est possible que ce soit (Calcul) qui renvoie une erreur et dans ce cas NZ propage l'erreur. Il faudrait gérer l'erreur au niveau Calcul.

De plus prend garde à NZ car avec les nombres il fait parfois sauter les décimales ... pas cool. Dans le doute il est plus prudent d'utiliser IIF(not IsNull(TaValeur);TaValeur;0).
__________________
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.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 23h37   #3
Membre régulier
 
Inscription : janvier 2011
Messages : 307
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 307
Points : 76
Points : 76
Citation:
Envoyé par marot_r Voir le message
Il est possible que ce soit (Calcul) qui renvoie une erreur et dans ce cas NZ propage l'erreur. Il faudrait gérer l'erreur au niveau Calcul.

De plus prend garde à NZ car avec les nombres il fait parfois sauter les décimales ... pas cool. Dans le doute il est plus prudent d'utiliser IIF(not IsNull(TaValeur);TaValeur;0).
Bonjour,

Non, tous les champs calculés fonctionnent bien, ce problème se manifeste lorsque aucune donnée n'est rentrée pour un registre donné dans un sous formulaire.

Je m'explique :

J'ai un formulaire Devis / Factures principal à onglets, l'un des onglets sert à afficher un sous formulaire "Acomptes", en pied de ce sous-formulaire il y a un champ somme() qui calcule le total d'un champ. Tout va bien à condition que l'ajout soit autorisé dans celui-ci, si je fais allowadditions=false pour éviter de voir des lignes vierges si aucun acompte n'a été versé c'est là que les champs calculés ne fonctionnent plus.

Sur le formulaire principal sont repris le même type de champ que sous le sous formulaire et ils marchent seulement quand un acompte existe aussi ...

Dès que je créé une ligne vierge qui contient un zéro dans le champ Total, tous les calculs réapparaissent...

Comment faire pour que lorsque le formulaire Acomptes est encore vierge les champs du formulaire principal soient calculés ou marquent zéro à la place de "#Erreur!" ?
clickandgo est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2011, 00h21   #4
Membre Expert
 
Inscription : mars 2006
Messages : 1 331
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 1 331
Points : 1 460
Points : 1 460
Bonsoir,

Dans le pied de ce sous formulaire, reprend tes opérations sur un nouveau champ :
Code :
=VraiFaux(IsError([TonChampAsoucis]);0;[TonChampAsoucis])
Cordialement.
__________________
Questions techniques par MP
Le peu que je sais, c'est à mon ignorance que je le dois.
...............................................................................Sacha Guitry
francishop est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2011, 13h15   #5
Membre régulier
 
Inscription : janvier 2011
Messages : 307
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 307
Points : 76
Points : 76
Citation:
Envoyé par francishop Voir le message
Bonsoir,

Dans le pied de ce sous formulaire, reprend tes opérations sur un nouveau champ :
Code :
=VraiFaux(IsError([TonChampAsoucis]);0;[TonChampAsoucis])
Cordialement.
Merci pour ta réponse,

Je n'arrive pas à visualiser comment mettre ça dans le formulaire, tu veux dire qu'il faut rajouter un nouveau champ faisant référence à celui qui fait les calculs et ensuite celui çi transformera le résultat en devenant celui qui affiche ? Un genre de by-pass ?

D'autre part, question indiscrète :
Es-tu developpeur junior ?

Merci pour ta réponse
clickandgo est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2011, 13h25   #6
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 458
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 458
Points : 7 534
Points : 7 534
En suivant l'idée de francishop (au passage merci à lui, je ne connaissais pas IsError()) je remplacerai la source du champ qui affiche tes #Erreur et #Type par ce qu'il suggère ou tu peux rendre invisible le champ qui afiche les erreurs et créer un nouveau champ qui utlise iSError().

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.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2011, 13h40   #7
Membre régulier
 
Inscription : janvier 2011
Messages : 307
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 307
Points : 76
Points : 76
Citation:
Envoyé par marot_r Voir le message
En suivant l'idée de francishop (au passage merci à lui, je ne connaissais pas IsError()) je remplacerai la source du champ qui affiche tes #Erreur et #Type par ce qu'il suggère ou tu peux rendre invisible le champ qui afiche les erreurs et créer un nouveau champ qui utlise iSError().

A+
Bonjour à toi,

Je viens d'esayer la méthode de Francishop mais ça ne marche tjs pas lorsque le sous formulaire ne contient aucune ligne ... la logique du champ proposé est d'afficher un zéro lorqu'il n'y aurait aucune valeur, ça ressemble à NZ mais en étant plus strict, cependant aucun zéro ne s'affiche et #Erreur est tjs présent.

Quand le SF contient au moins une ligne les calculs se font sans problème ! Je vais m'arracher les cheveux !!!

C'est l'état du sous formulaire (AllowAdditions=false) qui provoque cette erreur, alors comment faire pour que le SF puisse rester vierge et sans ligne sans que ça n'affecte les calculs du formulaire principal ?

Merci d'avance à celui qui trouvera !
clickandgo est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2011, 14h12   #8
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 458
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 458
Points : 7 534
Points : 7 534
Le IsError() ne réagit pas ?

Pourrais-tu poster la source de ton champ en erreur ?

Une autre solution consiterai à changer la source de ton champ si il n'y a pas de données mais c'est un peu plus accrobatique.

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.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2011, 14h32   #9
Membre régulier
 
Inscription : janvier 2011
Messages : 307
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 307
Points : 76
Points : 76
Citation:
Envoyé par marot_r Voir le message
Le IsError() ne réagit pas ?

Pourrais-tu poster la source de ton champ en erreur ?

Une autre solution consiterai à changer la source de ton champ si il n'y a pas de données mais c'est un peu plus accrobatique.

A+
Bonjour,

J'insiste sur le fait que les champs calculés marchent parfaitement tant que le SF contient des données donc cela ne peut pas venir des champs calculés du SF ...
Deplus ces champs ne sont que des somme() en pied de SF.

Je recherche donc le moyen que lorsqu'il n'y ait aucune ligne dans le SF les champs du Formulaire Principal se calculent quand même.

Merci
clickandgo est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2011, 14h34   #10
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 458
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 458
Points : 7 534
Points : 7 534
J'ai bien compris mais j'aimerai bien voir la source de ton champ qui affiche l'erreur, cela aiderai à trouver une solution.

Ce champ en erreur est dans le sous formulaire ou dans le formulaire principal ?

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.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2011, 14h46   #11
Membre régulier
 
Inscription : janvier 2011
Messages : 307
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 307
Points : 76
Points : 76
Citation:
Envoyé par marot_r Voir le message
J'ai bien compris mais j'aimerai bien voir la source de ton champ qui affiche l'erreur, cela aiderai à trouver une solution.

Ce champ en erreur est dans le sous formulaire ou dans le formulaire principal ?

A+
Bon, je répète :

Aucun problème de calcul ou de source, tout est correct.

1 - J'observe que si le formulaire acompte n'a aucune ligne (donc aucun champ visible) le champ calculé situé en pied de SF montre #Erreur.

2 - Lorsqu'une ligne est ajoutée aprés clic sur le bouton "Ajouter" (qui exécute un Alloweditions=true) permettant de saisir un acompte, le champ calculé marche car il trouve un champ [Montant Acompte]=0 visible dans la seule ligne en question.

Toute la question est de comment faire pour que lorsque le SF Acompte est complétement vide (aucune ligne de registre) les champs calculés du FP le considérent comme une valeur 0 ? et que continue la logique de calcul ?

Merci à tous
clickandgo est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2011, 15h17   #12
Membre régulier
 
Inscription : janvier 2011
Messages : 307
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 307
Points : 76
Points : 76
Bon, je répète :

Aucun problème de calcul ou de source, tout est correct.

1 - J'observe que si le formulaire acompte n'a aucune ligne (donc aucun champ visible) le champ calculé situé en pied de SF montre #Erreur.

2 - Lorsqu'une ligne est ajoutée aprés clic sur le bouton "Ajouter" (qui exécute un Allowadditions=true) permettant de saisir un acompte, le champ calculé marche car il trouve un champ [Montant Acompte]=0 visible dans la seule ligne en question.

Toute la question est de comment faire pour que lorsque le SF Acompte est complétement vide (aucune ligne de registre) les champs calculés du FP le considérent comme une valeur 0 ? et que continue la logique de calcul ?

Merci à tous
clickandgo est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2011, 16h30   #13
Membre éclairé
 
Homme Pierre-Jean
Développeur informatique
Inscription : février 2010
Messages : 306
Détails du profil
Informations personnelles :
Nom : Homme Pierre-Jean
Âge : 31
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : février 2010
Messages : 306
Points : 330
Points : 330
Envoyer un message via MSN à paidge
Bah tiens j'ai eu à peu près le même problème sur un de mes formulaires qui comporte un contrôle à onglets
J'ai quatre onglets avec chacun un sous formulaire(SF) comportant un champ invisible (txt_total) qui fait le total des lignes du SF dans lequel il se trouve...Sur mon formulaire principal, j'ai un champ un dernier champ txt_total qui fait la somme des 4 autres qui se trouvent sur les SF...
Lorsque j'avais au moins un SF sans aucune ligne, j'avais une erreur ! Donc à peu près comme toi

Voilà la solution que j'ai trouvée pour pallier au problème
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Private Sub Form_Current()
 
Dim ctl As Control
 
For Each ctl In Me.Controls                             ' Pour chaque contrôle du formulaire
    If Left(ctl.Name, 2)="sf" Then                      ' Regarde les deux 1ères lettres du nom du contrôle et c'est "sf" alors
        With ctl.Form
            Select Case .RecordsetClone.RecordCount     ' On compte le nbre d'enregistrement du SF
                Case 0                                  ' Si il y en a 0
                    .txt_total.ControlSource = ""       ' Met RIEN en tant que source du champ txt_total
                    .txt_total = 0                      ' Attribue la valeur 0 au champ invisible qui contient le total d'heures du SF
                Case Is > 20                            ' Si il y en a plus de 20
                    .ScrollBars = 2                     ' Affiche l'ascenceur
            End Select
        End With
    End If
Next ctl
 
End Sub
paidge est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2011, 18h19   #14
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 458
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 458
Points : 7 534
Points : 7 534
Code :
Aucun problème de calcul ou de source, tout est correct.
Désolé de répéter moi aussi ... ça doit être l'âge.

Ton calcul n'est pas correct puisqu'il ne te donne pas le résultat que tu attends lorsqu'il n'y a pas d'enregistrement.

Il faut donc le modifier ou mdifier la façon dont il est traité.

Pour te suggérer une modification, il me faut savoir comment tu le calcule (pas en théorie, je veux savoir ce qu'il y a comme équation dans ce champ) et où il est affiché.

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.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2011, 19h32   #15
Membre régulier
 
Inscription : janvier 2011
Messages : 307
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 307
Points : 76
Points : 76
Citation:
Envoyé par marot_r Voir le message
Code :
Aucun problème de calcul ou de source, tout est correct.
Désolé de répéter moi aussi ... ça doit être l'âge.

Ton calcul n'est pas correct puisqu'il ne te donne pas le résultat que tu attends lorsqu'il n'y a pas d'enregistrement.

Il faut donc le modifier ou mdifier la façon dont il est traité.

Pour te suggérer une modification, il me faut savoir comment tu le calcule (pas en théorie, je veux savoir ce qu'il y a comme équation dans ce champ) et où il est affiché.

A+
Bonjour à toi,

Il s'agît tout bêtement d'un somme(Total Acompte), il marche tant qu'il existe une ligne dans le SF, si aucune ligne car AllowAdditions=false le champ indique #Erreur
clickandgo est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2011, 19h55   #16
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 458
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 458
Points : 7 534
Points : 7 534
Donc ton NZ() est fait dans la source de données sur le calcul de [Total Acompte] ?

Si oui, essaye
Code :
=Somme(Nz([Total Acompte],0))
si cela ne marche pas essaye
Code :
=Somme(iif(isError([Total Acompte]),0,[Total Acompte]))
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.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2011, 19h56   #17
Membre régulier
 
Inscription : janvier 2011
Messages : 307
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 307
Points : 76
Points : 76
Citation:
Envoyé par paidge Voir le message
Bah tiens j'ai eu à peu près le même problème sur un de mes formulaires qui comporte un contrôle à onglets
J'ai quatre onglets avec chacun un sous formulaire(SF) comportant un champ invisible (txt_total) qui fait le total des lignes du SF dans lequel il se trouve...Sur mon formulaire principal, j'ai un champ un dernier champ txt_total qui fait la somme des 4 autres qui se trouvent sur les SF...
Lorsque j'avais au moins un SF sans aucune ligne, j'avais une erreur ! Donc à peu près comme toi

Voilà la solution que j'ai trouvée pour pallier au problème
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Private Sub Form_Current()
 
Dim ctl As Control
 
For Each ctl In Me.Controls                             ' Pour chaque contrôle du formulaire
    Select Case Left(ctl.Name, 2)                       ' Regarde les deux 1ères lettres du nom du contrôle
        Case "sf"                                       ' Si c'est "sf" (sous-formulaire)
            With ctl.Form
                Select Case .RecordsetClone.RecordCount ' Compte le nbre d'enregistrement du SF
                    Case 0                              ' Si il y en a 0
                        .txt_total.ControlSource = ""   ' Met RIEN en tant que source du champ txt_total
                        .txt_total = 0                  ' Attribue la valeur 0 au champ invisible qui contient le total d'heures du SF
                    Case Is > 20                        ' Si il y en a plus de 20
                        .ScrollBars = 2                 ' Affiche l'ascenceur
                End Select
            End With
    End Select
Next ctl
 
End Sub
Bonjour et merci de ta réponse,

Mais quelle horreur ! me dis pas qu'il faut encore programmer pour un truc aussi bête ? C'est délirant, doit bien y avoir une fonction qui le fasse non ?

Sinon moi aussi c'est un formulaire à onglets sous Access 2010, le pb doit venir de là :
Quand aucune ligne de registre n'apparait dans le SF et donc aucun champ faisant référence qu calcul il ne sait pas le remplacer par 0 !

Doit bien y avoir une méthode !
clickandgo est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2011, 19h59   #18
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 458
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 458
Points : 7 534
Points : 7 534
Essaye aussi :
Code :
=iif(isError(Somme([Total Acompte])), 0, Somme([Total Acompte]))
Si aucun ne marche alors il va falloir recourrir au VBA.

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.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2011, 20h20   #19
Membre régulier
 
Inscription : janvier 2011
Messages : 307
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 307
Points : 76
Points : 76
Citation:
Envoyé par marot_r Voir le message
Essaye aussi :
Code :
=iif(isError(Somme([Total Acompte])), 0, Somme([Total Acompte]))
Si aucun ne marche alors il va falloir recourrir au VBA.

A+
A tête reposée je me suis rendu compte que :

Lorsque l'on fait un champ calculé faisant référence à la valeur d'un champ et que le champ référencé n'apparaît pas dans le formulaire à un moment donné, il est tout à fait normal que le calcul soit impossible à réaliser puisque le champ n'existe pas à un moment donné...

Il me faut donc trouver un palliatif et il se pourrait que IsError en soit la clé comme tu le mentionnes, je croise les doigts ... J'essaye dans qqes heures et je vous tiens au courant...
clickandgo est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2011, 00h15   #20
Membre régulier
 
Inscription : janvier 2011
Messages : 307
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 307
Points : 76
Points : 76
Citation:
Envoyé par clickandgo Voir le message
A tête reposée je me suis rendu compte que :

Lorsque l'on fait un champ calculé faisant référence à la valeur d'un champ et que le champ référencé n'apparaît pas dans le formulaire à un moment donné, il est tout à fait normal que le calcul soit impossible à réaliser puisque le champ n'existe pas à un moment donné...

Il me faut donc trouver un palliatif et il se pourrait que IsError en soit la clé comme tu le mentionnes, je croise les doigts ... J'essaye dans qqes heures et je vous tiens au courant...
Je viens d'essayer de nouveau, Iif devient "Vrai/Faux" ; j'avais déjà essayé cette suggestion, ça ne marche pas !

ET c'est LOGIQUE ! : Un champ calculé ne peut effectuer des calculs si un des champs mentionné dedans n'existe pas encore dans le Sous formulaire...

Il va falloir ruser ! si vous avez une suggestion, je suis tjs preneur !!!

merci les gars !
clickandgo est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h07.


 
 
 
 
Partenaires

Hébergement Web