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 :

Conflit de codes dans VBA


Sujet :

VBA Access

  1. #1
    Membre du Club
    Inscrit en
    Août 2010
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 64
    Points : 48
    Points
    48
    Par défaut Conflit de codes dans VBA
    Bonjour,

    N'y connaissant rien au VBA, j'avance par essai-erreur... Mais là je ne vois pas comment je pourrais faire fonctionner ces deux codes qui semble devoir être placés au même endroit...

    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
    Private Sub Form_Current()
     
        If Me.ID < (DMax("ID", "OBS_Species_Rhopalocera") + 1) Then
        MsgBox ("Warning: you are moving to another record")
        End If
     
        If IsNull(Me.X) Then
        Me.Square.Locked = False
        Me.Grid.Locked = False
     
        Else
        Me.Square.Locked = True
        Me.Grid.Locked = True
        End If
     
    End Sub
    Avec un seul code à la fois ca marche pourtant !

    Merci d'avance et bonne journée !

  2. #2
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 056
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 056
    Points : 24 655
    Points
    24 655
    Par défaut
    Bonjour,

    où est le conflit ?

    cordialement,

  3. #3
    Membre du Club
    Inscrit en
    Août 2010
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 64
    Points : 48
    Points
    48
    Par défaut
    Bonjour,

    Je ne sais pas si cela s'appelle vraiment un "conflit", mais ce que je remarque c'est que introduit de cette manière seul le premier code fonctionne, et pas le deuxième...
    Faut il placer ce deuxième code dans une autre procédure que Form - Current ?

    Merci

  4. #4
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 056
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 056
    Points : 24 655
    Points
    24 655
    Par défaut
    Premier ou second ?

    Je n'en vois qu'un posté.

  5. #5
    Membre du Club
    Inscrit en
    Août 2010
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 64
    Points : 48
    Points
    48
    Par défaut
    Désolé, je n'utilise peut-être pas le bon vocabulaire, mais voici mon problème plus en détail.

    Lorsque je place uniquement ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Form_Current()
     
        If Me.ID < (DMax("ID", "OBS_Species_Rhopalocera") + 1) Then
        MsgBox ("Warning: you are moving to another record")
        End If
     
    End Sub
    mon message d'alerte s'affiche bien lorsque je change de numéro d'enregistrement dans le formulaire.

    Lorsque je tape ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub Form_Current()
        If IsNull(Me.X) Then
        Me.Square.Locked = False
        Me.Grid.Locked = False
     
        Else
        Me.Square.Locked = True
        Me.Grid.Locked = True
        End If
     
    End Sub
    J'arrive bie na bloquer les champs "Square" et "Grid" si le champ "X" n'est pas nul.

    Mais lorsque je tape ceci :
    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
    Private Sub Form_Current()
     
        If Me.ID < (DMax("ID", "OBS_Species_Rhopalocera") + 1) Then
        MsgBox ("Warning: you are moving to another record")
        End If
     
        If IsNull(Me.X) Then
        Me.Square.Locked = False
        Me.Grid.Locked = False
     
        Else
        Me.Square.Locked = True
        Me.Grid.Locked = True
        End If
     
    End Sub
    les champs "Square" et "Grid" ne se bloquent plus...

    Je ne comprend pas...

  6. #6
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 056
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 056
    Points : 24 655
    Points
    24 655
    Par défaut
    Ok je comprends ce que tu veux dire.

    Par contre je ne comprends pas non plus pourquoi. A part que X soit null.

    Par contre que cherches-tu à faire avec cette syntaxe ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.ID < (DMax("ID", "OBS_Species_Rhopalocera") + 1)
    Traduction :
    Si ID est inf ID le plus grand + 1
    exemple :
    Soit une série d'ID 1 à 10
    que tu sois sur 1 ou 10 c'est toujours 11 qui sera retourné.

    Cela se produira tout le temps.

    Tu crée une base pour l'observation des papillons ?

  7. #7
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 89
    Points : 61
    Points
    61
    Par défaut
    Bonjour gravier3000, loufab,

    J'ai déjà eu un problème similaire il y a longtemps, je vous propose d'aller y jeter un coup d'oeil et me dire ce que vous en pensez.

    Je crois que l'évènement Current n'est pas fait pour ce genre de manip parce que -je crois- qu'il se déclenche "un peu trop" vite pour ça, je veux dire: avant le traitement et l'affichage des données.

    Je parie que "X" est un champ calculé!?
    A vous

  8. #8
    Membre du Club
    Inscrit en
    Août 2010
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 64
    Points : 48
    Points
    48
    Par défaut
    Bonjour,

    Loufab, ce code permet d'afficher un message d'alerte pour prévenir l'utilisateur qu'il change d'enregistrement (pour éviter d'encoder dans un mauvais enregistrement). Sans le +1, le message d'erreur n'appareit pas lorsqu'on passe d'un nouvel enregistrement (encore sans ID) à un enregistrement possédant un ID...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.ID < (DMax("ID", "OBS_Species_Rhopalocera") + 1)
    Effectivement il s'agit d'une bdd pour des observations de papillons (pour le formulaire en question), mais également pour toute une série d'autres groupes d'espèces (dont les formulaires sont semblables). Naturaliste ?

    Le champ X n'est pas calculé.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    385
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 385
    Points : 492
    Points
    492
    Par défaut
    bonsoir ,

    Je suis un peu comme loufab la ... ! J'ai un souci de compréhension sur ton :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        If Me.ID < (DMax("ID", "OBS_Species_Rhopalocera") + 1) Then
        MsgBox ("Warning: you are moving to another record")
    ce code permet d'afficher un message d'alerte pour prévenir l'utilisateur qu'il change d'enregistrement (pour éviter d'encoder dans un mauvais enregistrement).
    Ton If Me.ID < DMax = Tu es sur un ID qui es déjà rempli de donnée.
    (1 ID = Une ligne = Un enregistrement)

    Ton code devrais être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        If Me.ID <= (DMax("ID", "OBS_Species_Rhopalocera")) Then
        MsgBox ("Vous êtes sur la plage d'enregistrement")
    If Me.ID > (DMax("ID", "OBS_Species_Rhopalocera")) Then
        MsgBox ("Attention cette enregistrement n'existe pas")
    Dmax = Ton nombre maximum d'enregistrement ... en gros si tu as 3enfants , tu ne peu pas te placer sur Enfant+1 ... tu n'as pas de 4eme enfant donc erreur ...

    Ton +1 est très troublant .. o_o !

    Cordialement,

  10. #10
    Membre du Club
    Inscrit en
    Août 2010
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 64
    Points : 48
    Points
    48
    Par défaut
    Bonjour,

    Expliqué comme cela c'est vrai que c'est louche, mais cela marche ! Cependant j'ai quand même remplacé le +1 par un <=.
    Je ne comprend pas la deuxième partie du code que tu proposes, et ne parviens pas à la faire fonctionner (message d'erreur dans la fenêtre VBA " Compil error : block If without End If")

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub Form_Current()
     
        If Me.ID <= (DMax("ID", "OBS_Species_Rhopalocera")) Then
        MsgBox ("Vous êtes sur la plage d'enregistrement")
     
        If Me.ID > (DMax("ID", "OBS_Species_Rhopalocera")) Then
        MsgBox ("Attention cette enregistrement n'existe pas")
        End If
     
    End Sub
    Comment le ID peut-il être supérieur à Dmax ?

  11. #11
    Membre du Club
    Inscrit en
    Août 2010
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 64
    Points : 48
    Points
    48
    Par défaut
    Mais en fait le problème à la base de cette discussion était savoir pourquoi le code suivant ne marche pas :

    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
    Private Sub Form_Current()
     
        If Me.ID < (DMax("ID", "OBS_Species_Mollusca") + 1) Then
        MsgBox ("Warning: you are moving to another record")
        End If
     
        If IsNull(Me.X) Then
        Me.Square.Locked = False
        Me.Grid.Locked = False
     
        Else
        Me.Square.Locked = True
        Me.Grid.Locked = True
        End If
     
    End Sub
    La première partie qui vise a faire apparaitre le message "Warning : you are..." fonctionne toujours, mais la suite pas.

    Ce qui a donc été fait, c'est de laisser cette première partie de code dans l'évènement Current, et de remplacer la suite par ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub X_GotFocus()
     
        If IsNull(Me.Square) And IsNull(Me.Grid) Then
            Me.X.Locked = False
            Else
                Me.X.Locked = True
                MsgBox ("You are not allowed to fill in the geographical coordinates and the grid system for the same record")
        End If
     
    End Sub
    Explications : pour situer géographiquement l'observation d'une espèce, l'observateur à le choix entre donner une coordonnée exacte (geographical coordinates) ou donner le numéro d'un carré (grid system).

    Ce code est adapté pour chaque champ de chacun des deux systèmes de référence géographique (X, Y,... pour le premier et Square, Grid pour le deuxième).
    Donc si un des champ d'un des deux systeme de référence géographique est rempli, les champ de l'autre système de référence géographique est bloqué et le message apparait !

    C'est donc RESOLU !

    PS : un autre problème apparait, le message apparait dès que l'on sélectionne le champ bloqué. Serait il possible de faire apparaitre le message seulement lorsqu'on y introduit quelque chose ? Ceci fera l'objet d'une nouvelle discussion...

    Merci

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    385
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 385
    Points : 492
    Points
    492
    Par défaut
    Oups ...
    Deux if en entrée ... et un seul End if ... -_- ! FAIL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub Form_Current()
     
        If Me.ID <= (DMax("ID", "OBS_Species_Rhopalocera")) Then
        MsgBox ("Vous êtes sur la plage d'enregistrement")
     
        If Me.ID > (DMax("ID", "OBS_Species_Rhopalocera")) Then
        MsgBox ("Attention cette enregistrement n'existe pas")
        End If
        End If
     
    End Sub
    Ou un peu mieux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub Form_Current()
     
        If Me.ID <= (DMax("ID", "OBS_Species_Rhopalocera")) Then
        MsgBox ("Vous êtes sur la plage d'enregistrement")
     
        ElseIf Me.ID > (DMax("ID", "OBS_Species_Rhopalocera")) Then
        MsgBox ("Attention cette enregistrement n'existe pas")
        End If
     
    End Sub
    Comment le ID peut-il être supérieur à Dmax ?
    Justement il ne le peu pas ,c'est pour cela que je te met un msgerr : cette enregistrement n'existe pas! Ce qui te sert de butté Supérieur si tu préfère.
    Je ne connais pas ton programme en détail mais je pense que ici cela est dans le cadre d'un passage sur enregistrement du Style Next/Next/Next...
    (Lapin, NEXT , Cheval , NEXT , coyotte , NEXT , MsgErreur Enregistrement inexistant on reste donc sur le Coyotte)

    Ce qui j'apparenterais à ce que je fait pour les Dates (ici : http://www.developpez.net/forums/d96...-current-date/ )

    Ce qui te donnerais au final un code plutôt du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    Private Sub Form_Current()
     Dim NextSpecies As Integer
        If Me.ID + 1 <= (DMax("ID", "OBS_Species_Rhopalocera")) Then
        'affichage de l'espèce suivante 
         Me.ID = Me.ID + 1
     
        ElseIf Me.ID + 1 > (DMax("ID", "OBS_Species_Rhopalocera")) Then
       'On dépasse le nombre d'enregistrement existant
    NextSpecies = MsgBox("Especes suivante Impossible a atteindre", vbOKOnly + vbExclamation + vbApplicationModal, "Espèce hors limite")
     
        End If
    End Sub
    Cordialement à toi ,


    EDIT : Oui au final on c'est peu être un peu perdu la dedans , ne comprenant pas cette parti de code de départ ! Sorry

  13. #13
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 89
    Points : 61
    Points
    61
    Par défaut
    Bonjour,

    En fait, moi je crois qu'il veut tout simplement afficher un message lorsqu'on passe à un autre enregistrement et ne rien afficher s'il s'agit d'un nouvel enregistrement (ID inexistant) et justement l'évènement Current se produit à chaque fois que l'on change d'enregistrement.

    Ca c'était concernant le "code louche" sinon pour le problème initial je vois que c'est "résolu" donc tant mieux.

    Bonne continuation

  14. #14
    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
    @MisterS :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub Form_Current()
     
        If Me.ID <= (DMax("ID", "OBS_Species_Rhopalocera")) Then
        MsgBox ("Vous êtes sur la plage d'enregistrement")
     
        ElseIf Me.ID > (DMax("ID", "OBS_Species_Rhopalocera")) Then
        MsgBox ("Attention cette enregistrement n'existe pas")
        End If
     
    End Sub
    A quoi sert le ElseIf ... Un Else suffit. Si ID n'est pas <= à Z, alors il y a fort à parier qu'il est forcément > Z non ?

  15. #15
    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
    Citation Envoyé par mondev Voir le message
    Bonjour,

    En fait, moi je crois qu'il veut tout simplement afficher un message lorsqu'on passe à un autre enregistrement et ne rien afficher s'il s'agit d'un nouvel enregistrement (ID inexistant) et justement l'évènement Current se produit à chaque fois que l'on change d'enregistrement.

    Ca c'était concernant le "code louche" sinon pour le problème initial je vois que c'est "résolu" donc tant mieux.

    Bonne continuation
    Dans ce cas, il y a plus propre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Form_Current()
    If Me.NewRecord Then
      MsgBox "Vous etes en mode création"
    Else
      MsgBox "Vous etes en mode visualisation"
    End If
    End Sub

  16. #16
    Membre expérimenté
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Points : 1 535
    Points
    1 535
    Par défaut
    Bonjour,
    que se passe-t-il pour les champs Square et Grid lorsque l'utilisateur est sur un nouvel enregistrement ?
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     Sub Form_Current()
      If Not Me.NewRecord Then
              MsgBox ("Warning: you are moving to another record")
              Me.Square.Locked=false
      Else
        Me.Square.Locked=(Not Isnull(Me.X))
      End if
     End sub
     Me.Grid.Locked=Me.Square.Locked

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

Discussions similaires

  1. une action dans excel peut elle créer une ligne de code dans VBA?
    Par beebe dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 25/09/2008, 07h23
  2. Utiliser du code SQL dans VBA
    Par a2line dans le forum Requêtes et SQL.
    Réponses: 25
    Dernier message: 30/05/2006, 14h53
  3. [VBA-E]Supprimer macro (code dans code feuille de calcul)
    Par Elstak dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 07/04/2006, 16h37
  4. [VBA Excel] Comment écrire un code dans le ThisWorkBook ?
    Par WebPac dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 03/05/2005, 15h03

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