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 et VBA Excel Discussion :

Verifier qu'une table existe ou non (ADODB) - Excel/Access [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Inscrit en
    Juillet 2010
    Messages
    230
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 230
    Points : 129
    Points
    129
    Par défaut Verifier qu'une table existe ou non (ADODB) - Excel/Access
    bonjour !

    Je me trouve confronté à un petit problème et malgré mes recherches sur le net, je ne trouve pas de réponse adéquate à ma situation.

    J'utilise ADO Xretrieve décrit dans le tuto de caféine pour remplir mes tableaux: Communication entre Excel et Access (en fin de page).

    Cela fonctionne plutôt bien. Le seul problème c'est que certaines requêtes sur lesquelles je me base pour remplir mes tableaux sont assez longue à traiter. En effet la fonction xretrieve est présente dans chaque cellule du tableau à remplir. Si j'ai 50 cellules contenant cette fonction dans mon tableau, la requête s'executera 50 fois... J'ai donc décidé de créer une table pour chaque requête. Cette table reçoit les données de la requête en fonction du filtre (date). La fonction Xretrieve ne se base plus alors sur la requete' mais sur la table ce qui accélère considérablement le traitement.

    Mon principe actuel est celui la :

    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
    Sub CreateTble(ByVal NomTble As String, NomReq As String)
     
    Dim MoisDeb, MoisFin, AnneeDeb, AnneeFin As Integer
     
        MoisDeb = Sheets("Feuil2").[B27]
        MoisFin = Sheets("Feuil2").[B28]
        AnneeDeb = Sheets("Feuil2").[B29]
        AnneeFin = Sheets("Feuil2").[B30]
     
    On Error GoTo Errh1:
     
        'Suppression de la table
        cnx.Execute "DROP TABLE " & NomTble
     
        'Création de la table 
        cnx.Execute "CREATE TABLE " & NomTble & " ([Nom de la caisse] Char(50), [NomdesDroits] char(50)," _
        & "[NomdesStatuts] char(50), [IDmois] Integer, [Année] Integer, [IDcontroledossier] Integer)"
     
        'Import de la requete
        cnx.Execute "INSERT INTO " & NomTble & " SELECT * FROM " & NomReq & " WHERE" _
        & "([IDmois] Between " & MoisDeb & " And " & MoisFin & " )" _
        & "And ([Année] Between " & AnneeDeb & " And " & AnneeFin & ");"
     
    Errh1:
          'Ne tient pas compte du mess d'erreur si la table n'existe pas
          Resume Next
    Fonction Xretrieve :

    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
    Public Function xretrieve(Optional ByVal NomCaisse As String = vbNullString, _
                              Optional ByVal NomBranche As String = vbNullString, _
                              Optional ByVal NomDroit As String = vbNullString, _
                              Optional ByVal NomTable As String = vbNullString)
     
    Dim strSQL As String
     
        strSQL = "SELECT Count(*) FROM " & NomTable & "  where " _
        & "[Nom de la caisse] = '" & Replace(NomCaisse, "'", "''") & "'" _
        & " And ([NomdesStatuts] = '" & NomBranche & "')" _
        & " And ([NomdesDroits] = '" & NomDroit & "')"
     
     
    Dim rst As New ADODB.Recordset
     
        rst.Open strSQL, cnx
        xretrieve = rst.Fields(0)
        rst.Close
        Set rst = Nothing
        Exit Function
     
    End Function
    Je souhaiterai traiter la création de table différemment. Je pense que supprimer la table à chaque fois pour la recréer ralenti un peu l'execution de la macro. Il serait préférable de pouvoir mettre une condition si la table existe déja.

    En gros si la table existe je supprime son contenu et je le remplace par le nouveau issu de la requete insert. Si la table n'existe pas alors je la créer.

    Le plus simple serait

    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
    If la table existe pas then
     
        'Création de la table
        cnx.Execute "CREATE TABLE " & NomTble & " ([Nom de la caisse] Char(50), [NomdesDroits] char(50)," _
        & "[NomdesStatuts] char(50), [IDmois] Integer, [Année] Integer, [IDcontroledossier] Integer)"
     
    else
     
        'Suppression du contenu de la table
        cnx.execute "DELETE FROM " & NomTble 
     
    end if
     
        'Import de la requete
        cnx.Execute "INSERT INTO " & NomTble & " SELECT * FROM " & NomReq & " WHERE" _
        & "([IDmois] Between " & MoisDeb & " And " & MoisFin & " )" _
        & "And ([Année] Between " & AnneeDeb & " And " & AnneeFin & ");"
    Donc ma question est : Quel est le moyen via ADODB de savoir si une table existe ou non dans Access. ?

    Merci pour votre future aide

    Cordialement

    Guillaume

  2. #2
    Expert éminent sénior
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Points : 11 272
    Points
    11 272
    Par défaut
    Salut,j'ai cela qui trainait sur mon PC, à tester sans doute plus à fond
    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
    Private Function ExistenceTabls(sCheminBase As String, sTable As String) As Boolean
    Dim Cnn As ADODB.Connection
    Dim Rst As ADODB.Recordset
    Dim Fld As ADODB.Field
     
        ExistenceTabls = False
     
        Set Cnn = New ADODB.Connection
     
        With Cnn
            .Provider = "Microsoft.Jet.OLEDB.4.0"
            .Open sCheminBase
        End With
     
        Set Rst = Cnn.OpenSchema(adSchemaTables)
     
        Do Until Rst.EOF
            If LCase(Rst!Table_Name) = LCase(sTable) Then
                ExistenceTabls = True
                Exit Do
            End If
            Rst.MoveNext
        Loop
     
        Rst.Close
        Set Rst = Nothing
        Cnn.Close
        Set Cnn = Nothing
    End Function
    PS : en fouillant à posteriori j'ai trouvé plus simple dans la FAQ Access , voir http://access.developpez.com/faq/?pa...#TastExistTabl

  3. #3
    Membre habitué
    Inscrit en
    Juillet 2010
    Messages
    230
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 230
    Points : 129
    Points
    129
    Par défaut
    Hello kiki29,

    Tout d'abord merci pour ta réponse !

    Tu es tombé dans le mille, c'est exactement ce qu'il me falait. Je commencais à trouver un semblant de réponse sur ce site ICI. Mais j'avais du mal a comprendre le fonctionnement...

    J'avais réussi à trouver une alternative en passant par ADOX :

    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 Catalog As New ADOX.Catalog
      Set Catalog.ActiveConnection = cnx
     
    'List tables And columns
    Dim Table As ADOX.Table
     
        For Each Table In Catalog.Tables
     
          If Table.Name = NomTble Then
             'Suppression du contenu de la table
             cnx.Execute "DELETE FROM " & NomTble
             GoTo r: ' amène directement a la requete insert sans passé par la requete creation table
          End If
     
     Next
    Ton code est beaucoup mieux je trouve. cela me donne au final :

    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
    Sub CreateTble(ByVal NomTble As String, NomReq As String)
     
    Dim MoisDeb, MoisFin, AnneeDeb, AnneeFin As Integer
     
        MoisDeb = Sheets("Feuil2").[B27]
        MoisFin = Sheets("Feuil2").[B28]
        AnneeDeb = Sheets("Feuil2").[B29]
        AnneeFin = Sheets("Feuil2").[B30]
     
     
    Dim ExistenceTable As Boolean
    Dim Rst As ADODB.Recordset
     
     
     Set Rst = cnx.OpenSchema(adSchemaTables)
     
        Do Until Rst.EOF
            If LCase(Rst!Table_Name) = LCase(NomTble) Then
                ExistenceTable = True
                Exit Do
            End If
            Rst.MoveNext
        Loop
     
        Rst.Close
        Set Rst = Nothing
     
     
     If ExistenceTable = True Then
          cnx.Execute "DELETE FROM " & NomTble
         Else
          'Création de la table
          cnx.Execute "CREATE TABLE " & NomTble & " ([Nom de la caisse] Char(50), [NomdesDroits] char(50)," _
          & "[NomdesStatuts] char(50), [IDmois] Integer, [Année] Integer, [IDcontroledossier] Integer)"
        End If
     
        'Import de la requete
        cnx.Execute "INSERT INTO " & NomTble & " SELECT * FROM " & NomReq & " WHERE " _
        & "([IDmois] Between " & MoisDeb & " And " & MoisFin & " )" _
        & " And ([Année] Between " & AnneeDeb & " And " & AnneeFin & ");"
     
    End Sub
    Tout fonctionne parfaitement !!! Merci

    Les bretons s'entraide tjr ...(29?)

    [EDIT]

    Je n'avais pas vu dans ton message le lien vers le FAQ. Je l'avais déjà testé sans que cela fonctionne et j'ai compris pourquoi...
    cnx représente ma connexion active. Dans la function du FAQ je mettais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set MCat.ActiveConnection = cnx.Connection
    au lieu de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set MCat.ActiveConnection = cnx

    Ca fonctionne et cela évite la boucle qui check l'ensemble des tables de la BDD donc plus rapide.

    merci


    A bientôt

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

Discussions similaires

  1. [Débutant] Vérifier si une table existe et si non la créer
    Par def_msy dans le forum C#
    Réponses: 0
    Dernier message: 04/08/2011, 18h07
  2. Comment verifier si une table existe deja
    Par amine_en_france dans le forum Langage SQL
    Réponses: 1
    Dernier message: 08/03/2007, 17h21
  3. tester si une table existe ou non sous access
    Par Lady_jade dans le forum Access
    Réponses: 4
    Dernier message: 17/02/2006, 19h44
  4. [Delphi7 interbase] Rechercher si une table existe
    Par Ricardeau dans le forum Bases de données
    Réponses: 6
    Dernier message: 15/03/2004, 10h07
  5. [VB6] Tester via vb si une table existe
    Par ronald dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 17/04/2003, 15h59

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