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 :
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
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
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.
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
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
Donc ma question est : Quel est le moyen via ADODB de savoir si une table existe ou non dans 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 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 & ");"
Merci pour votre future aide
Cordialement
Guillaume
Partager