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