> Pour moi, ce n'est pas possible de compacter une base qui CONTIENT le
code destiné à compacter la base donc le code de jessy ferme la base
qu'il va compacter et donc vu que la base est fermée; pour que le code
puisse continuer à tourner il est forcément ailleurs.
> Pour moi, ce n'est pas possible de compacter une base qui CONTIENT le
code destiné à compacter la base donc le code de jessy ferme la base
qu'il va compacter et donc vu que la base est fermée; pour que le code
puisse continuer à tourner il est forcément ailleurs.
> Pour moi, ce n'est pas possible de compacter une base qui CONTIENT le
code destiné à compacter la base donc le code de jessy ferme la base
qu'il va compacter et donc vu que la base est fermée; pour que le code
puisse continuer à tourner il est forcément ailleurs.
Pour moi, ce n'est pas possible de compacter une base qui CONTIENT le
code destiné à compacter la base donc le code de jessy ferme la base
qu'il va compacter et donc vu que la base est fermée; pour que le code
puisse continuer à tourner il est forcément ailleurs.
Re,
Tu as tout à fait raison et, si j'interprète correctement le code de
Jessie, il tient bien compte de cette nécessité.
Revoici le code:
Function CompactEXE() As Boolean
Dim strDbFile As String
strDbFile = CurrentDb.Name & ".tmp"
' Sachant que ma base se nomme E:Mes DocumentsAncreAncre_xx.mdb,
alors: strDbFile = E:Ancre_xx.mdb.tmp, et je retrouve bien ce fichier
dans le répertoire de ma base initiale.
If Dir(strDbFile) <> "" Then Kill strDbFile
' On supprime un fichier .tmp pré-existant. OK?
DBEngine.CreateDatabase strDbFile, dbLangGeneral
' On recrée un fichier .tmp et on y met mcrCompact et modCompactCurrentDb
DoCmd.CopyObject strDbFile, , acMacro, "mcrCompact"
DoCmd.CopyObject strDbFile, , acModule, "modCompactCurrentDb"
Shell "MSACCESS.EXE """ & strDbFile & """ /x mcrCompact", _
vbMinimizedNoFocus
' Je ne sais pas trop ce que fait cette instruction Shell etc... mais
elle est en rapport avec la macro mcrCompact, qui lance la fonction
Compact() ci-dessous.
Si je ne me fous pas dedans, à ce stade ma base initiale est toujours
ouverte et la macro est exécutée depuis elle, ce qui, d'après toi, est
la cause du problème rencontré. OK ???
End Function
Jusque là, tout se passe comme prévu: CompactEXE() me crée bien le
fichier ANCRE_xx.mdb.tmp, dans lequel je ne trouve que la macro
"mcrCompact" et le module "modcompactCurrentDb", dans lequel se trouve
le code destiné à compacter ma base.
Public Function Compact()
Dim acApp As Access.Application
Dim strDbPath As String, strDbFile As String
Dim strDbFileOld As String
strDbPath = CurrentDb.Name
strDbFile = Left(strDbPath, Len(strDbPath) - 4)
strDbFileOld = Left(strDbFile, Len(strDbFile) - 4) & ".old"
Les 3 instructions ci-dessus n'ont un sens que si CurrentDbName =
E:ANCRE.mdb.tmp. On a alors:
strDbPath = E:ANCRE.mdb.tmp
strDbFile = E:ANCRE.mdb
strDbFileOld = E:ANCRE.mdb.old
Set acApp = GetObject(strDbFile)
Ça voudrait dire qu'on ouvre bien le fichier ex .tmp dans lequel on n'a
que le code pour compacter.
Sauf si mon hypothèse ci-dessus n'est pas vérifiée, et qu'on aurait, à
la place, CurrentDbName = E:ANCRE.mdb, ce qui donnerait
strDbPath = E:ANCRE.mdb
strDbFile = E:ANCRE
strDbFileOld = E:ANCRE.old
Mais, si c'était le cas, comment access réagirait-il???
With acApp
.SysCmd acSysCmdSetStatus, "Compactage en cours..."
.CloseCurrentDatabase
On ferme ANCRE_xx.mdb
DBEngine.CompactDatabase strDbFile, strDbFileOld
Kill strDbFile
On supprime ANCRE_xx.mdb
Name strDbFileOld As strDbFile
.OpenCurrentDatabase strDbFile
On renomme .old en .mdb et on ré-ouvre la base de travail.
.SysCmd acSysCmdClearStatus
End With
Application.Quit
End Function
Bref, si mon analyse entre les diverses instruction est bonne, ça
devrait, "en principe", marcher... Mais, en réalité, c'est pas le cas :/
Alors, je compte sur vous, les cracks, pour y voir plus clair que moi et
dire où ça cloche..
Pour moi, ce n'est pas possible de compacter une base qui CONTIENT le
code destiné à compacter la base donc le code de jessy ferme la base
qu'il va compacter et donc vu que la base est fermée; pour que le code
puisse continuer à tourner il est forcément ailleurs.
Re,
Tu as tout à fait raison et, si j'interprète correctement le code de
Jessie, il tient bien compte de cette nécessité.
Revoici le code:
Function CompactEXE() As Boolean
Dim strDbFile As String
strDbFile = CurrentDb.Name & ".tmp"
' Sachant que ma base se nomme E:Mes DocumentsAncreAncre_xx.mdb,
alors: strDbFile = E:\Ancre_xx.mdb.tmp, et je retrouve bien ce fichier
dans le répertoire de ma base initiale.
If Dir(strDbFile) <> "" Then Kill strDbFile
' On supprime un fichier .tmp pré-existant. OK?
DBEngine.CreateDatabase strDbFile, dbLangGeneral
' On recrée un fichier .tmp et on y met mcrCompact et modCompactCurrentDb
DoCmd.CopyObject strDbFile, , acMacro, "mcrCompact"
DoCmd.CopyObject strDbFile, , acModule, "modCompactCurrentDb"
Shell "MSACCESS.EXE """ & strDbFile & """ /x mcrCompact", _
vbMinimizedNoFocus
' Je ne sais pas trop ce que fait cette instruction Shell etc... mais
elle est en rapport avec la macro mcrCompact, qui lance la fonction
Compact() ci-dessous.
Si je ne me fous pas dedans, à ce stade ma base initiale est toujours
ouverte et la macro est exécutée depuis elle, ce qui, d'après toi, est
la cause du problème rencontré. OK ???
End Function
Jusque là, tout se passe comme prévu: CompactEXE() me crée bien le
fichier ANCRE_xx.mdb.tmp, dans lequel je ne trouve que la macro
"mcrCompact" et le module "modcompactCurrentDb", dans lequel se trouve
le code destiné à compacter ma base.
Public Function Compact()
Dim acApp As Access.Application
Dim strDbPath As String, strDbFile As String
Dim strDbFileOld As String
strDbPath = CurrentDb.Name
strDbFile = Left(strDbPath, Len(strDbPath) - 4)
strDbFileOld = Left(strDbFile, Len(strDbFile) - 4) & ".old"
Les 3 instructions ci-dessus n'ont un sens que si CurrentDbName =
E:\ANCRE.mdb.tmp. On a alors:
strDbPath = E:\ANCRE.mdb.tmp
strDbFile = E:\ANCRE.mdb
strDbFileOld = E:\ANCRE.mdb.old
Set acApp = GetObject(strDbFile)
Ça voudrait dire qu'on ouvre bien le fichier ex .tmp dans lequel on n'a
que le code pour compacter.
Sauf si mon hypothèse ci-dessus n'est pas vérifiée, et qu'on aurait, à
la place, CurrentDbName = E:\ANCRE.mdb, ce qui donnerait
strDbPath = E:\ANCRE.mdb
strDbFile = E:\ANCRE
strDbFileOld = E:\ANCRE.old
Mais, si c'était le cas, comment access réagirait-il???
With acApp
.SysCmd acSysCmdSetStatus, "Compactage en cours..."
.CloseCurrentDatabase
On ferme ANCRE_xx.mdb
DBEngine.CompactDatabase strDbFile, strDbFileOld
Kill strDbFile
On supprime ANCRE_xx.mdb
Name strDbFileOld As strDbFile
.OpenCurrentDatabase strDbFile
On renomme .old en .mdb et on ré-ouvre la base de travail.
.SysCmd acSysCmdClearStatus
End With
Application.Quit
End Function
Bref, si mon analyse entre les diverses instruction est bonne, ça
devrait, "en principe", marcher... Mais, en réalité, c'est pas le cas :/
Alors, je compte sur vous, les cracks, pour y voir plus clair que moi et
dire où ça cloche..
Pour moi, ce n'est pas possible de compacter une base qui CONTIENT le
code destiné à compacter la base donc le code de jessy ferme la base
qu'il va compacter et donc vu que la base est fermée; pour que le code
puisse continuer à tourner il est forcément ailleurs.
Re,
Tu as tout à fait raison et, si j'interprète correctement le code de
Jessie, il tient bien compte de cette nécessité.
Revoici le code:
Function CompactEXE() As Boolean
Dim strDbFile As String
strDbFile = CurrentDb.Name & ".tmp"
' Sachant que ma base se nomme E:Mes DocumentsAncreAncre_xx.mdb,
alors: strDbFile = E:Ancre_xx.mdb.tmp, et je retrouve bien ce fichier
dans le répertoire de ma base initiale.
If Dir(strDbFile) <> "" Then Kill strDbFile
' On supprime un fichier .tmp pré-existant. OK?
DBEngine.CreateDatabase strDbFile, dbLangGeneral
' On recrée un fichier .tmp et on y met mcrCompact et modCompactCurrentDb
DoCmd.CopyObject strDbFile, , acMacro, "mcrCompact"
DoCmd.CopyObject strDbFile, , acModule, "modCompactCurrentDb"
Shell "MSACCESS.EXE """ & strDbFile & """ /x mcrCompact", _
vbMinimizedNoFocus
' Je ne sais pas trop ce que fait cette instruction Shell etc... mais
elle est en rapport avec la macro mcrCompact, qui lance la fonction
Compact() ci-dessous.
Si je ne me fous pas dedans, à ce stade ma base initiale est toujours
ouverte et la macro est exécutée depuis elle, ce qui, d'après toi, est
la cause du problème rencontré. OK ???
End Function
Jusque là, tout se passe comme prévu: CompactEXE() me crée bien le
fichier ANCRE_xx.mdb.tmp, dans lequel je ne trouve que la macro
"mcrCompact" et le module "modcompactCurrentDb", dans lequel se trouve
le code destiné à compacter ma base.
Public Function Compact()
Dim acApp As Access.Application
Dim strDbPath As String, strDbFile As String
Dim strDbFileOld As String
strDbPath = CurrentDb.Name
strDbFile = Left(strDbPath, Len(strDbPath) - 4)
strDbFileOld = Left(strDbFile, Len(strDbFile) - 4) & ".old"
Les 3 instructions ci-dessus n'ont un sens que si CurrentDbName =
E:ANCRE.mdb.tmp. On a alors:
strDbPath = E:ANCRE.mdb.tmp
strDbFile = E:ANCRE.mdb
strDbFileOld = E:ANCRE.mdb.old
Set acApp = GetObject(strDbFile)
Ça voudrait dire qu'on ouvre bien le fichier ex .tmp dans lequel on n'a
que le code pour compacter.
Sauf si mon hypothèse ci-dessus n'est pas vérifiée, et qu'on aurait, à
la place, CurrentDbName = E:ANCRE.mdb, ce qui donnerait
strDbPath = E:ANCRE.mdb
strDbFile = E:ANCRE
strDbFileOld = E:ANCRE.old
Mais, si c'était le cas, comment access réagirait-il???
With acApp
.SysCmd acSysCmdSetStatus, "Compactage en cours..."
.CloseCurrentDatabase
On ferme ANCRE_xx.mdb
DBEngine.CompactDatabase strDbFile, strDbFileOld
Kill strDbFile
On supprime ANCRE_xx.mdb
Name strDbFileOld As strDbFile
.OpenCurrentDatabase strDbFile
On renomme .old en .mdb et on ré-ouvre la base de travail.
.SysCmd acSysCmdClearStatus
End With
Application.Quit
End Function
Bref, si mon analyse entre les diverses instruction est bonne, ça
devrait, "en principe", marcher... Mais, en réalité, c'est pas le cas :/
Alors, je compte sur vous, les cracks, pour y voir plus clair que moi et
dire où ça cloche..
Francis a écrit :Pour moi, ce n'est pas possible de compacter une base qui CONTIENT le
code destiné à compacter la base donc le code de jessy ferme la base
qu'il va compacter et donc vu que la base est fermée; pour que le code
puisse continuer à tourner il est forcément ailleurs.
Re,
Tu as tout à fait raison et, si j'interprète correctement le code de
Jessie, il tient bien compte de cette nécessité.
Revoici le code:
Function CompactEXE() As Boolean
Dim strDbFile As String
strDbFile = CurrentDb.Name & ".tmp"
' Sachant que ma base se nomme E:Mes DocumentsAncreAncre_xx.mdb, alors:
strDbFile = E:Ancre_xx.mdb.tmp, et je retrouve bien ce fichier dans le
répertoire de ma base initiale.
If Dir(strDbFile) <> "" Then Kill strDbFile
' On supprime un fichier .tmp pré-existant. OK?
DBEngine.CreateDatabase strDbFile, dbLangGeneral
' On recrée un fichier .tmp et on y met mcrCompact et modCompactCurrentDb
DoCmd.CopyObject strDbFile, , acMacro, "mcrCompact"
DoCmd.CopyObject strDbFile, , acModule, "modCompactCurrentDb"
Shell "MSACCESS.EXE """ & strDbFile & """ /x mcrCompact", _
vbMinimizedNoFocus
' Je ne sais pas trop ce que fait cette instruction Shell etc... mais elle
est en rapport avec la macro mcrCompact, qui lance la fonction Compact()
ci-dessous.
Si je ne me fous pas dedans, à ce stade ma base initiale est toujours
ouverte et la macro est exécutée depuis elle, ce qui, d'après toi, est la
cause du problème rencontré. OK ???
End Function
Jusque là, tout se passe comme prévu: CompactEXE() me crée bien le fichier
ANCRE_xx.mdb.tmp, dans lequel je ne trouve que la macro "mcrCompact" et le
module "modcompactCurrentDb", dans lequel se trouve le code destiné à
compacter ma base.
Public Function Compact()
Dim acApp As Access.Application
Dim strDbPath As String, strDbFile As String
Dim strDbFileOld As String
strDbPath = CurrentDb.Name
strDbFile = Left(strDbPath, Len(strDbPath) - 4)
strDbFileOld = Left(strDbFile, Len(strDbFile) - 4) & ".old"
Les 3 instructions ci-dessus n'ont un sens que si CurrentDbName =
E:ANCRE.mdb.tmp. On a alors:
strDbPath = E:ANCRE.mdb.tmp
strDbFile = E:ANCRE.mdb
strDbFileOld = E:ANCRE.mdb.old
Set acApp = GetObject(strDbFile)
Ça voudrait dire qu'on ouvre bien le fichier ex .tmp dans lequel on n'a que
le code pour compacter.
Sauf si mon hypothèse ci-dessus n'est pas vérifiée, et qu'on aurait, à la
place, CurrentDbName = E:ANCRE.mdb, ce qui donnerait
strDbPath = E:ANCRE.mdb
strDbFile = E:ANCRE
strDbFileOld = E:ANCRE.old
Mais, si c'était le cas, comment access réagirait-il???
With acApp
.SysCmd acSysCmdSetStatus, "Compactage en cours..."
.CloseCurrentDatabase
On ferme ANCRE_xx.mdb
DBEngine.CompactDatabase strDbFile, strDbFileOld
Kill strDbFile
On supprime ANCRE_xx.mdb
Name strDbFileOld As strDbFile
.OpenCurrentDatabase strDbFile
On renomme .old en .mdb et on ré-ouvre la base de travail.
.SysCmd acSysCmdClearStatus
End With
Application.Quit
End Function
Bref, si mon analyse entre les diverses instruction est bonne, ça devrait,
"en principe", marcher... Mais, en réalité, c'est pas le cas :/
Alors, je compte sur vous, les cracks, pour y voir plus clair que moi et
dire où ça cloche..
Alors d'abord la ligne que tu ne comprends pas à savoir la ligne :
Shell "MSACCESS.EXE """ & strDbFile & """ /x mcrCompact", _
vbMinimizedNoFocus
C'est elle qui effectue le compactage de la base à partir du code situé
dans la nouvelle base qui a été créée.
Ensuite j'ai testé le code de Jessy et apparemment il n'appécie pas
la nom de la 2ème fonction que j'ai donc renommer en "Compactage",
J'ai ensuite créé une macro "mcrCompact" qui ExecuteCode et choisi
la fonction "Compactage()" puis une 2ème macro qui ExecuteCode et
choisi "CompactEXE()" qui lançe le compactage et aucun problème
cela a bien fonctionné.
Rappel des fonctions :
Function CompactEXE() As Boolean
Dim strDbFile As String
strDbFile = CurrentDb.Name & ".tmp"
If Dir(strDbFile) <> "" Then Kill strDbFile
DBEngine.CreateDatabase strDbFile, dbLangGeneral
DoCmd.CopyObject strDbFile, , acMacro, "mcrCompact"
' Ici faire attention au nom du module
DoCmd.CopyObject strDbFile, , acModule, "modCompactCurrentDb"
Shell "MSACCESS.EXE """ & strDbFile & """ /x mcrCompact", _
vbMinimizedNoFocus
End Function
Public Function Compactage()
Dim acApp As Access.Application
Dim strDbPath As String, strDbFile As String
Dim strDbFileOld As String
strDbPath = CurrentDb.Name
strDbFile = Left(strDbPath, Len(strDbPath) - 4)
strDbFileOld = Left(strDbFile, Len(strDbFile) - 4) & ".old"
Set acApp = GetObject(strDbFile)
With acApp
.SysCmd acSysCmdSetStatus, "Compactage en cours..."
.CloseCurrentDatabase
DBEngine.CompactDatabase strDbFile, strDbFileOld
Kill strDbFile
Name strDbFileOld As strDbFile
.OpenCurrentDatabase strDbFile
.SysCmd acSysCmdClearStatus
End With
Application.Quit
End Function
Francis a écrit :
Pour moi, ce n'est pas possible de compacter une base qui CONTIENT le
code destiné à compacter la base donc le code de jessy ferme la base
qu'il va compacter et donc vu que la base est fermée; pour que le code
puisse continuer à tourner il est forcément ailleurs.
Re,
Tu as tout à fait raison et, si j'interprète correctement le code de
Jessie, il tient bien compte de cette nécessité.
Revoici le code:
Function CompactEXE() As Boolean
Dim strDbFile As String
strDbFile = CurrentDb.Name & ".tmp"
' Sachant que ma base se nomme E:Mes DocumentsAncreAncre_xx.mdb, alors:
strDbFile = E:\Ancre_xx.mdb.tmp, et je retrouve bien ce fichier dans le
répertoire de ma base initiale.
If Dir(strDbFile) <> "" Then Kill strDbFile
' On supprime un fichier .tmp pré-existant. OK?
DBEngine.CreateDatabase strDbFile, dbLangGeneral
' On recrée un fichier .tmp et on y met mcrCompact et modCompactCurrentDb
DoCmd.CopyObject strDbFile, , acMacro, "mcrCompact"
DoCmd.CopyObject strDbFile, , acModule, "modCompactCurrentDb"
Shell "MSACCESS.EXE """ & strDbFile & """ /x mcrCompact", _
vbMinimizedNoFocus
' Je ne sais pas trop ce que fait cette instruction Shell etc... mais elle
est en rapport avec la macro mcrCompact, qui lance la fonction Compact()
ci-dessous.
Si je ne me fous pas dedans, à ce stade ma base initiale est toujours
ouverte et la macro est exécutée depuis elle, ce qui, d'après toi, est la
cause du problème rencontré. OK ???
End Function
Jusque là, tout se passe comme prévu: CompactEXE() me crée bien le fichier
ANCRE_xx.mdb.tmp, dans lequel je ne trouve que la macro "mcrCompact" et le
module "modcompactCurrentDb", dans lequel se trouve le code destiné à
compacter ma base.
Public Function Compact()
Dim acApp As Access.Application
Dim strDbPath As String, strDbFile As String
Dim strDbFileOld As String
strDbPath = CurrentDb.Name
strDbFile = Left(strDbPath, Len(strDbPath) - 4)
strDbFileOld = Left(strDbFile, Len(strDbFile) - 4) & ".old"
Les 3 instructions ci-dessus n'ont un sens que si CurrentDbName =
E:\ANCRE.mdb.tmp. On a alors:
strDbPath = E:\ANCRE.mdb.tmp
strDbFile = E:\ANCRE.mdb
strDbFileOld = E:\ANCRE.mdb.old
Set acApp = GetObject(strDbFile)
Ça voudrait dire qu'on ouvre bien le fichier ex .tmp dans lequel on n'a que
le code pour compacter.
Sauf si mon hypothèse ci-dessus n'est pas vérifiée, et qu'on aurait, à la
place, CurrentDbName = E:\ANCRE.mdb, ce qui donnerait
strDbPath = E:\ANCRE.mdb
strDbFile = E:\ANCRE
strDbFileOld = E:\ANCRE.old
Mais, si c'était le cas, comment access réagirait-il???
With acApp
.SysCmd acSysCmdSetStatus, "Compactage en cours..."
.CloseCurrentDatabase
On ferme ANCRE_xx.mdb
DBEngine.CompactDatabase strDbFile, strDbFileOld
Kill strDbFile
On supprime ANCRE_xx.mdb
Name strDbFileOld As strDbFile
.OpenCurrentDatabase strDbFile
On renomme .old en .mdb et on ré-ouvre la base de travail.
.SysCmd acSysCmdClearStatus
End With
Application.Quit
End Function
Bref, si mon analyse entre les diverses instruction est bonne, ça devrait,
"en principe", marcher... Mais, en réalité, c'est pas le cas :/
Alors, je compte sur vous, les cracks, pour y voir plus clair que moi et
dire où ça cloche..
Alors d'abord la ligne que tu ne comprends pas à savoir la ligne :
Shell "MSACCESS.EXE """ & strDbFile & """ /x mcrCompact", _
vbMinimizedNoFocus
C'est elle qui effectue le compactage de la base à partir du code situé
dans la nouvelle base qui a été créée.
Ensuite j'ai testé le code de Jessy et apparemment il n'appécie pas
la nom de la 2ème fonction que j'ai donc renommer en "Compactage",
J'ai ensuite créé une macro "mcrCompact" qui ExecuteCode et choisi
la fonction "Compactage()" puis une 2ème macro qui ExecuteCode et
choisi "CompactEXE()" qui lançe le compactage et aucun problème
cela a bien fonctionné.
Rappel des fonctions :
Function CompactEXE() As Boolean
Dim strDbFile As String
strDbFile = CurrentDb.Name & ".tmp"
If Dir(strDbFile) <> "" Then Kill strDbFile
DBEngine.CreateDatabase strDbFile, dbLangGeneral
DoCmd.CopyObject strDbFile, , acMacro, "mcrCompact"
' Ici faire attention au nom du module
DoCmd.CopyObject strDbFile, , acModule, "modCompactCurrentDb"
Shell "MSACCESS.EXE """ & strDbFile & """ /x mcrCompact", _
vbMinimizedNoFocus
End Function
Public Function Compactage()
Dim acApp As Access.Application
Dim strDbPath As String, strDbFile As String
Dim strDbFileOld As String
strDbPath = CurrentDb.Name
strDbFile = Left(strDbPath, Len(strDbPath) - 4)
strDbFileOld = Left(strDbFile, Len(strDbFile) - 4) & ".old"
Set acApp = GetObject(strDbFile)
With acApp
.SysCmd acSysCmdSetStatus, "Compactage en cours..."
.CloseCurrentDatabase
DBEngine.CompactDatabase strDbFile, strDbFileOld
Kill strDbFile
Name strDbFileOld As strDbFile
.OpenCurrentDatabase strDbFile
.SysCmd acSysCmdClearStatus
End With
Application.Quit
End Function
Francis a écrit :Pour moi, ce n'est pas possible de compacter une base qui CONTIENT le
code destiné à compacter la base donc le code de jessy ferme la base
qu'il va compacter et donc vu que la base est fermée; pour que le code
puisse continuer à tourner il est forcément ailleurs.
Re,
Tu as tout à fait raison et, si j'interprète correctement le code de
Jessie, il tient bien compte de cette nécessité.
Revoici le code:
Function CompactEXE() As Boolean
Dim strDbFile As String
strDbFile = CurrentDb.Name & ".tmp"
' Sachant que ma base se nomme E:Mes DocumentsAncreAncre_xx.mdb, alors:
strDbFile = E:Ancre_xx.mdb.tmp, et je retrouve bien ce fichier dans le
répertoire de ma base initiale.
If Dir(strDbFile) <> "" Then Kill strDbFile
' On supprime un fichier .tmp pré-existant. OK?
DBEngine.CreateDatabase strDbFile, dbLangGeneral
' On recrée un fichier .tmp et on y met mcrCompact et modCompactCurrentDb
DoCmd.CopyObject strDbFile, , acMacro, "mcrCompact"
DoCmd.CopyObject strDbFile, , acModule, "modCompactCurrentDb"
Shell "MSACCESS.EXE """ & strDbFile & """ /x mcrCompact", _
vbMinimizedNoFocus
' Je ne sais pas trop ce que fait cette instruction Shell etc... mais elle
est en rapport avec la macro mcrCompact, qui lance la fonction Compact()
ci-dessous.
Si je ne me fous pas dedans, à ce stade ma base initiale est toujours
ouverte et la macro est exécutée depuis elle, ce qui, d'après toi, est la
cause du problème rencontré. OK ???
End Function
Jusque là, tout se passe comme prévu: CompactEXE() me crée bien le fichier
ANCRE_xx.mdb.tmp, dans lequel je ne trouve que la macro "mcrCompact" et le
module "modcompactCurrentDb", dans lequel se trouve le code destiné à
compacter ma base.
Public Function Compact()
Dim acApp As Access.Application
Dim strDbPath As String, strDbFile As String
Dim strDbFileOld As String
strDbPath = CurrentDb.Name
strDbFile = Left(strDbPath, Len(strDbPath) - 4)
strDbFileOld = Left(strDbFile, Len(strDbFile) - 4) & ".old"
Les 3 instructions ci-dessus n'ont un sens que si CurrentDbName =
E:ANCRE.mdb.tmp. On a alors:
strDbPath = E:ANCRE.mdb.tmp
strDbFile = E:ANCRE.mdb
strDbFileOld = E:ANCRE.mdb.old
Set acApp = GetObject(strDbFile)
Ça voudrait dire qu'on ouvre bien le fichier ex .tmp dans lequel on n'a que
le code pour compacter.
Sauf si mon hypothèse ci-dessus n'est pas vérifiée, et qu'on aurait, à la
place, CurrentDbName = E:ANCRE.mdb, ce qui donnerait
strDbPath = E:ANCRE.mdb
strDbFile = E:ANCRE
strDbFileOld = E:ANCRE.old
Mais, si c'était le cas, comment access réagirait-il???
With acApp
.SysCmd acSysCmdSetStatus, "Compactage en cours..."
.CloseCurrentDatabase
On ferme ANCRE_xx.mdb
DBEngine.CompactDatabase strDbFile, strDbFileOld
Kill strDbFile
On supprime ANCRE_xx.mdb
Name strDbFileOld As strDbFile
.OpenCurrentDatabase strDbFile
On renomme .old en .mdb et on ré-ouvre la base de travail.
.SysCmd acSysCmdClearStatus
End With
Application.Quit
End Function
Bref, si mon analyse entre les diverses instruction est bonne, ça devrait,
"en principe", marcher... Mais, en réalité, c'est pas le cas :/
Alors, je compte sur vous, les cracks, pour y voir plus clair que moi et
dire où ça cloche..
Alors d'abord la ligne que tu ne comprends pas à savoir la ligne :
Shell "MSACCESS.EXE """ & strDbFile & """ /x mcrCompact", _
vbMinimizedNoFocus
C'est elle qui effectue le compactage de la base à partir du code situé
dans la nouvelle base qui a été créée.
Ensuite j'ai testé le code de Jessy et apparemment il n'appécie pas
la nom de la 2ème fonction que j'ai donc renommer en "Compactage",
J'ai ensuite créé une macro "mcrCompact" qui ExecuteCode et choisi
la fonction "Compactage()" puis une 2ème macro qui ExecuteCode et
choisi "CompactEXE()" qui lançe le compactage et aucun problème
cela a bien fonctionné.
Rappel des fonctions :
Function CompactEXE() As Boolean
Dim strDbFile As String
strDbFile = CurrentDb.Name & ".tmp"
If Dir(strDbFile) <> "" Then Kill strDbFile
DBEngine.CreateDatabase strDbFile, dbLangGeneral
DoCmd.CopyObject strDbFile, , acMacro, "mcrCompact"
' Ici faire attention au nom du module
DoCmd.CopyObject strDbFile, , acModule, "modCompactCurrentDb"
Shell "MSACCESS.EXE """ & strDbFile & """ /x mcrCompact", _
vbMinimizedNoFocus
End Function
Public Function Compactage()
Dim acApp As Access.Application
Dim strDbPath As String, strDbFile As String
Dim strDbFileOld As String
strDbPath = CurrentDb.Name
strDbFile = Left(strDbPath, Len(strDbPath) - 4)
strDbFileOld = Left(strDbFile, Len(strDbFile) - 4) & ".old"
Set acApp = GetObject(strDbFile)
With acApp
.SysCmd acSysCmdSetStatus, "Compactage en cours..."
.CloseCurrentDatabase
DBEngine.CompactDatabase strDbFile, strDbFileOld
Kill strDbFile
Name strDbFileOld As strDbFile
.OpenCurrentDatabase strDbFile
.SysCmd acSysCmdClearStatus
End With
Application.Quit
End Function
Michel_D a présenté l'énoncé suivant :
>
> Alors d'abord la ligne que tu ne comprends pas à savoir la ligne :
> Shell "MSACCESS.EXE """ & strDbFile & """ /x mcrCompact", _
> vbMinimizedNoFocus
> C'est elle qui effectue le compactage de la base à partir du code situé
> dans la nouvelle base qui a été créée.
>
> Ensuite j'ai testé le code de Jessy et apparemment il n'appécie pas
> la nom de la 2ème fonction que j'ai donc renommer en "Compactage",
> J'ai ensuite créé une macro "mcrCompact" qui ExecuteCode et choisi
> la fonction "Compactage()" puis une 2ème macro qui ExecuteCode et
> choisi "CompactEXE()" qui lançe le compactage et aucun problème
> cela a bien fonctionné.
>
> Rappel des fonctions :
>
> Function CompactEXE() As Boolean
> Dim strDbFile As String
>
> strDbFile = CurrentDb.Name & ".tmp"
> If Dir(strDbFile) <> "" Then Kill strDbFile
> DBEngine.CreateDatabase strDbFile, dbLangGeneral
> DoCmd.CopyObject strDbFile, , acMacro, "mcrCompact"
> ' Ici faire attention au nom du module
> DoCmd.CopyObject strDbFile, , acModule, "modCompactCurrentDb"
>
> Shell "MSACCESS.EXE """ & strDbFile & """ /x mcrCompact", _
> vbMinimizedNoFocus
> End Function
>
> Public Function Compactage()
> Dim acApp As Access.Application
> Dim strDbPath As String, strDbFile As String
> Dim strDbFileOld As String
>
> strDbPath = CurrentDb.Name
> strDbFile = Left(strDbPath, Len(strDbPath) - 4)
> strDbFileOld = Left(strDbFile, Len(strDbFile) - 4) & ".old"
>
> Set acApp = GetObject(strDbFile)
>
> With acApp
> .SysCmd acSysCmdSetStatus, "Compactage en cours..."
> .CloseCurrentDatabase
> DBEngine.CompactDatabase strDbFile, strDbFileOld
> Kill strDbFile
> Name strDbFileOld As strDbFile
> .OpenCurrentDatabase strDbFile
> .SysCmd acSysCmdClearStatus
> End With
> Application.Quit
> End Function
Bonsoir Michel,
Effectivement, ça marche au poil, et j'en suis tout ébahi. C'est un
vrai tour de passe-passe car tu n'as vraiment pas changé grand chose au
code de Jessy.
Reste quand même un mystère pour moi, au niveau de la différence qu'il
y a entre lancer une macro qui lance CompactEXE() et lancer
directement CompactEXE() par une instruction VBA... Au niveau du
résultat final, il est flagrant que ça n'est pas la même chose :/
Quoi qu'il en soit, bravo et merci beaucoup pour ton coup de main. :-)
Bonne soirée,
Francis
Michel_D a présenté l'énoncé suivant :
>
> Alors d'abord la ligne que tu ne comprends pas à savoir la ligne :
> Shell "MSACCESS.EXE """ & strDbFile & """ /x mcrCompact", _
> vbMinimizedNoFocus
> C'est elle qui effectue le compactage de la base à partir du code situé
> dans la nouvelle base qui a été créée.
>
> Ensuite j'ai testé le code de Jessy et apparemment il n'appécie pas
> la nom de la 2ème fonction que j'ai donc renommer en "Compactage",
> J'ai ensuite créé une macro "mcrCompact" qui ExecuteCode et choisi
> la fonction "Compactage()" puis une 2ème macro qui ExecuteCode et
> choisi "CompactEXE()" qui lançe le compactage et aucun problème
> cela a bien fonctionné.
>
> Rappel des fonctions :
>
> Function CompactEXE() As Boolean
> Dim strDbFile As String
>
> strDbFile = CurrentDb.Name & ".tmp"
> If Dir(strDbFile) <> "" Then Kill strDbFile
> DBEngine.CreateDatabase strDbFile, dbLangGeneral
> DoCmd.CopyObject strDbFile, , acMacro, "mcrCompact"
> ' Ici faire attention au nom du module
> DoCmd.CopyObject strDbFile, , acModule, "modCompactCurrentDb"
>
> Shell "MSACCESS.EXE """ & strDbFile & """ /x mcrCompact", _
> vbMinimizedNoFocus
> End Function
>
> Public Function Compactage()
> Dim acApp As Access.Application
> Dim strDbPath As String, strDbFile As String
> Dim strDbFileOld As String
>
> strDbPath = CurrentDb.Name
> strDbFile = Left(strDbPath, Len(strDbPath) - 4)
> strDbFileOld = Left(strDbFile, Len(strDbFile) - 4) & ".old"
>
> Set acApp = GetObject(strDbFile)
>
> With acApp
> .SysCmd acSysCmdSetStatus, "Compactage en cours..."
> .CloseCurrentDatabase
> DBEngine.CompactDatabase strDbFile, strDbFileOld
> Kill strDbFile
> Name strDbFileOld As strDbFile
> .OpenCurrentDatabase strDbFile
> .SysCmd acSysCmdClearStatus
> End With
> Application.Quit
> End Function
Bonsoir Michel,
Effectivement, ça marche au poil, et j'en suis tout ébahi. C'est un
vrai tour de passe-passe car tu n'as vraiment pas changé grand chose au
code de Jessy.
Reste quand même un mystère pour moi, au niveau de la différence qu'il
y a entre lancer une macro qui lance CompactEXE() et lancer
directement CompactEXE() par une instruction VBA... Au niveau du
résultat final, il est flagrant que ça n'est pas la même chose :/
Quoi qu'il en soit, bravo et merci beaucoup pour ton coup de main. :-)
Bonne soirée,
Francis
Michel_D a présenté l'énoncé suivant :
>
> Alors d'abord la ligne que tu ne comprends pas à savoir la ligne :
> Shell "MSACCESS.EXE """ & strDbFile & """ /x mcrCompact", _
> vbMinimizedNoFocus
> C'est elle qui effectue le compactage de la base à partir du code situé
> dans la nouvelle base qui a été créée.
>
> Ensuite j'ai testé le code de Jessy et apparemment il n'appécie pas
> la nom de la 2ème fonction que j'ai donc renommer en "Compactage",
> J'ai ensuite créé une macro "mcrCompact" qui ExecuteCode et choisi
> la fonction "Compactage()" puis une 2ème macro qui ExecuteCode et
> choisi "CompactEXE()" qui lançe le compactage et aucun problème
> cela a bien fonctionné.
>
> Rappel des fonctions :
>
> Function CompactEXE() As Boolean
> Dim strDbFile As String
>
> strDbFile = CurrentDb.Name & ".tmp"
> If Dir(strDbFile) <> "" Then Kill strDbFile
> DBEngine.CreateDatabase strDbFile, dbLangGeneral
> DoCmd.CopyObject strDbFile, , acMacro, "mcrCompact"
> ' Ici faire attention au nom du module
> DoCmd.CopyObject strDbFile, , acModule, "modCompactCurrentDb"
>
> Shell "MSACCESS.EXE """ & strDbFile & """ /x mcrCompact", _
> vbMinimizedNoFocus
> End Function
>
> Public Function Compactage()
> Dim acApp As Access.Application
> Dim strDbPath As String, strDbFile As String
> Dim strDbFileOld As String
>
> strDbPath = CurrentDb.Name
> strDbFile = Left(strDbPath, Len(strDbPath) - 4)
> strDbFileOld = Left(strDbFile, Len(strDbFile) - 4) & ".old"
>
> Set acApp = GetObject(strDbFile)
>
> With acApp
> .SysCmd acSysCmdSetStatus, "Compactage en cours..."
> .CloseCurrentDatabase
> DBEngine.CompactDatabase strDbFile, strDbFileOld
> Kill strDbFile
> Name strDbFileOld As strDbFile
> .OpenCurrentDatabase strDbFile
> .SysCmd acSysCmdClearStatus
> End With
> Application.Quit
> End Function
Bonsoir Michel,
Effectivement, ça marche au poil, et j'en suis tout ébahi. C'est un
vrai tour de passe-passe car tu n'as vraiment pas changé grand chose au
code de Jessy.
Reste quand même un mystère pour moi, au niveau de la différence qu'il
y a entre lancer une macro qui lance CompactEXE() et lancer
directement CompactEXE() par une instruction VBA... Au niveau du
résultat final, il est flagrant que ça n'est pas la même chose :/
Quoi qu'il en soit, bravo et merci beaucoup pour ton coup de main. :-)
Bonne soirée,
Francis