VBA Access existance d'une table

darkspoilt Messages postés 76 Date d'inscription   Statut Membre Dernière intervention   -  
darkspoilt Messages postés 76 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour je pense que la question va etre bete pour beaucoup mais je voulais savoir quel est la méthode a utiliser en VBA pour Access pour vérifier l'existance d'une table
Merci d'avance
Configuration: Windows XP
Internet Explorer 6.0

17 réponses

  1. sncf Messages postés 122 Statut Membre 14
     
    Bonjour
    La solution que j'ai trouvé est d'ouvrir un recordset de cette table
    Si elle n'existe pas, il y a une erreur qu'il est facile de traiter, sinon il suffit de fermer recordset

    Sub x()
    On Error GoTo err:
    Dim rst As DAO.Recordset
    Set rst = CurrentDb().OpenRecordset("T_Table")
    Set rst = Nothing
    Exit Sub
    err:
    Select Case err.Number
    Case 3078
    MsgBox "cette table n'existe pas"
    Set rst = Nothing
    End Select
    
    End Sub
    
    0
  2. darkspoilt Messages postés 76 Date d'inscription   Statut Membre Dernière intervention   1
     
    En fait j'avais une solution de ce type car lors de l'import d'une table excel celle ci de s'écrase pas kand elle s'ajoute donc j'avais cette solution.

    Jem e demande ou est l'erreur
    Option Explicit
    
    Private Sub Commande13_Click()
        On Error GoTo Err_Commande13_Click
       
        Dim m As String
        Dim a As String
        Dim nomTable As String
        Dim nomClasseur As String
        Dim SQL As String
        Dim d As String
        Dim cat As New ADOX.Catalog
           
        m = Me!mois
        a = Me!année
        d = a & m
        
        DoCmd.SetWarnings False
    
        nomClasseur = "D:\Test\Essai\" & a & m & ".xls"
        nomTable = "TableTest" & a & m
    
        If Not ExisteTable("nomTable") Then
        DoCmd.TransferSpreadsheet acImport, , nomTable, nomClasseur, -1
        End If
        'd = "2006_T3"
        'nomTable = "PJPF2006_T3"
        
        'Définir la requête
        SQL = "INSERT INTO Test ( OPPO, MPE, MPF, MRE, MRF, M__, [année]) " & _
        "SELECT OPPO, MPE, MPF, MRE, MRF, M__, """ & d & """ AS [année] " & _
        "FROM " & nomTable & _
        " WHERE CBQD='total' AND MOIS='total' AND CMOP='total';"
    
        'Exécuter la requête
        CurrentDb.Execute SQL
    
    Set cat = Nothing
    Exit_Commande13_Click:
        Exit Sub
    Err_Commande13_Click:
        MsgBox Err.Description
        Resume Exit_Commande13_Click
    End Sub
    
    Function ExisteTable(ByVal strTabl As String) As Boolean
        Dim str As String
        On Error GoTo err01
        str = CurrentDb.TableDefs(strTabl).name
        ExisteTable = True
        Exit Function
    err01:
        Select Case Err.Number
            Case 3265
                ExisteTable = False
        End Select
    End Function
     
    
    0
  3. sncf Messages postés 122 Statut Membre 14
     
    A mon avis le problème vient du fait que si la table existe déjà, tu ne fait pas d'importation
    0
  4. darkspoilt Messages postés 76 Date d'inscription   Statut Membre Dernière intervention   1
     
    Bah la logik oui mais quand je click sur le bouton de mon formulaire la premiere fois j'ai exactement ce que je veux
    et si je reclick une seconde fois j'ai des doublons donc c'est qu'il doit l'éxécuter.
    Le but c'est que je n'ai plus ses doublons et je pense que c'est du a l'importation car quand la table existe il ne l'écrase pas mais colle a la suite d'apres les teste que j'ai fais.
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. sncf Messages postés 122 Statut Membre 14
     
    C'est donc que le seconde fois il considère aussi que la table n'existe pas, vérifie (en mettant un point d'arret) que la table créée la premi_re fois prote bien le meme nom que celui désiré
    0
  7. blux Messages postés 5035 Date d'inscription   Statut Modérateur Dernière intervention   3 455
     
    Salut,

    le plus simple est de balancer une requête de vidage de la table avant import :
    Dim Req As QueryDef
    Set Req = CurrentDb.CreateQueryDef("", "delete * from [ma_table")
    Req.Execute dbFailOnError
    Comme ça, plus de doublons possibles...
    0
  8. darkspoilt Messages postés 76 Date d'inscription   Statut Membre Dernière intervention   1
     
    Dans ce cas autant je dois supprimer la table que je veux ajouter pour l'importer a chaque fois. Or c'est pas ce que je veux faire. Je me demandais il y aurait pas un buffer ou quelque chose comme ca a vidé??
    0
  9. blux Messages postés 5035 Date d'inscription   Statut Modérateur Dernière intervention   3 455
     
    Si tu as des données en double, c'est que ta clé primaire n'est pas choisie correctement (numeroauto ?)
    0
  10. darkspoilt Messages postés 76 Date d'inscription   Statut Membre Dernière intervention   1
     
    Dans la tableau excel que j'importe rien est en double si je refait ma fonction sans avoir effacé ma table j'ai tout en double une troisieme fois en truple etc... donc c pas mon tableau excel qui cloche c'est pour ca que je voulais vérifier l'existance de ma table afin de pas faire de nouveau import et de tout avoir en double triple etc...
    0
  11. blux Messages postés 5035 Date d'inscription   Statut Modérateur Dernière intervention   3 455
     
    Excuse-moi d'insister, mais si tu récupères tes données 2 ou 3 fois, c'est que ta clé primaire n'est pas correctement configurée...

    N'oublie pas que lorsque tu crées une table sans clé primaire, ACCESS en rajoute une qui est un numéro incrémenté automatiquement. Lors de l'insertion de données, ACCESS vérifie que la clé primaire n'existe pas déjà, et comme c'est un numéroauto, il n'y a aucune chance de le retrouver à la deuxième importation (ni même après).

    Donne-moi la définition de ta table, je parie gros que c'est ça...

    As-tu un critère discriminant dans ta feuille EXCEL ? Si oui, c'est lui qui doit être la clé primaire de ta table, tu n'auras aucun doublon ensuite (seulement des messages d'erreur de violation de clé lorsque tu voudras insérer quelque chose qui existe déjà)
    0
  12. darkspoilt Messages postés 76 Date d'inscription   Statut Membre Dernière intervention   1
     
    c'est bon j'ai résolu le probleme merci en tout cas
    0
    1. blux Messages postés 5035 Date d'inscription   Statut Modérateur Dernière intervention   3 455
       
      On peut savoir comment ? :-)
      0
    2. darkspoilt Messages postés 76 Date d'inscription   Statut Membre Dernière intervention   1
       
      Déja tout mon code est dans le deuxieme post déclaration etc...
      Mais je n'ai jamais entendu de la notion de clé primaire peux tu m'en dire plus ca m'interesse.

      Sinon en fait la chose etait tout simple normalament j'initialise ma table avant d'ajouter une autre
      bah dans mon code je n'effectuer pas ma requete initilisation c'est tout bete et jme suis pris le chou pour rien plus
      0
      1. blux Messages postés 5035 Date d'inscription   Statut Modérateur Dernière intervention   3 455 > darkspoilt Messages postés 76 Date d'inscription   Statut Membre Dernière intervention  
         
        Sinon en fait la chose etait tout simple normalament j'initialise ma table avant d'ajouter une autre
        bah dans mon code je n'effectuer pas ma requete initilisation c'est tout bete et jme suis pris le chou pour rien plus

        C'est ce que j'ai proposé en <6>...

        Mais je n'ai jamais entendu de la notion de clé primaire peux tu m'en dire plus ca m'interesse.

        Une clé primaire est OBLIGATOIRE dans une table de base de données relationnelle, c'est elle qui sert de discriminant aux enregistrements (ça peut être un nom, mais attention aux homonymes, un code, genre numéro de sécu...).

        Lorsqu'ACCESS cherche à insérer des données dans une table, il ne doit pas y avoir d'enregistrement qui existe avec la même clé primaire, sinon, il y a violation des règles...

        Tu peux donner la structure de la table test ?
        je suis sûr qu'il y a une clé primaire numéroauto, comme je l'ai déjà indiqué dans mes mesages précédents...
        0
      2. darkspoilt Messages postés 76 Date d'inscription   Statut Membre Dernière intervention   1 > darkspoilt Messages postés 76 Date d'inscription   Statut Membre Dernière intervention  
         
        Ma table est contient les champs année OPPO, MPE, MPF, MRE, MRF, M__
        voila
        0
      3. blux Messages postés 5035 Date d'inscription   Statut Modérateur Dernière intervention   3 455 > darkspoilt Messages postés 76 Date d'inscription   Statut Membre Dernière intervention  
         
        Et quelles sont les propriétés de ces champs ? Où est la clé primaire ?
        0
  13. darkspoilt Messages postés 76 Date d'inscription   Statut Membre Dernière intervention   1
     
    Je vois pas ou tu vois ca moi quand je créer ma table j'exécute cette requete la apres je vois pas ou est la clé primaire?
    SELECT t.année, t.OPPO, t.MPE, t.MPF, t.MRE, t.MRF, t.M__ INTO Test
    FROM t;
    


    et après je fais

    INSERT INTO Test ( OPPO, MPE, MPF, MRE, MRF, M__, [année]) SELECT OPPO, MPE, MPF, MRE, MRF, M__, """ & d & """ AS [année] FROM " & nomTable WHERE CBQD='total' AND MOIS='total' AND CMOP='total';"
    


    0
  14. blux Messages postés 5035 Date d'inscription   Statut Modérateur Dernière intervention   3 455
     
    Quand tu fais une requête SELECT INTO, il te crée une table dont les champs reprennent les propriétés de la table lue. Si tu as une clé primaire, il va la reprendre, si tu n'en as pas, il va t'en créer une.

    Va voir ta table en mode création (via la fenêtre principale d'ACCESS), tu as sans aucun doute une clé primaire...
    0
  15. darkspoilt Messages postés 76 Date d'inscription   Statut Membre Dernière intervention   1
     
    non je lis nulle part clé primaire
    0
  16. blux Messages postés 5035 Date d'inscription   Statut Modérateur Dernière intervention   3 455
     
    Ca n'est pas marqué, il doit juste y avoir un champ avec une petite clé à gauche de son nom (d'ailleurs comment s'appelle-t'il ?)
    0
  17. darkspoilt Messages postés 76 Date d'inscription   Statut Membre Dernière intervention   1
     
    ima table s'appelle test et ta pas de champs avec un clé et je vois de clé nulle part
    0
    1. blux Messages postés 5035 Date d'inscription   Statut Modérateur Dernière intervention   3 455
       
      Mea culpa
      Je viens de tester, et ça ne lui pose pas de problème de créer une table sans clé primaire (il doit utiliser un mécanisme interne pour retrouver ses enregistrements)...

      Donc tu peux ajouter ad vitam aeternam les même lignes dans ta table...
      0
    2. darkspoilt Messages postés 76 Date d'inscription   Statut Membre Dernière intervention   1
       
      Je fais une requête création et il existe en champs que je veux apeler montant dont les valeurs apartiennent a un autre champs d'un autre table
      je sais comment le faire pour une champs mais je veux en mettre plusieur en l'occurence MPE MPF si quelqu'un peu me donner la syntaxe je le remercie d'avance.
      montant: MPE

      et j'aimerais un truc du genre
      montant : MPE, MPF


      Ainsi que pour qui est en fait un champ pour indiquer le champs d'origine de la valeur montant
      type: "MPE"
      0
    3. blux Messages postés 5035 Date d'inscription   Statut Modérateur Dernière intervention   3 455
       
      La manip est à faire pour chaque champ...
      0
    4. darkspoilt Messages postés 76 Date d'inscription   Statut Membre Dernière intervention   1
       
      je peus pas tout faire d'un coup car la personne précédente l'a fait mais elle a effacé ca requete!!! du coup j'essaie de retrouvé ce ki reste
      0
    5. blux Messages postés 5035 Date d'inscription   Statut Modérateur Dernière intervention   3 455
       
      J'ai pas tout compris !

      Tu veux changer le nom des champs tels qu'ils apparaissent à l'affichage ? Il faut le faire pour tous les champs de la requête.
      0
  18. darkspoilt Messages postés 76 Date d'inscription   Statut Membre Dernière intervention   1
     
    oki merci c'est ce que j'ai fais
    0