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 :

Comparer une liste de valeurs ds 1 colonne d'1 table avc un champ d'1 requête en VBA


Sujet :

VBA Access

  1. #1
    Membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Octobre 2014
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Antilles Néerlandaises

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Octobre 2014
    Messages : 73
    Points : 62
    Points
    62
    Par défaut Comparer une liste de valeurs ds 1 colonne d'1 table avc un champ d'1 requête en VBA
    Bonjour,

    Mettons que j'ai une table qui s'appelle toto avec une colonne Var
    Je voudrais faire une fonction qui compare 1 par 1 les valeurs textuels de ma colonne Var pour savoir si elles sont contenues dans un champ Var2 dans ma requêtes Titi. Mon champ var2 est de type texte et pourra donner un truc générique comme ça : "*Var*"

    Si oui, dans ce cas renvoyer la valeur de ma colonne Var dans ma fonction (ça je pense que je peux me débrouiller)

    Est ce possible de le faire en VBA et quel est la méthode qui sera la plus rapide lorsqu'on lancera le traitement dans Access car j'ai environ 1000 lignes dans ma table toto donc ça risque de mouliner sévère j'imagine si on compare les 1000 lignes à chaque ligne de ma requête Titi ? j'ai chercher sur internet mais je ne trouve rien et j'ai peur de partir sur une méthode peu adapté à ce type de traitement.

    Ben

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

    Plusieurs solutions, et 1000 lignes c'est rien.

    La plus simple en une ligne, la fonction de domaine DLookup (une tuto sur le sujet et de nombreuses discussions sur le forum).
    Une simple requête select avec un recordset.

    Le DLookup est le plus simple à faire.

    Philippe

  3. #3
    Membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Octobre 2014
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Antilles Néerlandaises

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Octobre 2014
    Messages : 73
    Points : 62
    Points
    62
    Par défaut
    Merci pour la réponse rapide et efficace

    j'ai regarder brièvement la fonction DLookUp et je dois avoir un problème de syntaxe.

    Si ma table s'appelle Toto et qu'elle contient juste 1 champ qui liste toutes mes marques : [CODE MARQUE] ;
    Elle n'est pas attachée à mon autre table mais elle se trouve dans ma base access actuelle

    J'ai ma seconde table Titi qui contient mes articles avec leur désignation et leur code article et un troisième champ dans lequel va se trouver ma fonction vba: [Code article] , [Désignation], [InterroMarques]

    Ma fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Public Function InterroMarques(strDesign As Variant) As String
     
    InterroMarques = DLookup("[CODE MARQUE]", "toto", _
    "'*' & [CODE MARQUE] & '*' = strDesign")
     
    End Function
    Évidemment la syntaxe n'est pas bonne.
    j'ai fais plusieurs tentatives en enlevant ou en remettant les guillemets mais je n'arrive pas à trouver comment faire. et comme Vba me balance une série de message d'erreurs c'est assez désagréable à débugger.

    j'appelle ma fonction dans ma requête comme je fais d'habitude: InterroMarques("[titi].[Désignation]")

    Mais je dois pas m'y prendre de la bonne manière...
    Si quelqu'un pouvait m'aider à corriger la syntaxe ce serait sympa merci.

    Ben

  4. #4
    Membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Octobre 2014
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Antilles Néerlandaises

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Octobre 2014
    Messages : 73
    Points : 62
    Points
    62
    Par défaut
    j'ai changé mon code car j'ai trouvé plus ou moins la syntaxe mais j'ai toujours le problème du caractère générique qui n'est pas pris en compte.

    Ce code marche si ma désignation est égale à mon code marque:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    InterroMarques = Nz(DLookup("[CODE MARQUE]", "Union Marques", " '" & StrDesign & "' = [CODE MARQUE] "), 0)
    Du coup j'ai essayé çà sans trop de résultats j'ai pas de message d'erreur mais la fonction ne reconnait pas le texte et me met 0 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    InterroMarques = Nz(DLookup("[CODE MARQUE]", "Union Marques", " '" & StrDesign & "' = [CODE MARQUE] & '*' "), 0)
    Si quelqu'un a une idée pour l'intégration des caractères génériques je suis preneur car là je bloque.

  5. #5
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 841
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 841
    Points : 7 975
    Points
    7 975
    Par défaut
    Bonjour,

    Et comma cela ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    InterroMarques = Nz(DLookup("[CODE MARQUE]", "Union Marques", " [CODE MARQUE] LIKE '*" & StrDesign & "*'"), 0)
    Cordialement,

    EDIT : Suite à l'observation suivante de Philippe , je corrige le code que j'ai proposé

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

    Lorsque l'on utilise un caractère générique on utilises LIKE et non =.

    De plus, tu recherches la valeur de CODE MARQUE dans une table en mettant CODE MARQUE en critère

    Le but est de récupérer une valeur en fonction du critère d'une autre, non ?

    Philippe

  7. #7
    Membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Octobre 2014
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Antilles Néerlandaises

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Octobre 2014
    Messages : 73
    Points : 62
    Points
    62
    Par défaut
    Oui je m'en étais rendu compte après avoir posté. j'ai testé avec un Like sans succès.

    je compare ma variable Code marque contenant juste le nom d'une marque et je regarde si dans mon champ désignation elle est contenu:

    ex: Chercher le premier code marque de ma table toto (ex: "SAMSUNG") contenu dans la désignation de ma table titi : "TV LED 55 SAMSUNG UE55F9000"

    Du coup en gros les caractères génériques doivent être mis dans ma variable Code marque et pas dans ma désignation. Mais je ne sais pas comment faire.

    J'ai retesté ce matin le code que j'ai fourni en mettant LIKE car du coup j'avais un doute mais ça me met toujours des 0. Il considère mon caractère étoile comme un caractère étoile et pas comme un caractère générique.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    InterroMarques = Nz(DLookup("[CODE MARQUE]", "Union Marques", " '" & StrDesign & "' Like [CODE MARQUE] & '*' "), 0)
    Dans strDesign pour l'instant je met juste un texte au hasard pour faire des test et pour éviter trop de messages d'erreurs. c'est pour ça que j'ai encadré de guillemet StrDesign. Mais à terme StrDesign prendra la valeur du champ [titi].[Désignation] donc je suppose qu'il faudra enlever les guillemets.

  8. #8
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 841
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 841
    Points : 7 975
    Points
    7 975
    Par défaut
    Bonjour,

    Tu as vu mon code au #5 ?

  9. #9
    Membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Octobre 2014
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Antilles Néerlandaises

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Octobre 2014
    Messages : 73
    Points : 62
    Points
    62
    Par défaut
    Bonjour Madefemere,

    Oui je l'ai testé merci pour ton aide.

    Malheureusement c'est dans l'autre sens à mon avis que ça marcherait plutôt.
    Sachant que [Toto] n'est pas lié à [Titi] dans ma BDD et que je cherche à savoir si:

    [toto].[CODE MARQUE] (ex:"SAMSUNG") est contenue dans [titi].[Désignation] (ex:"TV LED 55 SAMSUNG UE55F9000").

    donc j'aurais quelque chose comme : StrDesign Like "*[CODE MARQUE]*".

    J'ai beau faire toute les combinaisons possibles avec ou sans guillemet ou inverser StrDesign et [CODE MARQUE] ça marche pas je désespère.
    Je vais finir par essayé le DAO Recordset si ça continue

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

    Tu écris :

    je compare ma variable Code marque contenant juste le nom d'une marque et je regarde si dans mon champ désignation elle est contenu:
    et

    [toto].[CODE MARQUE] (ex:"SAMSUNG") est contenue dans [titi].[Désignation] (ex:"TV LED 55 SAMSUNG UE55F9000").
    donc en théorie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    InterroMarques = Nz(DLookup("[CODE MARQUE]", "Union Marques", " [Désignation] LIKE '*" & StrDesign & "*'"), 0)
    Ta recherche est faire dans le champ Désignation de la table Union Marques et tu veux extraire ce qu'il y a dans le champ CODE MARQUE de cette même table, non ?


    Philippe

  11. #11
    Membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Octobre 2014
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Antilles Néerlandaises

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Octobre 2014
    Messages : 73
    Points : 62
    Points
    62
    Par défaut
    Je ne suis pas sur de comprendre. je dois vraiment pas être clair quand je m'explique désolé.


    Union Marques :
    CODE MARQUE (ex:"SAMSUNG")

    TBL2:
    Désignation (ex:"TV LED 55 SAMSUNG UE55F9000")
    MaFonctionVBA (InterroMarques("[TBL2].[Désignation]")

    Ma TBL1 "Union Marques" n'a pas de lien direct avec ma TBL2 c'est pour ça que j'ai besoin du DLookup ou une fonction dans le genre.

    MaFonctionVBA va prendre le champ [Désignation] de ma TBL2 (dans ma fonction, [Désignation] correspond donc à la variable StrDesign)

    Puis la fonction est censée regarder si StrDesign contient mon [CODE MARQUE] de ma TBL1.

    Donc je pense pas que le code ci dessous va marcher si ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Public Function InterroMarques(strDesign As Variant) As String
     
    InterroMarques = Nz(DLookup("[CODE MARQUE]", "Union Marques", " [Désignation] LIKE '*" & StrDesign & "*'"), 0)
     
    End Function
    Merci en tout cas pour l'aide apportée depuis le début car ça doit pas être facile tout les jours d’avoir des boulets comme moi lol

Discussions similaires

  1. [XL-2010] Récupérer une liste avec valeurs uniques depuis une colonne
    Par Onkas81 dans le forum Excel
    Réponses: 5
    Dernier message: 08/08/2013, 18h46
  2. Réponses: 3
    Dernier message: 15/07/2013, 15h43
  3. insérer une liste de valeurs dans une colonne
    Par ecdxml dans le forum SQL
    Réponses: 7
    Dernier message: 16/10/2009, 15h57
  4. comparer une liste de valeur
    Par jfcb92 dans le forum Excel
    Réponses: 4
    Dernier message: 14/11/2007, 08h36
  5. Réponses: 2
    Dernier message: 29/03/2006, 18h47

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