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 :

déterminer en vba la table utilisée par une requete access


Sujet :

VBA Access

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 73
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 8
    Points : 9
    Points
    9
    Par défaut déterminer en vba la table utilisée par une requete access
    bonjour,

    Je suis novice-bricoleur en vba et vba access (access et excel 2000).

    Je voudrais appliquer une même requête à plusieurs tables qui ont les mêmes rubriques, en choisissant la table d'origine (et le nom de la table de sortie) avec une input box

    Je tourne en rond.
    Passer par le lancement d'une requete ne semble pas la bonne voie car il n'existe pas de table enregistrée au nom de ma variable.

    Solution entrevue : copier la table à traiter avec un nom enregistré dans la requête, puis détruire cette copie. Mais ça me semble lourd.

    Le forum pourrait-il m'indiquer une piste plus élégante et ... à ma portée?

    Cordialement

    ===================

    1-Je définis avec une inputbox le nom de la table que je vais traiter avec la requete. Ce nom est "myvalue1"
    Même chose pour le nom de la table que je souhaite créer :"myvalue2"
    Je lance une requete action "essai_vba2"

    2-Comment présenter le code pour pouvoir choisr le nom des tables utilisées dans la requête ?

    a-Voici la présentation sql de la requete d'origine
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT Listing_Détail_Asso.COMPTE, Listing_Détail_Asso.NOM, Listing_Détail_Asso.[DATE OUVERTURE], Listing_Détail_Asso.[ACTIVITE MOIS], Listing_Détail_Asso.[IDENTIFIANT TIERS], IIf([Listing_Détail_Asso]![ACTIVITE MOIS]="ACTIF 40 K EUR","1_actif 40 k","0_inactif") AS segment, +[Listing_Détail_Asso]![NB TOUTES CARTES]+[Listing_Détail_Asso]![CONVENTION] AS total INTO essai2
    FROM Listing_Détail_Asso;

    b-Dans la requête cible, j'ai remplacé le nom de la table d'origine "Listing_Détail_Asso" par "myvalue1".
    Cela ne fonctionne pas car lil n'existe pas de table myvalue1.

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT myvalue1.COMPTE, myvalue1.NOM, myvalue1.[DATE OUVERTURE], myvalue1.[ACTIVITE MOIS], myvalue1.[IDENTIFIANT TIERS], IIf(myvalue1![ACTIVITE MOIS]="ACTIF 40 K EUR","1_actif 40 k","0_inactif") AS segment, +myvalue1![NB TOUTES CARTES]+myvalue1!CONVENTION AS total INTO myvalue2
    FROM myvalue1;


    c-Voici le code de la fonctionVBA access
    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
     
    Option Compare Database
     
    '------------------------------------------------------------
    ' essai_vba2
    '
    '------------------------------------------------------------
    Function essai_vba2()
        Dim Message, Title, Default, MyValue1, myvalue2
     
        On Error GoTo essai_vba2_Err
    ' Définit le message.
    Message = "Entrez le nom du fichir d'entrée"
    Title = "Démonstration de InputBox"    ' Définit le titre.
    Default = "1"    ' Définition la valeur par défaut.
    ' Affiche le message, le titre et la valeur par défaut.
    MyValue1 = InputBox(Message, Title, Default)
     
    Message = "Entrez le nom du fichir de sortie"
    Title = "Démonstration de InputBox"    ' Définit le titre.
    Default = "1"    ' Définition la valeur par défaut.
    ' Affiche le message, le titre et la valeur par défaut.
    myvalue2 = InputBox(Message, Title, Default)
     
     
        DoCmd.OpenQuery "essai_vba2", acViewNormal, acEdit
     
     
    essai_vba2_Exit:
        Exit Function
     
    essai_vba2_Err:
        MsgBox Error$
        Resume essai_vba2_Exit
     
    End Function

  2. #2
    Membre confirmé Avatar de Tonioyo
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2008
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 343
    Points : 518
    Points
    518
    Par défaut
    Bonjour,

    En fait il y plusieurs solutions possibles,

    1. Si la table ciblée n'existe pas il est tout a fait possible de la créer en faisant attention à ne pas trop multiplier les tables car la base de dopnnées deviendrait trop ingérable.

    2. Ne pas donner de table cible et passer par une table temporaire dont le nom est fixe et arbitraire.

    3. Si le résultat de la requête affecte une table existante il est possible de lmister toutes les tables existante dans la base actuelle access via les tables systèmes (une petite recherche sur ce site t'en dira sûrement plus).

  3. #3
    Expert éminent
    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
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonsoir,

    Dans une requête, le nom d'une table ou d'un champ ne peut pas être variable.

    Une possibilité en manipulant le code SQL de la requête.
    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
    Function essai_vba2()
        Dim Message, Title, Default, MyValue1, myvalue2
        Dim strSQL As String
     
        On Error GoTo essai_vba2_Err
     
        ' Définit le message.
        Message = "Entrez le nom du fichir d'entrée"
        Title = "Démonstration de InputBox"    ' Définit le titre.
        Default = "1"    ' Définition la valeur par défaut.
        ' Affiche le message, le titre et la valeur par défaut.
        MyValue1 = InputBox(Message, Title, Default)
     
        Message = "Entrez le nom du fichir de sortie"
        Title = "Démonstration de InputBox"    ' Définit le titre.
        Default = "1"    ' Définition la valeur par défaut.
        ' Affiche le message, le titre et la valeur par défaut.
        myvalue2 = InputBox(Message, Title, Default)
     
        ' Met le code SQL de la requête dans la variable strSQL
        strSQL = "SELECT TBL1.COMPTE, TBL1.NOM, TBL1.[DATE OUVERTURE], TBL1.[ACTIVITE MOIS], TBL1.[IDENTIFIANT TIERS], " & _
                 "IIf(TBL1.[ACTIVITE MOIS]='ACTIF 40 K EUR','1_actif 40 k','0_inactif') AS segment, " & _
                 "TBL1.[NB TOUTES CARTES]+TBL1.[CONVENTION] AS total " & _
                 "INTO [_table_a_creer_] " & _
                 "FROM [_table_en_entree_] As TBL1;"
     
        ' Remplace "_table_en_entree_" par le contenu de MyValue1
        strSQL = Replace(strSQL, "_table_en_entree_", MyValue1)
        ' Remplace "_table_a_creer_" par le contenu de MyValue2
        strSQL = Replace(strSQL, "_table_a_creer_", myvalue2)
     
        ' modifie le code SQL de la requête essai_vba2
        CurrentDb.QueryDefs("essai_vba2").SQL = strSQL
     
        ' exécute la equête
        DoCmd.OpenQuery "essai_vba2", acViewNormal, acEdit
     
     
    essai_vba2_Exit:
        Exit Function
     
    essai_vba2_Err:
        MsgBox Error$
        Resume essai_vba2_Exit
     
    End Function
    Je mets le code SQL de la requête dans une variable de type String strSQL.
    J'utilise un alias (TBL1) pour la table depuis laquelle on va lire les enregistrements.
    De cette manière son nom n'apparaît qu'une fois, dans la close FROM.
    Dans le code SQL, j'ai remplacé les guillemets doubles par des guillemets simples, pour simplifier l'écriture en VBA.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IIf([Listing_Détail_Asso]![ACTIVITE MOIS]="ACTIF 40 K EUR","1_actif 40 k","0_inactif")
    est devenu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IIf([Listing_Détail_Asso]![ACTIVITE MOIS]='ACTIF 40 K EUR','1_actif 40 k','0_inactif')
    Ensuite avec la fonction Replace, je remplace le nom des tables source et destination,
    respectivement _table_en_entree_ et _table_a_creer_ par le contenu des variables MyValue1 et MyValue2.
    Puis, je remplace le code sql de la requête essai_vba2, par le code contenu dans la variable strSQL.

    Une autre façon de faire avec une requête modèle.
    Tu copies ta requête et tu la colles sous le nom "essai_vba2_modele".
    On peut récupérer le code SQL de essai_vba2_modele et remplacer le nom des tables.
    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
        ' Met le code SQL de la requête modèle dans la variable strSQL
        strSQL = CurrentDb.QueryDefs("essai_vba2_modele").SQL
     
        ' Remplace "Listing_Détail_Asso" par le contenu de MyValue1
        strSQL = Replace(strSQL, "[Listing_Détail_Asso]", "[" & MyValue1 & "]")
        strSQL = Replace(strSQL, "Listing_Détail_Asso", "[" & MyValue1 & "]")
     
        ' Remplace "essai2" par le contenu de MyValue2
        strSQL = Replace(strSQL, "essai2", "[" & myvalue2 & "]")
     
        ' modifie le code SQL de la requête essai_vba2
        CurrentDb.QueryDefs("essai_vba2").SQL = strSQL
     
        ' exécute la equête
        DoCmd.OpenQuery "essai_vba2", acViewNormal, acEdit
    Il faut s'assurer qu'aucun nom de champ n'est identique au nom d'une table des deux tables (Listing_Détail_Asso ou essai2) sinon Replace(...) le remplace aussi.

    A+

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 73
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 8
    Points : 9
    Points
    9
    Par défaut Merci pour les pistes
    Bonjour,

    tout fonctionne impeccablement dans les 2 versions.
    Une question , comment la requ^te de la première solution de peut-elle être enregistrée sans que la table à laquelle elle fait référence soit créee ?
    Mais je peux vivre sans ce détail qui m'intrigue.

    Merci encore, avec mes plus cordiales salutations
    ls8ls8

  5. #5
    Expert éminent
    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
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,
    Citation Envoyé par ls8ls8 Voir le message
    Une question, comment la requête de la première solution de peut-elle être enregistrée sans que la table à laquelle elle fait référence soit créée ?
    Elle ne l'est pas.
    J'ai pris le code SQL de ton premier message et je l'ai collé dans le Bloc-Note.
    De là je l'ai bricolé un peu, puis je l'ai de nouveau copié/collé pour le mettre dans un module de code.
    C'est là que je me suis aperçu du problème avec les " et que je les ai remplacés par des ' .

    La deuxième solution est plus souple car tu peux modifier la requête modèle sans avoir à retoucher le code VBA.

    A+

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 73
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 8
    Points : 9
    Points
    9
    Par défaut déterminer en vba la table utilisée par une requete access
    Merci encore LedZepII

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 02/02/2015, 16h59
  2. [Toutes versions] Comment libérer une table "déjà utilisée par une autre personne ou procédure"?
    Par BornToBe dans le forum VBA Access
    Réponses: 5
    Dernier message: 23/04/2012, 09h20
  3. Réponses: 3
    Dernier message: 18/11/2007, 12h26
  4. [REQUETE] Configuration de la table créée par une requete
    Par NiKoTiNe dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 08/05/2007, 08h37
  5. ou mettre une structure utilisée par une classe
    Par grand's dans le forum C++
    Réponses: 10
    Dernier message: 28/07/2005, 18h53

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