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 :

[VBA Access] Champ texte null alors que l'objet existe bien.


Sujet :

VBA Access

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    166
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2006
    Messages : 166
    Points : 169
    Points
    169
    Par défaut [VBA Access] Champ texte null alors que l'objet existe bien.
    Bonjour,

    J'ai un p'tit problème sur lequel j'ai plus trop d'idée de solution.

    J'ai ceci dans un module standard:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    'Ouvre le formulaire calendrier
    Public Function btCalendrier_Click(txtCible As Control)
        DoCmd.OpenForm "frmCalendrier"  'frmCalendrier: independante=oui et modale=oui
        Set Form_frmCalendrier.Cible = txtCible
    End Function
    Et sur plusieurs formulaire, dans la fenêtre propriété de différents boutons, j'ai ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    onclick = "=btCalendrier_Click([txtDate])"
    Où txtDate est le nom d'un contrôle champ de texte. Ça fonctionne très bien quand txtDate contient déjà une date. Mais si c'est vide, ça plante sur la ligne Set Form_... parce que txtDate serait null, ce que je ne comprends pas trop.

    Ok, la donnéee DANS txtDate peut être null... mais il me semble que je lui envoie l'OBJET contrôle, pas le contenu. Le contrôle existe bien sur le formulaire. Pourquoi me dit-il qu'il est null?

    Quelqu'un a une idée?

    Merci!
    Caroline
    -qui continue à chercher.

  2. #2
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Non, tu envoie la valeur, car en fait, la propriété .Value est définie comme propriété par défaut.

    Msgbox Uncontrole

    est égal à

    Msgbox Uncontrole.value


  3. #3
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 526
    Points
    14 526
    Par défaut
    slt,

    ça dépend en fait :
    si Form_frmCalendrier.Cible est défini comme contrôle alors c'est bien le contrôle qui est utilisé
    d'ailleurs si tu utilises Set alors c'est pour définir un objet

    faudrait voir ce qu'il y a dans ce Form_frmCalendrier.Cible??
    sûrement qu'il essaye de définir la date mais qu'il n'accepte pas les valeurs nulles

    (ça ressemble au sinarf_datechooser traffiqué ce truc là, non?)

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    166
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2006
    Messages : 166
    Points : 169
    Points
    169
    Par défaut
    Tofalu: Ah? D'accord merci.

    Ça m'étonne, quand même. Dans la fonction, j'attends un paramètre objet Control. Si c'était .value que j'avais, il me semble que ça planterait sur le "set frm... = ....". Idem dans le formulaire où j'utilise la propriété .value du contrôle.

    Tu as une idée pourquoi ça ne plante pas?
    Ou mieux : comment faire pour faire sûr que c'es bien l'objet qui sera passé et non pas la propriété par défaut?

    Merci encore!


    ÉDIT: Je suis d'accord avec Arkham. Je crois que c'est bien le contrôle que j'envoie. C'est le contrôle... sauf quand le champ est vide, où je semble alors envoyer la valeur. Bizarre... Ou alors, ce n'est pas ça non plus.

    Caro

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    166
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2006
    Messages : 166
    Points : 169
    Points
    169
    Par défaut
    Arkham46 : Oui exactement, c'est le datechooser auquel j'ai ajouté une initialisation à partir du contrôle cible plutôt que toujours la date now. Ça fonctionne nickel quand il y a une date : c'est quand le champ est vide que je me retrouve avec un paramètre null qui sort de null part.

    Dans Form_frmCalendrier.Cible:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Property Set Cible(ctl As Control)
        Set m_prpCtlCible = ctl
        Me.ctlCalendrier.Value = CDate(m_prpCtlCible.Value)
    End Property
    Mais ça plante vraiment avant l'appel de Cible.

    EDIT: Non, en fait tu as raison. C'est Me.ctlCalendrier.Value qui plante. Remarque, le fait que ctl soit null ne me semble toujours pas normal. Mettre une gestion d'erreur là ne changerait rien : si j'ai pas de cible, le datechooser ne sert à rien.

    Caroline

  6. #6
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Le code se produit sur l'évenement clic d'un bouton, on peut donc utiliser la méthode ActiveForm

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    'Ouvre le formulaire calendrier 
    Public Function btCalendrier_Click(txtCible as String) 
        DoCmd.OpenForm "frmCalendrier"  'frmCalendrier: independante=oui et modale=oui 
        Set Form_frmCalendrier.Cible = screen.ActiveForm.Controls(txtCible)
    End Function
    A essayer

    Dans tous les cas, c'est assez bizarre que ça plante que quand le controle est vide. Pour ma part j'aurais penser que VBA est capable de passer un controle en argument mais pas Access dans la propriété d'un évenement... Or ça semble marcher quand le controle est rempli... C'est trés bizarre

  7. #7
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 526
    Points
    14 526
    Par défaut
    Citation Envoyé par Caroline1
    C'est Me.ctlCalendrier.Value qui plante. Remarque, le fait que ctl soit null ne me semble toujours pas normal. Mettre une gestion d'erreur là ne changerait rien : si j'ai pas de cible, le datechooser ne sert à rien.
    Si le control était null tu n'arriverais pas jusqu'au Me.ctlCalendrier.Value
    Il n'est pas possible de passer un null dans un control, c'est uniquement possible avec un type variant
    Le Null je pense que c'est bien la valeur du champ, ça signifie juste qu'il n'y a rien dans le champ mais le champ existe bel et bien.

    J'essayerais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Property Set Cible(ctl As Control) 
        Set m_prpCtlCible = ctl 
        If not IsNull(m_prpCtlCible.Value) then
           Me.ctlCalendrier.Value = CDate(m_prpCtlCible.Value) 
        End If
    End Property
    histoire de ne pas mettre de valeur initial si le contôle est vide (c'est le CDate qui n'accepte pas le null).
    En espérant que le reste du datechooser l'accepte.

    Citation Envoyé par Tofalu
    Dans tous les cas, c'est assez bizarre que ça plante que quand le controle est vide. Pour ma part j'aurais penser que VBA est capable de passer un controle en argument mais pas Access dans la propriété d'un évenement... Or ça semble marcher quand le controle est rempli... C'est trés bizarre
    J'ai souvenir d'avoir déjà utiliser un contrôle dans un événement (pour utiliser une même fonction sur différents contrôles c'est pratique), je sais pas avec une valeur null mais je ne vois pas pourquoi ça changerais quelque chose.

  8. #8
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Je pense pas que ça plante dans la propriété puisqu'il n'y a pas de gestion d'erreur donc l'erreur n'est pas remonté à l'appelant. L'erreur semble donc se produire sur le Set dans la fonction btCalendrier_Click et non pas aprés, sinon, le debuggueur se placerait dans la property non ?

  9. #9
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 526
    Points
    14 526
    Par défaut
    Citation Envoyé par Tofalu
    Je pense pas que ça plante dans la propriété puisqu'il n'y a pas de gestion d'erreur donc l'erreur n'est pas remonté à l'appelant. L'erreur semble donc se produire sur le Set dans la fonction btCalendrier_Click et non pas aprés, sinon, le debuggueur se placerait dans la property non ?
    Et si on a défini dans la base du datechooser de ne pas s'arrêter sur les erreurs non gérées, peut-être??

    De toute façon même en passant un string dans l'événement ça plantera dans la propriété au CDate si le contrôle a une valeur null...

    En mélangeant tout ça et en secouant bien ça devrait finir par fonctionner!

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    166
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2006
    Messages : 166
    Points : 169
    Points
    169
    Par défaut Merci!
    Merci à vous deux. C'est Tofalu qui avait la meilleure piste finalement.

    Avec l'espion, on voit bien c'est txtCible.Value (ou txtCible tout court) qui est null et non pas le contrôle lui-même, même une fois rendu dans Property Set Cible (si le problème aurait été les types, ça aurait fonctionné avec le ActiveForm... sauf qu'il faut faire attention parce qu'on vient d'ouvrir justement le formulaire calendrier. Le ActiveForm n,est donc plus celui qui contient le bouton cliqué et le champs de texte qu'on veut initialiser.)

    Enfin bref, c'était vraiment la ligne pour assigner une valeur au calendrier qui plantait.

    Solution (juste un test Not IsNull)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Property Set Cible(ctl As Control)
        Set m_prpCtlCible = ctl
     
        If (Not IsNull(m_prpCtlCible.Value)) Then _
            Me.ctlCalendrier.Value = CDate(m_prpCtlCible.Value)
    End Property
    À noter aussi que le tutoriel datechooser dit d'ajouter Me.CtlCalendar.Value = Now dans l'évènement Open du formulaire, ce qui ne fonctionne pas. Il faut le mettre dans l'évènement Load (Access 2003).

    Caroline

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 09/06/2010, 11h24
  2. Réponses: 4
    Dernier message: 18/01/2010, 12h38
  3. [AC-2002] Me.OpenArgs Null alors que ce n'est pas vrai
    Par jaffael dans le forum VBA Access
    Réponses: 3
    Dernier message: 08/06/2009, 17h32
  4. Réponses: 4
    Dernier message: 20/09/2006, 16h58
  5. Probleme CSS : Text centrer alors que je le veux a gauche...
    Par vampyrx dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 18/07/2005, 23h53

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