guillaumec38
Messages postés3Date d'inscriptiondimanche 3 mai 2009StatutMembreDernière intervention15 décembre 2009
-
14 déc. 2009 à 16:09
guillaumec38
Messages postés3Date d'inscriptiondimanche 3 mai 2009StatutMembreDernière intervention15 décembre 2009
-
15 déc. 2009 à 14:18
Bonjour à tous.
Je suis actuellement en train de developper un outil Access pour faire du reporting. Je bloque actuellement sur un probléme qui peut vous sembler simple, je n'arrive pas a modifier ma base de données a partir de code VBA.
Mon but est de pouvoir mettre a jour une base de données Access d'un simple clic (sur un bouton qui execute mon code VBA). L'import des tables se passe parfaitement bien (Si la table existe, elle est écrasée).
Toutefois il y a un "leger" soucis avec access. Quand on supprime des données, il ne libere pas la place occupée par celles ci. C'est pourquoi il faut sans cesse "compacter" la base de données.
Ainsi, apres mon import de données (depuis des feuilles Excel), je dois compacter la base de données afin que la taille de celle ci reste raisonnable. C'est la que les ennuis commencent :)
Si j'essaie de compacter directement la base active, un message d'erreur survient ==> "La base de données est deja ouverte, veuillez reessayer plus tard" (en gros).
J'ai donc trouvé une autre méthode sur le net qui consiste en :
1) On fait une copie de la BDD active qu'on nomme "Temp".
2) On compacte Temp
3) on supprime la BDD active
4) On renomme Temp avec le nom de notre base au début.
En suivant cette methode je bloque a l'etape 3, je n'ai pas le droit de toucher la base ouverte. Soit, j'ai donc essayer de fermer la base, mais vu que mon code VBA est lié a cette base il est aussi fermé et ne va pas au bout ...
Voila, si quelqu'un avait une idée pour me sortir de là je suis preneur
Merci.
Je vous poste mon code au cas où :
Public Sub MajBdd()
' Déclaration des variables
Dim rcs As DAO.Recordset
Dim CheminTable As String
Dim NomTable As String
CheminTable = ""
NomTable = ""
' On remplit le Recordset avec le contenu de la table Index
Set rcs = CurrentDb.OpenRecordset("select * from Index")
' On parcours les resultats
Do Until rcs.EOF
CheminTable = rcs("CheminTable")
NomTable = rcs("NomTable")
Call DoCmd.Echo(True, "Import de la table " & NomTable & " ...")
Call ImportTableFromExcel(CheminTable, NomTable) 'Procedure perso qui importe une table depuis une feuille excel.
rcs.MoveNext
Loop
rcs.Close
sNomBase = "Z:\Guillaume\Access2007\Copie de Données.accdb"
sNomBase2 = "Z:\Guillaume\Access2007\Données.accdb"
sNomBaseTmp = "Z:\Guillaume\Access2007\temp.accdb"
Set fso = CreateObject("Scripting.FileSystemObject")
Call fso.CopyFile(sNomBase2, sNomBase)
'1. Compactage dans une nouvelle base
DBEngine.CompactDatabase sNomBase2, sNomBase
'2. Suppression de la base originale
Kill sNomBase
Kill sNomBase2
'3. Renommer la base compactée avec le nom de la base originale
Name sNomBaseTmp As sNomBase2
End Sub
guillaumec38
Messages postés3Date d'inscriptiondimanche 3 mai 2009StatutMembreDernière intervention15 décembre 2009 15 déc. 2009 à 09:40
Oups, petite erreur de recopiage ^^
Compact database compacte sNomBase vers sNomBaseTmp.
C'est donc le kill sNomBase qui plantait puisque la base etait ouverte.
Je pense regler le probleme en realisant le compact depuis une autre BDD, ou peut etre peut on faire des fichiers executable avec du code VBA, ou enfin peut etre en ligne de commande.
guillaumec38
Messages postés3Date d'inscriptiondimanche 3 mai 2009StatutMembreDernière intervention15 décembre 2009 15 déc. 2009 à 14:18
Re Bonjour,
Probléme résolu !
Je lance le compactage depuis une autre base (le même code) et ça marche :)
Pour plus de confort j'attend de pouvoir créer un .exe de mon programme vb.