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

Macros Access Discussion :

exécution d'une macro si la valeur d'un champ du formulaire existe dans une table


Sujet :

Macros Access

  1. #1
    Membre averti
    Homme Profil pro
    amateur
    Inscrit en
    Janvier 2015
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Janvier 2015
    Messages : 46
    Par défaut exécution d'une macro si la valeur d'un champ du formulaire existe dans une table
    Bonjour,
    J'essaie en vain d'exécuter une macro dans un formulaire si la valeur d'un champ de mon formulaire (par exemple NomClient) existe dans une table (T_clients), champ [Nom]
    J'ai essayé In, Like, etc mais sans succès (exemple If [NomClient] In ([T_clients]![Nom]) )
    Auriez-vous une idée?
    Pour le moment ça ne fonctionne que si dans la condition de la macro je précise les x noms de clients de ma table (heureusement pour le moment il n'y en a qu'une dizaine). Le soucis est que quand j'ajoute un client dans cette table, il ne faut pas que j'oublie de l'ajouter dans ma macro, et je ne peux mettre que 6 ou 7 clients par condition. (exemple If [NomClient]="Laetitia" Ou [NomClient]="Nathalie" Ou [NomClient]="Michael" etc, à partir d'une certaine longueur de ligne je dois ouvrir une deuxième condition précédée de "ou")

    Merci pour vos conseils

  2. #2
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    3 057
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 057
    Par défaut
    Possibilité :
    D'abord, fais un petit Sub pour concaténer dans une chaine (str1) tous les noms de la table T_clients avec un séparateur ( ; par exemple).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    '  puis ta condition devient :  
    '        nom + ";" est-il trouvé dans la chaine ?
    if instr(str1 ,  [NomClient]  & ";") > 0 then
       ' exécuter la macro
    end if
    Avantage : les noms sont lus à chaque exécution dans la table T_clients
    "Always look at the bright side of life." Monty Python.

  3. #3
    Membre averti
    Homme Profil pro
    amateur
    Inscrit en
    Janvier 2015
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Janvier 2015
    Messages : 46
    Par défaut
    Citation Envoyé par micniv Voir le message
    Possibilité :
    D'abord, fais un petit Sub pour concaténer dans une chaine (str1) tous les noms de la table T_clients avec un séparateur ( ; par exemple).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    '  puis ta condition devient :  
    '        nom + ";" est-il trouvé dans la chaine ?
    if instr(str1 ,  [NomClient]  & ";") > 0 then
       ' exécuter la macro
    end if
    Avantage : les noms sont lus à chaque exécution dans la table T_clients
    Merci pour le tuyau, je vais tester ça demain. Mais comme je suis novice en VBA, que signifie instr ?
    J'avais essayé avec CpteDom >0, mais sans résultat.

  4. #4
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    3 057
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 057
    Par défaut
    inStr() est une fonction VBA. Vois sa signification via l'aide Access (touche F1)

    Puisque tu débutes en VBA, voici la solution complète en VBA, à adapter si besoin à ton cas.
    dans un module standard de l'application Access, colle le code suivant
    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
    Public Function LancerMacro(nomClient)
        ' la condition se traduit :   nom + ";" est-il trouvé dans la chaine ?
        ' Pour exécuter :
        '           lancerMacro("Marie")        'résultat: "on exécute la macro"
        '           lancerMacro("Mariejeanne")  'résultat: "on n'exécute pas la macro"
     
        If InStr(ConcatNoms, nomClient & ";") > 0 Then
            ' exécuter la macro
            MsgBox "on exécute la macro"
        Else
            MsgBox "on n'exécute pas la macro"
        End If
     
    End Function
     
    Private Function ConcatNoms() As String
        Dim strSql, str1 As String
        Dim rs1 As DAO.Recordset
     
        str1 = ""
        strSql = "SELECT DISTINCT Nom FROM T_client ORDER BY Nom"
        Set rs1 = CurrentDb.OpenRecordset(strSql)
        If rs1.RecordCount = 0 Then
            MsgBox "Aucune donnée trouvée", vbInformation, "Aucune donnée"
            ConcatNoms = str1
            Exit Function
        End If
        rs1.MoveLast
        rs1.MoveFirst
        While Not rs1.EOF
            str1 = str1 & rs1!nom & ";"
            rs1.MoveNext
        Wend
        'Debug.Print str1
        ConcatNoms = str1
    End Function
    "Always look at the bright side of life." Monty Python.

  5. #5
    Membre averti
    Homme Profil pro
    amateur
    Inscrit en
    Janvier 2015
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Janvier 2015
    Messages : 46
    Par défaut
    Citation Envoyé par micniv Voir le message
    inStr() est une fonction VBA. Vois sa signification via l'aide Access (touche F1)

    Puisque tu débutes en VBA, voici la solution complète en VBA, à adapter si besoin à ton cas.
    dans un module standard de l'application Access, colle le code suivant
    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
    Public Function LancerMacro(nomClient)
        ' la condition se traduit :   nom + ";" est-il trouvé dans la chaine ?
        ' Pour exécuter :
        '           lancerMacro("Marie")        'résultat: "on exécute la macro"
        '           lancerMacro("Mariejeanne")  'résultat: "on n'exécute pas la macro"
     
        If InStr(ConcatNoms, nomClient & ";") > 0 Then
            ' exécuter la macro
            MsgBox "on exécute la macro"
        Else
            MsgBox "on n'exécute pas la macro"
        End If
     
    End Function
     
    Private Function ConcatNoms() As String
        Dim strSql, str1 As String
        Dim rs1 As DAO.Recordset
     
        str1 = ""
        strSql = "SELECT DISTINCT Nom FROM T_client ORDER BY Nom"
        Set rs1 = CurrentDb.OpenRecordset(strSql)
        If rs1.RecordCount = 0 Then
            MsgBox "Aucune donnée trouvée", vbInformation, "Aucune donnée"
            ConcatNoms = str1
            Exit Function
        End If
        rs1.MoveLast
        rs1.MoveFirst
        While Not rs1.EOF
            str1 = str1 & rs1!nom & ";"
            rs1.MoveNext
        Wend
        'Debug.Print str1
        ConcatNoms = str1
    End Function
    Parfait, je vais devoir tester la syntaxe pour différencier les intitulés de la table, du champ du nom dans cette table, et du champ du nom dans le formulaire, et tester s'il faut des [] ou des ().
    Grand merci déjà en tout cas pour cette info.

Discussions similaires

  1. [Macro] Enregistrer la valeur d'un champ d'une requête
    Par OraneOr dans le forum Macros Access
    Réponses: 2
    Dernier message: 14/06/2021, 18h00
  2. Réponses: 3
    Dernier message: 21/05/2007, 16h31
  3. Réponses: 2
    Dernier message: 26/04/2007, 12h52
  4. valeur d'un champ de formulaire ajouté depuis une autre page
    Par manaboko dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 01/12/2005, 10h29
  5. valeur d'un champ pour l'utiliser dans une requete
    Par bachilbouzouk dans le forum ASP
    Réponses: 4
    Dernier message: 08/04/2005, 17h58

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