web-dev-qa-db-fra.com

Code VBA pour fermer une base de données Access sans laisser un shell de l'application ouverte

J'utilise actuellement Application.Quit qui laisse un shell de l'application MS Access ouvert. 

Après traitement de la fonction appelante par rapport à l’application cible, il ne me reste plus que toutes les instances de l’application ouvertes; même si l'instance de base de données spécifique est fermée. 

Comment faire en sorte que la fenêtre de l'application de la base de données 'Shell' se ferme par programmation à l'aide de VBA?

Voici un exemple de la façon dont la variable est créée et comment je la ferme:

Dim appAccess As New Access.Application

' Do stuff here...

appAccess.CloseCurrentDatabase
10
user110236

Vous devez exécuter Application.Quit par rapport à la variable d'instance.

Par exemple,

Dim appAccess As New Access.Application

' Do stuff here...

appAccess.Application.Quit
4
Curtis Inderwiesche

Selon la documentation: Application.Quit fait la même chose que DoCmd.Quit . À savoir 

La méthode Quit quitte Microsoft Access. Vous pouvez sélectionner l’un des plusieurs options pour enregistrer un objet de base de données avant de quitter.

Vous pouvez essayer d'appeler l'un d'eux avec le paramètre acQuitSaveNone ou 2 qui "Quitte Microsoft Access sans enregistrer d'objet". Après un examen plus approfondi, utilisez Application.Quit car DoCmd.Quit était ajouté pour la compatibilité en amont pour Access 95 (voir les remarques concernant la méthode Quit en tant qu’application à l’objet DoCmd). les autorisations, qui peuvent être la cause de vos coquillages.

Si cela ne fonctionne pas pour vous, voici une suggestion un peu extrême. Enregistrez-le en tant que fichier vbscript et appelez-le une fois que vous avez vraiment terminé avec Access. Cela mettra fin à tous les processus MSAccess sur votre ordinateur Windows, sans compactage ni réparation.

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colProcessList = objWMIService.ExecQuery _
    ("SELECT * FROM Win32_Process WHERE Name = 'msaccess.exe'")
For Each objProcess in colProcessList
    objProcess.Terminate()
Next

Appeler le script en remplaçant [vbspath] par le chemin réel. Si le chemin contient des espaces, veillez à utiliser des guillemets doubles et à les mettre entre guillemets:

Shell "cscript [vbspath]"
8
Daniel

J'utilise toujours DoCmd.Quit acQuitSaveAll.
Cela fonctionne au moins dans Access 2000, 2003 et 2010 (c’est là que j’ai vu ça marche).

5
Christian Specht

Access.Quit fonctionne pour moi. Peut-être essayer cela au lieu de Application.Quit?

Si cela ne le résout pas, votre problème peut être ailleurs, auquel cas veuillez nous en dire plus sur ce projet.

3
PowerUser

DoCmd.Quit acQuitSaveAll, a enfin travaillé. J'avais déjà essayé toutes les autres options et un Shell était toujours en retrait.

2
JAcob

Basculez le formulaire en mode Création . Définissez la propriété BorderStyle du formulaire sur None. Dans le menu Affichage , cliquez sur Mode formulaire . Notez que la barre de titre du formulaire est complètement supprimée.

1
Adam Arian

Voulez-vous dire qu'il laisse une fenêtre shell cmd.exe ouverte après avoir apparemment terminé et qu'un processus MSACCESS.EXE s'exécute en arrière-plan dans la liste des tâches? Et le Shell est appelé en arrière-plan?

0
dmc2005