[ACCESS-VBA] Modifier la base de données ouverte.

guillaumec38 Messages postés 3 Date d'inscription dimanche 3 mai 2009 Statut Membre Dernière intervention 15 décembre 2009 - 14 déc. 2009 à 16:09
guillaumec38 Messages postés 3 Date d'inscription dimanche 3 mai 2009 Statut Membre Dernière intervention 15 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

3 réponses

c148270 Messages postés 303 Date d'inscription mercredi 12 janvier 2005 Statut Membre Dernière intervention 3 octobre 2013 1
14 déc. 2009 à 19:25
Bonjour
Je ne comprend pas bien

copyfile copie snombase2 vers snombase
compact database va compacter snombase2 en snombase
les deux Kill qui se suivent tuent les deux bases

A mon avis il ne reste aucune base à renommer

Bonne journée
0
guillaumec38 Messages postés 3 Date d'inscription dimanche 3 mai 2009 Statut Membre Dernière intervention 15 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.

Merci et bonne journée !
0
guillaumec38 Messages postés 3 Date d'inscription dimanche 3 mai 2009 Statut Membre Dernière intervention 15 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.

Bonne journée à tous !
0
Rejoignez-nous