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 :

Code pour changer la valeur Faux en Vrai d'un champ d'une table Access


Sujet :

VBA Access

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Formateur
    Inscrit en
    Novembre 2014
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Formateur

    Informations forums :
    Inscription : Novembre 2014
    Messages : 59
    Points : 31
    Points
    31
    Par défaut Code pour changer la valeur Faux en Vrai d'un champ d'une table Access
    Bonjour à tous,

    j'ai un code qui permet d'envoyer automatiquement des Emails à l'ouverture d'un formulaire. ce code fonctionne admirablement bien (et je ne remercierais jamais assez la personne qui me l'a fourni)
    Ca fonctionne même un peu trop bien! Car les mails partent à chaque ouverture du formulaire au risque de lasser (voir d'agacer!! ) les destinataires qui pourraient à très court terme me faire ma fête si je continue à leur pourrir leur boite de 50 mails identiques par jour!
    J'ai donc essayer d'améliorer les choses en incluant dans ma table (à partir de laquelle est bâtie ma requête) un champ vrai faux qui est "faux" par défaut et que je voudrais automatiquement passer à "Vrai" lors de l'envoie du mail ce qui conditionnerais la condition de blocage lors d'une seconde ouverture de formulaire (le champ Envoi1 est "Faux" = envoi de mail, le champ Envoi1 est "Vrai" pas d'envoi...)

    Pour cela j'ai le code si dessous mais je n'arrive pas à trouver la bonne syntaxe pour arriver à mes fins... Quelqu'un pour m'aider?

    Merci beaucoup pour une aide que je sais déjà précieuse.
    A vous lire
    Angelinu


    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    Private Sub Form_Open(Cancel As Integer)
        Dim Listerappel1Bis As String
        Dim Listerappel1 As String
        Dim ThemForm1 As String
        Dim CheckEnvoi1 As String '(variable pour mon champ Vrai/faux)
        Dim MonMessage As String, MonSujet As String
     
        Set Rappel1 = CurrentDb.OpenRecordset("R_120_118joursRenouveler")
     
        Rappel1.MoveFirst
     
        With Rappel1
        MonMessage = "La formation ou habilitation citée en sujet de ce mail expirera dans moins de 3 mois veuillez prendre contact avec votre hiérarchie et le service formation pour programmer une session de recyclage. ceci est un message automatique merci de ne pas y répondre."
     
            While Not Rappel1.EOF
     
                Listerappel1 = Rappel1("AdresseSalarie")
                Listerappel1Bis = Rappel1("AdresseHierarchie")
                ThemForm1 = Rappel1("NomTheme")
                CheckEnvoi1 = Rappel1("Envoi1") 'Envoi1 nom de mon champ Vrai/Faux dans ma table
     
                If Listerappel1 = "" Then
                    Resume Next
     
                ElseIf CheckEnvoi1 = 0 Then 'J'ai essayé aussi avec les propriétés True en False mais cela me renvoie toujours une erreur
                Resume Next
     
                Else
                    Call EnvoieMail_Angelinu(Listerappel1, Listerappel1Bis, ThemForm1, MonMessage)
                    CheckEnvoi1 = 1 'Passage de la valeur Faux à la valeur Vraie pour bloquer les envoie ultérieur 
     
                    Rappel1.MoveNext
                End If
            Wend
        End With
     
        Rappel1.Close
        Set Rappel1 = Nothing
     
     
    'Procédure d'envoie des Emails
    Sub EnvoieMail_Auto(ByVal Aqui As String, ByVal EnCopie As String, ByVal LeSujet As String, ByVal LeMessage As String)
     
    Dim EnvoiOutlook1 As Object
    Dim MailOutlook1 As Object
    Set EnvoiOutlook1 = CreateObject("Outlook.Application")
    Set MailOutlook1 = EnvoiOutlook1.createitem(0)
     
    With MailOutlook1
    .To = Aqui
        .CC = EnCopie
        .Subject = LeSujet
        .Body = LeMessage
        .display
        End With
     
     
    Set EnvoiOutlook1 = Nothing
    Set MailOutlook1 = Nothing
     
    End Sub

  2. #2
    Membre expert
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2012
    Messages
    1 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 1 871
    Points : 3 457
    Points
    3 457
    Par défaut
    Bonjour Angelinu,

    Tu dois déclarer ta variable à la ligne 5:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim CheckEnvoi1 As Boolean '(variable pour mon champ Vrai/faux)
    Ensuite pour les valeurs: Vrai est égal à True (mot clé) ou -1 (numérique) et faux est égal à False (mot clé) ou 0 (numérique).

    Bonne journée
    Ce qui se conçoit bien s’énonce clairement et les mots pour le dire arrivent aisément. Nicolas Boileau
    Si tout est OK, n'oubliez pas de cliquer sur

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Formateur
    Inscrit en
    Novembre 2014
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Formateur

    Informations forums :
    Inscription : Novembre 2014
    Messages : 59
    Points : 31
    Points
    31
    Par défaut
    Merci beaucoup j'essaie ça de suite!

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Formateur
    Inscrit en
    Novembre 2014
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Formateur

    Informations forums :
    Inscription : Novembre 2014
    Messages : 59
    Points : 31
    Points
    31
    Par défaut
    Salut ,

    Hélas ça ne fonctionne pas en l'état.
    Avec les valeurs True/False le code est en quelque sorte ignoré: les mails sont envoyés, pas de message d'erreur mais la propriété de "Envoi1" ne passe pas à True dans la base et donc les mails continuent d'être envoyés à chaque ouverture de formulaire
    Avec la propriété 0/-1 ça ne fonctionne pas du tout: message d'erreur et débogage.
    Je te remets le code modifié avec "Boolean"
    Peut être le problème vient de la ligne 20-21 ne faut-il ajouter une commande Insert ou Update pour enregistrer le change de False à True et si oui comment le coder pour une liste de variable (je sais à peut prés comment faire avec un enregistrement sélectionné mais pas avec un ensemble d'enregistrements)

    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
    31
    32
    33
    34
    35
    36
    37
    38
    Private Sub Form_Open(Cancel As Integer)
        Dim Listerappel1Bis As String
        Dim Listerappel1 As String
        Dim ThemForm1 As String
        Dim CheckEnvoi1 As Boolean '(variable pour mon champ Vrai/faux)
        Dim MonMessage As String, MonSujet As String
     
        Set Rappel1 = CurrentDb.OpenRecordset("R_120_118joursRenouveler")
     
        Rappel1.MoveFirst
     
        With Rappel1
        MonMessage = "La formation ou habilitation citée en sujet de ce mail expirera dans moins de 3 mois veuillez prendre contact avec votre hiérarchie et le service formation pour programmer une session de recyclage. ceci est un message automatique merci de ne pas y répondre."
     
            While Not Rappel1.EOF
     
                Listerappel1 = Rappel1("AdresseSalarie")
                Listerappel1Bis = Rappel1("AdresseHierarchie")
                ThemForm1 = Rappel1("NomTheme")
                CheckEnvoi1 = Rappel1("Envoi1") 'Envoi1 nom de mon champ Vrai/Faux dans ma table
     
                If Listerappel1 = "" Then
                    Resume Next
     
                ElseIf CheckEnvoi1 = True Then 
                Resume Next
     
                Else
                    Call EnvoieMail_Angelinu(Listerappel1, Listerappel1Bis, ThemForm1, MonMessage)
                    CheckEnvoi1 = True  Commande Update ou Insert ?
     
                    Rappel1.MoveNext
                End If
            Wend
        End With
     
        Rappel1.Close
        Set Rappel1 = Nothing

    Merci beaucoup de ton aide.

  5. #5
    Membre expert
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2012
    Messages
    1 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 1 871
    Points : 3 457
    Points
    3 457
    Par défaut
    Bonjour Angelinu,

    Comme je n'ai pas la base il est difficile pour moi de te donner une réponse précise. Ce que je remarque dans ton code, tu déclares une variable string "MonSujet" mais tu ne l'utilises pas! Tu fais des Resume Next inutiles.

    Voici un code basé sur le tien qui parcours les enregistrements de ta requête et qui va appeler la fonction "EnvoieMail_Angelinu" seulement si l'adresse mail est renseigné et que le champ "Envoi1" est faux (si ta requête est utilisé uniquement pour cette action, il serait plus efficace de mettre les conditions dans la requête au lieu de les tester dans le code). Ensuite on inscrit dans le champ "Envoi1" la valeur vrai (cela est possible seulement si ta requête est updatable).
    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
    31
    32
    Option Compare Database
    Option Explicit
     
    Private Sub Form_Open(Cancel As Integer)
     
        Dim db As DAO.Database: Set db = CurrentDb
        Dim Rappel1 As DAO.Recordset
        Dim Listerappel1Bis As String, Listerappel1 As String, ThemForm1 As String, MonMessage As String, MonSujet As String
        Dim CheckEnvoi1 As Boolean '(variable pour mon champ Vrai/faux)
     
        MonMessage = "La formation ou habilitation citée en sujet de ce mail expirera dans moins de 3 mois veuillez prendre contact avec votre hiérarchie et le service formation pour programmer une session de recyclage. ceci est un message automatique merci de ne pas y répondre."
     
        Set Rappel1 = db.OpenRecordset("R_120_118joursRenouveler")
     
        While Not Rappel1.EOF
            Listerappel1 = Rappel1("AdresseSalarie")
            Listerappel1Bis = Rappel1("AdresseHierarchie")
            ThemForm1 = Rappel1("NomTheme")
            CheckEnvoi1 = Rappel1("Envoi1") 'Envoi1 nom de mon champ Vrai/Faux dans ma table
     
            If Listerappel1 <> "" And CheckEnvoi1 = False Then  'Ici si je crois que tu veux tester si on a une adresse et qu'un courriel n'a pas déjà été envoyé
                Call EnvoieMail_Angelinu(Listerappel1, Listerappel1Bis, ThemForm1, MonMessage)
                Rappel1.Edit
                    Rappel1("Envoi1") = True 'Ici tu inscrits qu'un courriel a été envoyé pour le record concerné
                Rappel1.Update
            End If
        Wend
        Rappel1.Close
        Set Rappel1 = Nothing
        Set db = Nothing
     
    End Sub
    Bonne journée
    Ce qui se conçoit bien s’énonce clairement et les mots pour le dire arrivent aisément. Nicolas Boileau
    Si tout est OK, n'oubliez pas de cliquer sur

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Formateur
    Inscrit en
    Novembre 2014
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Formateur

    Informations forums :
    Inscription : Novembre 2014
    Messages : 59
    Points : 31
    Points
    31
    Par défaut
    Merci je vais tester ce code demain matin.

    Bien cordialement

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Formateur
    Inscrit en
    Novembre 2014
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Formateur

    Informations forums :
    Inscription : Novembre 2014
    Messages : 59
    Points : 31
    Points
    31
    Par défaut
    Bonjour,

    Après quelques jours d’essais infructueux voici ce qu’il ressort
    J’ai testé ton code (et d’autres possibilités à partir du mien en « mixant les deux) le problème principale que j’ai constaté un problème qui revient dans à peu près toutes les solutions que j’ai pu tester :
    Lors de la 1er ouverture tout se passe bien et les mails sont envoyés le champ de base se met à jour en passant de False à True… Bref tout va bien…
    C’est lors d’une seconde ouverture que ça se gâte puisque à ce moment l’appli reste bloquée sur la l’écran d’accueil et plate Access, je suis obligé de faire un « crtl-Alt-Supr » pour mettre fin à son calvaire.
    Donc apparemment il y a un souci si dans le fait de changer la propriété du champ de False à True, en quelque sorte le code tel qu’il est là ce fait un sac lorsqu’il rencontre un champ « True » dans la requête effectué.
    J’ai essayé de changer en mettant mon champs en formant date ou chaine de caractère c’est pareil…

    Je remets ton code avec en plus les instructions "move first" "move next" car sinon il y avait plantage de l'appli après envoi du 1er mail...
    Si tu as besoin que je joigne la requête dis-le moi.
    je continue de chercher de mon côté, à bientôt avce la solution j'espère! :-)

    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 Form_Open(Cancel As Integer)
     
        Dim db As DAO.Database: Set db = CurrentDb
        Dim Rappel1 As DAO.Recordset
        Dim Listerappel1Bis As String, Listerappel1 As String, ThemForm1 As String, MonMessage As String
        Dim CheckEnvoi1 As Boolean '(variable pour mon champ Vrai/faux)
     
        MonMessage = "La formation ou habilitation citée en sujet de ce mail expirera dans moins de 3 mois veuillez prendre contact avec votre hiérarchie et le service formation pour programmer une session de recyclage. ceci est un message automatique merci de ne pas y répondre."
     
        Set Rappel1 = db.OpenRecordset("R_120_118joursRenouveler")
     Rappel1.MoveFirst
        While Not Rappel1.EOF
            Listerappel1 = Rappel1("AdresseSalarie")
            Listerappel1Bis = Rappel1("AdresseHierarchie")
            ThemForm1 = Rappel1("NomTheme")
            CheckEnvoi1 = Rappel1("Envoi1") 'Envoi1 nom de mon champ Vrai/Faux dans ma table
     
            If Listerappel1 <> "" And CheckEnvoi1 = False Then  'Ici si je crois que tu veux tester si on a une adresse et qu'un courriel n'a pas déjà été envoyé
                Call EnvoieMail_Angelinu(Listerappel1, Listerappel1Bis, ThemForm1, MonMessage)
                Rappel1.Edit
                    Rappel1("Envoi1") = True 'Ici tu inscrits qu'un courriel a été envoyé pour le record concerné
                Rappel1.Update
    Rappel1.MoveNext
            End If
        Wend
        Rappel1.Close
        Set Rappel1 = Nothing
        Set db = Nothing
     
    End Sub

  8. #8
    Membre expert
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2012
    Messages
    1 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 1 871
    Points : 3 457
    Points
    3 457
    Par défaut
    Bonjour Angelinu,

    Je ne vois pas la nécessité du Rappel1.MoveFirst, pour ce qui est de Rappel1.MoveNext il est essentiel, un oubli de ma part.

    Si tu supprimes le MoveFirst est-ce que ça règle ton problème.

    Bonne journée
    Ce qui se conçoit bien s’énonce clairement et les mots pour le dire arrivent aisément. Nicolas Boileau
    Si tout est OK, n'oubliez pas de cliquer sur

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Formateur
    Inscrit en
    Novembre 2014
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Formateur

    Informations forums :
    Inscription : Novembre 2014
    Messages : 59
    Points : 31
    Points
    31
    Par défaut
    Bonjour,

    Alors pour MoveFirst aucun effet ni dans un sens ni dans l'autre donc je l'ai effectivement viré.

    Et j'ai réussi à contourné le problème de la second ouverture de formulaire (et suivante) en mettant un critère "=False" directement dans ma requête ce qui fait qu'à la 1er ouverture j'ai tout mes enregistrements avec l'envoie des Email et le passage à la valeur True après que si je rouvre mon formulaire la requête est vide... donc pas d'envoie...
    je ne sais pas si c'est ma manière la plus élégante mais en tout cas c’est efficace et ça répond à mon besoin donc... c’est cool!!

    Merci encore pour les indications et l'orientation donnée sinon j'y serais peut être encore.

    bien à toi

    Discussion résolue!!

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 27/01/2014, 19h50
  2. [A-07] Valeur automatique d'un champs dans une table Access
    Par bertin19 dans le forum Modélisation
    Réponses: 4
    Dernier message: 18/11/2008, 10h20
  3. Champs dans une table Access avec valeurs #00
    Par Stool dans le forum Bases de données
    Réponses: 0
    Dernier message: 23/04/2008, 16h12
  4. Réponses: 3
    Dernier message: 01/06/2006, 09h49
  5. [Batch] Code pour changer le dns
    Par rabobsky dans le forum Windows XP
    Réponses: 2
    Dernier message: 14/10/2005, 22h13

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