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 :

Variable pour email en relation avec requete


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 7
    Par défaut Variable pour email en relation avec requete
    Bonjour a tous,

    Voila, je suis actuellement en train de travailler sur un formulaire sous ACCESS 2002. Et j’ai un petit souci. Etant donné que je n’y connais pas grand-chose en VBA je me retrouve bloqué avec une fonction toute bête…
    En effet quand l’utilisateur appui sur un bouton, l’application envoi un mail (la mon ami « rechercher sur le forum » ma trouvé cela) seulement je veux que se mail soit une variable qui en fonction de la personne qui appui sur le bouton, envoi à son supérieur le mail. Vous m’avez suivit ? J’ai créé la requête qui permet de trouver le supérieur hiérarchique que j’ai nommé « Mailchef » et voici le code que j’ai trouvé pour le mail :

    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
    Private Sub btnchef_Click()
    On Error GoTo Err_btnchef_Click
     
        Dim MonOutlook As Object
        Dim MonMessage As Object
     
     
      Set MonOutlook = CreateObject("Outlook.Application")
      Set MonMessage = MonOutlook.createitem(0)
      MonMessage.To = ""
      MonMessage.Subject = ""
      MonMessage.body = ""
      MonMessage.Send
      Set MonOutlook = Nothing
     
    Exit_btnchef_Click:
        Exit Sub
     
    Err_btnchef_Click:
        MsgBox Err.Description
        Resume Exit_btnchef_Click
     
    End Sub

    Je cherche donc à mettre dans message.To une variable qui est remplie par ma requête. (La requête ne retourne qu’une et une seul personne).
    Je tiens à signaler que j’ai déjà cherché sur le forum mais il met encore difficile de tout comprendre, il me semble que se qu’il me manque tiens en à peine deux phase mais mes tentatives on toute échoués donc soit c’est plus compliqué soit sa viens de moi… c’est pourquoi je vous demande un coup de pouce (pas directement la réponse, sinon ce n’est pas amusant

    Bonne journée
    Judit

    Edit: Réponse au problème:

    Voici le code qui envoi un mail à la personne qui est sont chef de service
    (remarque: le corp et le titre du message sont aussi chercher dans la base de données permettant ainsi un envoi de mail automatique mais don le titre et le corp peuvent être changé
    )

    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    Option Compare Database
    Option Explicit
    Private Declare Function apiGetUserName Lib "advapi32.dll" Alias _
        "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long
     
    Function fOSUserName() As String
        ' Retourne le nom d'usager fourni lors du branchement au réseau.
        Dim lngLen As Long, lngX As Long
        Dim strUserName As String
         strUserName = String$(254, 0)
            lngLen = 255
            lngX = apiGetUserName(strUserName, lngLen)
         If lngX <> 0 Then
            fOSUserName = left$(strUserName, lngLen - 1)
         Else
                fOSUserName = ""
          End If
    End Function
     
    Private Sub btnchef_Click()
    On Error GoTo Err_btnchef_Click
     
     'déclaration
        Dim MonOutlook As Object
        Dim MonMessage As Object
        Dim strUserWindows As String
        Dim varNumChef As Variant
        Dim varEmailSuperieur As Variant
        Dim varSujet As Variant
        Dim varCorp As Variant
     
    'utilisateur courant
    strUserWindows = Environ("UserName")
     
    'définire qui est le chef de service pour l'utilisateur windows
    varNumChef = DLookup("Numchefservice", "Employe", "Id_windowsEmp='" & strUserWindows & "'")
    If IsNull(varNumChef) Then
       MsgBox "Pas d'employé trouvé pour l'identifiant Windows"
       Exit Sub
    End If
     
     'trouve l'adresse mail correspondant au chef de service
    varEmailSuperieur = DLookup("mailchef", "ChefService", "NumChef=" & varNumChef)
    If IsNull(varEmailSuperieur) Then
       MsgBox "Adresse email non trouvée"
       Exit Sub
    End If
     
    'definie se qui doit etre mis dans le mail (titre et corp)
    varSujet = DLookup("Libellétitre", "TitreMessage", "NumTitre=1")
    varCorp = DLookup("libellécorp", "corpmessage", "numcorp=1")
     
    'Message en cas de mail non trouvé
    If IsNull(varEmailSuperieur) Then
       MsgBox "Adresse email non trouvée"
       Exit Sub
    End If
     
    'envoi du mail
                Set MonOutlook = CreateObject("Outlook.Application")
                Set MonMessage = MonOutlook.createitem(0)
                    MonMessage.To = varEmailSuperieur
                    MonMessage.Subject = varSujet
                    MonMessage.body = varCorp
                    MonMessage.Send
                Set MonOutlook = Nothing
     
     
    Exit_btnchef_Click:
        Exit Sub
     
    Err_btnchef_Click:
        MsgBox Err.Description
        Resume Exit_btnchef_Click
     
    End Sub

  2. #2
    Expert confirmé
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Par défaut
    Bonsoir,

    Dans un premier temps, récupérer le nom de l'utilisateur (Windows).
    Comment obtenir le nom de l'utilisateur de Windows ?
    Comment connaître le nom de l'utilisateur courant ?

    Ensuite utiliser DLookup pour récupérer l'email du supérieur hiérarchique.
    C'est ce qu'il y a de plus simple pour récupérer le contenu d'un champ d'une table ou d'une requête,
    sans avoir recours à l'utilisation d'un recordset.

    Exemple avec une table T_Utilisateur (UserWindows, Superieur, EmailSuperieur)
    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
    Dim strUserWindows As String
    Dim varEmailSuperieur As Variant
     
    ' Mettre ici le code de récupération de l'utilisateur Windows
    ' Le résultat sera mis dans la variable strUserWindows 
     
    ' Recherche dans la table T_Utilisateur du contenu du champ EmailSuperieur
    ' pour l'utilisateur dont le nom est dans la variable strUserWindows 
    varEmailSuperieur = DLookup("EmailSuperieur", "T_Utilisateur", "UserWindows='" & strUserWindows & "'")
     
    If IsNull(varEmailSuperieur) Then
       ' La fonction DLookup renvoie Null en cas d'échec
       MsgBox "Adresse email non trouvée"
       Exit Sub   ' ou    Exit Function  si le code est dans une fonction
    End If
    A+

  3. #3
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 7
    Par défaut
    Je vous remercie pour ce début d’aide très utile !
    Mais bien sur j'ai eu un petit souci lors de sa mise en place... en effet j'ai droit au message d'erreur qui me signale que seul les commentaires peuvent apparaitre après un end sud... je pense que j'ai mal mis un code ou mal fermer une balise mais tout est bien en sub, pourriez vous m'indiquez d'où pourrez venir mon erreur ?

    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
    62
    63
    Private Sub btnchef_Click()
    On Error GoTo Err_btnchef_Click
     
     
                            btndesigne.Visible = True
                            btnclo.Visible = False
                            btnchef.Transparent = True
                            zone1.Visible = True
                            zone2.Visible = False
                            zone3.Visible = True
     
     
        Dim MonOutlook As Object
        Dim MonMessage As Object
        Dim strUserWindows As String
        Dim varEmailSuperieur As Variant
     
     
    Environ ("UserName")
     
    Private Declare Function apiGetUserName Lib "advapi32.dll" Alias _
        "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long
     
    Function fOSUserName() As String
        ' Retourne le nom d'usager fourni lors du branchement au réseau.
        Dim lngLen As Long, lngX As Long
        Dim strUserName As String
         strUserName = String$(254, 0)
            lngLen = 255
            lngX = apiGetUserName(strUserName, lngLen)
         If lngX <> 0 Then
            fOSUserName = left$(strUserName, lngLen - 1)
         Else
                fOSUserName = ""
          End If
    End Function
     
    ' pour l'utilisateur dont le nom est dans la variable strUserWindows
    varEmailSuperieur = DLookup("mailchef", "chefservice", "UserWindows='" & strUserWindows & "'")
     
     If IsNull(varEmailSuperieur) Then
       MsgBox "Adresse email non trouvée"
       Exit Sub
    End If
     
                Set MonOutlook = CreateObject("Outlook.Application")
                Set MonMessage = MonOutlook.createitem(0)
                MonMessage.To = varEmailSuperieur
                MonMessage.Subject = "  "
                MonMessage.body = "  "
                MonMessage.Send
                Set MonOutlook = Nothing
     
     
    Exit_btnchef_Click:
        Exit Sub
     
    Err_btnchef_Click:
        MsgBox Err.Description
        Resume Exit_btnchef_Click
     
     
    End Sub

  4. #4
    Expert confirmé
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Par défaut
    bonsoir,

    tout ce que est déclaration de fonction d'une dll doit être placé dans la section Déclarations.

    J'explique ici en quoi consiste cette fameuse section.

    Les déclarations de fonctions d'une dll ressemblent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Declare Function NomDeLaFonction Lib "NomFicher.dll" ...
    ' ou
    Public Declare Function NomDeLaFonction Lib "NomFicher.dll" ...
    ' ou
    Declare Function NomDeLaFonction Lib "NomFicher.dll" ...
    D'autre part on ne peut pas déclarer une procédure (Sub) ou une fonction (Function) à l'intérieur d'une autre procédure ou d'une autre fonction.

    Voici à quoi devrait ressembler le corps de ton code :
    Code vba : 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
    Option Compare Database
    Option Explicit
     
    Private Declare Function apiGetUserName Lib "advapi32.dll" Alias _
        "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long
    ' ----- fin de la section Déclarations, car après ce commentaire,
    ' ----- il y a la première procédure (Sub) ou fonction (Function) 
    ' ----- du module de code. Ici c'est une fonction.
    Function fOSUserName() As String
        ' Retourne le nom d'usager fourni lors du branchement au réseau.
        Dim lngLen As Long, lngX As Long
        Dim strUserName As String
         strUserName = String$(254, 0)
            lngLen = 255
            lngX = apiGetUserName(strUserName, lngLen)
         If lngX <> 0 Then
            fOSUserName = left$(strUserName, lngLen - 1)
         Else
                fOSUserName = ""
          End If
    End Function
     
    Private Sub btnchef_Click()
     ....
     
    ' Au choix (ou selon ce qui fonctionne) :
    strUserWindows = Environ("UserName")
    ' ou
    strUserWindows = fOSUserName()
     
    ...
     
    End Sub
    Remarque : J'ai mis fOSUserName() avant btnchef_Click(), mais ça n'a aucune importance.
    On peut très bien faire l'inverse.

    A+

  5. #5
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 7
    Par défaut
    Je vous remercie infiniment ! Votre aide m'a était précieuse j'ai quasiment terminé et le code ressemble à cela:

    Option Compare Database
    Option Explicit

    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 Declare Function apiGetUserName Lib "advapi32.dll" Alias _
        "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long
     
    Function fOSUserName() As String
        ' Retourne le nom d'usager fourni lors du branchement au réseau.
        Dim lngLen As Long, lngX As Long
        Dim strUserName As String
         strUserName = String$(254, 0)
            lngLen = 255
            lngX = apiGetUserName(strUserName, lngLen)
         If lngX <> 0 Then
            fOSUserName = left$(strUserName, lngLen - 1)
         Else
                fOSUserName = ""
          End If
    End Function
     
    Private Sub btnchef_Click()
    On Error GoTo Err_btnchef_Click
     
     
        Dim MonOutlook As Object
        Dim MonMessage As Object
        Dim strUserWindows As String
        Dim varEmailSuperieur As Variant
     
    strUserWindows = Environ("UserName")
    varEmailSuperieur = DLookup("mailchef", "ChefService", "ID_windows='" & strUserWindows & "'")
     
    If IsNull(varEmailSuperieur) Then
       MsgBox "Adresse email non trouvée"
       Exit Sub
    End If
     
                Set MonOutlook = CreateObject("Outlook.Application")
                Set MonMessage = MonOutlook.createitem(0)
                    MonMessage.To = varEmailSuperieur
                    MonMessage.Subject = "tt"
                    MonMessage.body = "teste 1,2,1,2"
                    MonMessage.Send
                Set MonOutlook = Nothing
     
     
     
    btndesigne.Visible = True
    btnclo.Visible = False
    btnchef.Transparent = True
    zone1.Visible = True
    zone2.Visible = False
    zone3.Visible = True
     
     
    Exit_btnchef_Click:
        Exit Sub
     
    Err_btnchef_Click:
        MsgBox Err.Description
        Resume Exit_btnchef_Click
     
     
    End Sub
    Mon seul souci c'est que, actuellement c'est l'adresse mail de la personne identifiée par le système d'ID qui reçoit le mail et non son chef, sachant que j'ai deux tables:

    Employe(Numempnomemp, prenomemp, adressemail, #Numservice, #Numchefservice, Id_windowsEmp)
    ChefService(NumChef, Nomchef, mailChef, ID_WindowsChef)


    comment à partir de se cette partie:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    varEmailSuperieur = DLookup("mailchef", "ChefService", "ID_windows='" & strUserWindows & "'")
    Puis-je faire appelle aux deux tables ? Et ainsi récupérer l'adresse de son chef ? A moins qu'il faille modifier ma BD...
    En tout cas merci déjà pour votre aide! je vais en attendant chercher sur les FAQ on c'est jamais


    bonne journée

  6. #6
    Expert confirmé
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Par défaut
    Bonsoir,

    Je vois deux possibilités.

    1. Faire deux DLookup (sur Employe pour récupérer Numchefservice puis sur ChefService pour récupérer mailChef)
      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
          Dim strUserWindows As String
          Dim varNumChef As Variant
          Dim varEmailSuperieur As Variant
       
      strUserWindows = Environ("UserName")
       
      varNumChef = DLookup("Numchefservice", "Employe", "Id_windowsEmp='" & strUserWindows & "'")
      If IsNull(varNumChef) Then
         MsgBox "Pas d'employé trouvé pour l'identifiant Windows '" strUserWindows & "'"
         Exit Sub
      End If
       
      varEmailSuperieur = DLookup("mailchef", "ChefService", "NumChef='" & varNumChef & "'")
      If IsNull(varEmailSuperieur) Then
         MsgBox "Adresse email non trouvée"
         Exit Sub
      End If
      Remarque : si NumChef est un champ de type numérique entier, DLookup s'écrit sans guillemets simples (')
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      varEmailSuperieur = DLookup("mailchef", "ChefService", "NumChef=" & varNumChef)
    2. Faire un DLookup sur une requête de sélection
      Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      SELECT Nomchef, mailChef, Id_windowsEmp
      FROM Employe INNER JOIN ChefService ON Employe.Numchefservice = ChefService.NumChef
      Si la requête est sauvegardée sous le nom qryEmployeMailChef
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      varEmailSuperieur = DLookup("mailchef", "qryEmployeMailChef", "Id_windowsEmp='" & strUserWindows & "'")
    A+

Discussions similaires

  1. [AC-2007] code vba pour bouton en relation avec case oui/non
    Par ivonick dans le forum VBA Access
    Réponses: 4
    Dernier message: 25/05/2011, 13h44
  2. Réponses: 2
    Dernier message: 07/08/2007, 09h51
  3. Problème de variable vide avec requete Insert
    Par jbidou88 dans le forum VBA Access
    Réponses: 2
    Dernier message: 05/06/2007, 11h10
  4. [MySQL] Requete en relation avec l'heure et la date
    Par darkprophet dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/05/2006, 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