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 de code vba ligne if surligné en jaune


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 121
    Par défaut Problème de code vba ligne if surligné en jaune
    Bonjour,
    je veux créer un code pour contrôler une date saisie dans un formulaire (formulaire créer à partir d'une table appeler DATE SCTC, donc le champ date de cette table en est la source de contrôle de la zone de texte du formulaire )
    Et je veux qu'avec mon code (saisie dans la propriété de ma zone de texte en mettant une procédure évenementiel dans "sur entré") il vérifie dans une table "date ctc" si cette date n'éxiste pas déjà. Alors j'ai fait ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Date_Enter()
    If [Date] Eqv [Date ctc]![Date] Then
    msgbox "Date éxistante dans la base de donnée"
    End If
    End Sub
    le [date] juste après if est mon champ du formulaire.
    Quand je dis que ça ne marche pas, cela veut dire que lorsque j’ai finis de saisir mon code que je quitte les propriétés et que je quitte le mode création pour afficher le formulaire mon code ne marche pas et je dois ouvrir une fenêtre de débogage, la ma ligne de if à then et surligner en jaune
    Du bonheur du bonheur du bonheur…

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

    On ne donne pas à un nom de champ le nom Date qui est une fonction.

    Philippe

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 121
    Par défaut
    Il faudrait que je change mon nom de champ?
    Par ailleur j'ai instauré un valide si pour assurer que la date saisie est bien une fin de mois, je peu compilier les deux dans un code,

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 121
    Par défaut
    je viens d'essayer en remplacant Date par Datectc, et ça ne change pas au moment d'afficher le formulaire il me met :
    "impossible d'ouvrir le champ "l" auxquelle il est fait référence dans votre expression.
    ça veut dire quoi quand access surligne en jaune une ligne de mon code ?

  5. #5
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 76
    Par défaut
    Quand Access surligne une ligne en jaune, c'est qu'elle pose problème.

    Dans la condition de ton if, le [Date ctc]![Date] correspond à la valeur de la date dans ta table si j'ai bien compris ?
    Si c'est le cas, c'est ça qui pose problème.

    Quand le code plante et quel est le message d'erreur qui est sur la fenêtre qui s'ouvre ?

    Et dernier point, prends l'habitude de mettre des parenthèses dans pour tes condition. Il est beaucoup de plus simple de lire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If (condition) Then
     
        Expression
     
    End If
    Que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If condition then
    Expression
    End If
    C'est les petits trucs qui font qu'il est moins pénible de reprendre le code de quelqu'un.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 121
    Par défaut
    Alors j’ai essayé un autre système que voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Date_Enter()
    Rechdom([Datectc], "date ct") = (Forms![Date]![Datectc]) = Null
    End Sub
    Qui ne marches pas non plus j’ai le droit à
    « l’expression sur entrée entrée, comme paramètre de la propriété type événement est à l’origine d’une erreur , Sub ou Function non définis. »

    lorsque j’utilise un code du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Date_Enter()
    If [Date] Eqv [Date ctc]![Date] Then
    msgbox "Date éxistante dans la base de donnée"
    End If
    End Sub
    J’ai un message visual basic qui me dis, « impossible de trouver le champ ‘l’ auquel il est fait référence dans votre expression. »
    Ensuite je clic sur débogage et dans ma ligne surligné :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If [Date] Eqv [Date ctc]![Date] Then
    Si je mets ma souris sur le premier [Date] j’ai une étiquette qui apparaît à ce moment en mettant [Date]=Null, est ce une suggestion ?

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 121
    Par défaut
    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
    20
    21
    22
    23
    Option Compare Database
    Private Sub Date_Enter()
    Dim bd As Database
    Dim rst As Recordset
     
     Set bd = CurrentDb
     Set rst = CurrentDb.OpenRecordset("Select * from Date ctc", dbOpenTable)
     
    rst.MoveFirst
     
    Do Until (rst.EOF)
     
    If (Formulaires![Date]![Datectc] = rst![Datectc]) Then
    msgbox "la date saisie existe déjà dans la base de donnée"
    End If
     
    rst.MoveNext
     
    Loop
     
    rst.Close
     
    End Sub


    donne :

    "le moteur de base de données microsoft jet n'a pa pu trouver l'objet 'Select from*Date ctc'. Assurez vous que l'objet existe et que vous avez correctement saisi son nom et son chemin d'accès "
    Problème le nom de la table est bon

    De plus lorsque je positionne ma souris sur rst une étiquette apparait avec rst=nothing

  8. #8
    Expert confirmé
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Par défaut
    Re,

    Désolé, j'ai copier/coller la mauvaise ligne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set rst = CurrentDb.OpenRecordset("Date ctc", dbOpenTable)
    Et pour éviter tout problème, déclare implicitement la bibliothèque utilisée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim bd As DAO.Database
    Dim rst As DAO.Recordset
    Domi2

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 121
    Par défaut
    ok j'ai essayer ce code, rien ne beug mais...

    On touche au but je pense c'est à dire que le code ne marche pas pour unz bonne raison, mais avant je doit peut être faire une mise au point sur la procédure de saisie:

    J'ai une table DATE SCTC qui est utilisé dans le formulaire (lorsqu'on tape dans la zone de texte c'est dans cette table qu'est enregistré la date), Une table Date ctc qui contient toute les dates rentré dans DATE SCTC. Puis ma table HISTO SCTC qui contient mes dates avec mes indices et mes valeurs.

    L'action se déroule ainsi. J'ai créer un sous formulaire datectc à partir du champs "strDatectc" de la table DATE SCTC, et un sous formulaire Valeurs SCTC à partir d'une table VALEURS SCTC. C'est deux sous formulaires forment un formulaire de saisie SCTC. Lorsque que le formulaire est complété les choses se déroulent comme ça: (le tout dans une macro associé au bouton enregistrer)
    avec une requête "déverser date" la date saisie et envoyer dans ma table Date ctc pour y être conserver
    Ensuite avec une requête "déverser" les valeurs et la date saisie sont envoyer dans ma table HISTO SCTC pour y être historisé.
    Tout ça parce que après je dois faire une interpolation linéaire sur les indices.
    De plus, lorsque la personne ouvre le formulaire à partir du formulaire d'accueil, il clique sur un bouton associé à une macro qui éxécute ceci:
    Avec une requête elle fait une MAJ des valeurs de ma table VALEURS SCTC pour, et une autre requête fait une MAJ des valeurs de ma table DATE SCTC pour que mon formulaire de saisie soit vierge de ces valeurs pour l'utilisateurs.

    Après cette parenthèse venons en au fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub strDatectc_BeforeUpdate(Cancel As Integer)
    représente le champs de ma zone de texte ou est saisie la date :

    mais voilà c'est pas dans la table associé à se formulaire qu'il faut chercher la une date éxistante puisqu'elle sera forcément mise à jours, il faut chercher dans la table Date ctc et le champs Datectc.
    c'est pourquoi domi ton code marche je pense, enfin ça plante pas, mais il ne trouve rien puisque cette table est vide au moment ou il s'exécute

    La me vient une autre pensée. Je ne pourrai pas faire plus simple avec un formulaire à base d'une table HISTO SCTCet Date ctc (ou je mettrai indéxé sans doublon, ce qui vérifira ma date), qui serait vierge à chaque fois, sans requête de MAJ?. Enfin un vrai masque de saisie quoi

    Cordialement

    ps: est ce qu'il y a sur ce forum un moteur de recherche de topic?

  10. #10
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 76
    Par défaut
    J'ai arrété de suivre depuis que Domi a reprise la relève mais voici la page de recherche :http://www.developpez.net/forums/search.php

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 121
    Par défaut
    Merci je vais essayer

    Je me demandais aussi si j'étais dans le bonne évènement puisque mon code doit vérifier la date une fois que la personne la tapé dans le formulaire
    mois j'ai cliqué sur propriété en mode création et j'ai rentré mon code sur enter
    peut être qu'il faut le mettre sur sortis ou modification ou je sais pas

    puisque mon code maintenant donne :
    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
    20
    21
    22
    23
    24
    Option Compare Database
    Private Sub Date_Enter()
     
    Dim bd As DAO.Database
    Dim rst As DAO.Recordset
     
     Set bd = CurrentDb
     Set rst = CurrentDb.OpenRecordset("Date ctc", dbOpenTable)
     
    rst.MoveFirst
     
    Do Until (rst.EOF)
     
    If (Formulaires![Date]![Datectc] = rst![Datectc]) Then
    msgbox "la date saisie existe déjà dans la base de donnée"
    End If
     
    rst.MoveNext
     
    Loop
     
    rst.Close
     
    End Sub
    Et comme nouveau message d'erreur j'ai "aucun enregistrement". En effet j'en suis à l'élaboration de ma base il n'y a pas de données dedan

  12. #12
    Expert confirmé
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Par défaut
    Bonsoir,

    En utilisant cette méthode, tu risques encore d'avoir d'autres problèmes. Exemple, si tu modifies un autre champ dans ton formulaire, tu vas trouver un doublon, bien évidemment.

    Déjà, pour éviter toute confusion, renomme ton champ sur le formulaire différement, par exemple strDatectc

    Exemple de code avec le clône du recordset, à placer dans l'événement Avant MAJ du formulaire :

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    'Teste la présence d'enregistrement
    Me.RecordsetClone.MoveLast
     
    If Me.RecordsetClone.RecordCount > 0 Then
     
        'Teste la présence d'un éventuel doublon s'il s'agit d'un nouvel enregistrement ou en cas de modification du champ strDatectc 
        If Not Me.NewRecord And Me.strDatectcm.Value = Me.strDatectc.OldValue Then Exit Sub
     
        With Me.RecordsetClone
     
            .rst.FindFirst "Datectc = #" & Format(Me.strDatectc.Value, "mm\/dd\/yyyy") & "#"
     
            If Not .NoMatch Then
     
                'Message d 'erreur
                MsgBox "la date saisie existe déjà dans la base de donnée"                    
     
                Me.strDatectc.SetFocus
     
                Cancel = True
     
                Exit Sub
     
            End If
     
        End With
     
    End If
    Domi2

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 121
    Par défaut réponse qui ne fait pas avancer le schmilblick
    je te remercie domi, je vais essayer demain au boulot parce que chez moi c'est macintosh donc access... je ne l'ai pas

    Donc merci à vous deux déjà pour le temps passé sur mon problème et je vais essayer de mettre ton code domi demain

    bonne soirée !!!

    ça fait du bien d'être aidé quand on galère.

    ps: sur ton poste domi tu peux m'expliquer à ce que c'est le "me" c'est une fonction? parce que je pense que si je comprend pas le raisonnement de ton code je vais peut être avoir des difficulté à le mettre en place, je ne sais pas ce que t'en pense? De plus tu parles de quelle méthode au tout début de ton post?

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 121
    Par défaut
    Avec ce code il me met:
    instruction incorrect à l'extérieur d'une procédure
    donc je pense qu'on approche du but, il ne faudrai pas que je mette des avant le code?

  15. #15
    Expert confirmé
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Par défaut
    Bonjour,

    En mode création de ton formulaire, dans les propriétés, tu cliques dans l'événement Avant MAJ, puis sur les ... à droite et tu cliques sur générateur de code.

    Cela te génère du code dans l'éditeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Form_BeforeUpdate(Cancel As Integer)
     
    End Sub
    Tu colles le code donné plus haut entre ce deux lignes.

    Et si tu as des erreurs, merci de poster le code en entier en indiquant quelle ligne est surlignée en jaune.

    Domi2

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 121
    Par défaut
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    Private Sub Date_BeforeUpdate(Cancel As Integer)
    'Teste la présence d'enregistrement
    Me.RecordsetClone.MoveLast
     
    If Me.RecordsetClone.RecordCount > 0 Then
     
        'Teste la présence d'un éventuel doublon s'il s'agit d'un nouvel enregistrement ou en cas de modification du champ strDatectc
        If Not Me.NewRecord And Me.strDatectcm.Value = Me.strDatectc.OldValue Then Exit Sub
     
        With Me.RecordsetClone
     
            .rst.FindFirst "Datectc = #" & Format(Me.strDatectc.Value, "mm\/dd\/yyyy") & "#"
     
            If Not .NoMatch Then
     
                'Message d 'erreur
                msgbox "la date saisie existe déjà dans la base de donnée"
     
                Me.strDatectc.SetFocus
     
                Cancel = True
     
                Exit Sub
     
            End If
     
        End With
     
    End If
    End Sub
    Ligne surligné en jaune :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub Date_BeforeUpdate(Cancel As Integer)
    et aussi dans la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     If Not Me.NewRecord And Me.strDatectcm.Value = Me.strDatectc.OldValue Then Exit Sub
    j'ai qui est selectionné (comme si j'avais cliqué dessus avec ma souris) et il y a un msg d'erreur
    membre de méthode ou de donnée introuvable

  17. #17
    Expert confirmé
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Par défaut
    Bonjour,

    Ligne surligné en jaune :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub Date_BeforeUpdate(Cancel As Integer)
    C'est que tu n'as sans doute pas de champ dont le "Nom" est "Date". De toute façon, c'est mieux ainsi, il faut absolument éviter d'utiliser des termes réservés.

    Ceci étant, comme je l'ai indiqué plus haut, utilise plutôt l'événement Avant MAJ du formulaire, (voir discussion du 05.08.2009 à 09h48).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Date_BeforeUpdate(Cancel As Integer)
     
    End sub
    j'ai

    .strDatectcm qui est selectionné (comme si j'avais cliqué dessus avec ma souris) et il y a un msg d'erreur
    Relire mon message du 04.08.2009 à 20h23.

    Tu as "Datectcm" comme "Nom" du champ dans ta table et comme "Nom" du contrôle qui affiche cette info dans ton formulaire. Le genre de confusion qu'Access n'apprécie pas beaucoup.

    Tu dois donc renommer le champ du formulaire qui affiche ta date en "strDatectc". Tu peux lui donner un autre nom (sauf "Datectc" et encore moins "Date"). Dans ce cas, il te faudra adapter ton code en conséquence.

    Domi2

  18. #18
    Membre confirmé
    Homme Profil pro
    Ingénieur Électromécanicien
    Inscrit en
    Mars 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur Électromécanicien
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2008
    Messages : 60
    Par défaut
    bonjour,
    eh les mecs,
    j'ai lu, en diagonale, le problème alors pourquoi ne pas utiliser simplement une modifiable,de mettre sa LimitToList à true puisque les dates proviennent d'une table déjà existante ( et donc date valide, enfin sans intervalle) et d'exploiter l'événement NotInList(.............................).


    A+

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 121
    Par défaut
    Tu peux m'expliquer en quoi ça consiste?

    Moi je pense que je me suis compliqué la vie, le plus simple aurait été d'avoir une table date une table valeur qui se véverserai dans histo. J'aurai mis indexer sans doublon pour la table date et le pb aurait été réglé.
    Mais voila quand je crée mon masque de saisie avec l'assistant formulaire, je me retrouve avec tout les enregistrement précédent.
    Il n'y à pas moyen de faire en sorte que les données existante dans la table n'apparaisse pas dans mon masque de saisie
    Moyen autre que le mien expliquer deux post plus haut

Discussions similaires

  1. [AC-2013] Problème de code VBA
    Par kbrice dans le forum Access
    Réponses: 1
    Dernier message: 29/04/2015, 19h21
  2. [XL-2010] Problème de code VBA
    Par BENNASR dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 05/01/2015, 16h36
  3. [XL-2010] Problème de code VBA
    Par Kalteck dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 24/08/2012, 09h22
  4. [XL-2007] Code VBA pour supprimer des lignes sous condition - problème
    Par PeaceMaker dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 08/06/2011, 09h09

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