Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

verificare e chiudere un database se aperto

959 views
Skip to first unread message

Augusto

unread,
Aug 12, 2017, 3:06:45 AM8/12/17
to
Salve a tutti, il mio problema è il seguente...
da un database aperto ad un certo punto ne voglio aprire un altro e chiudere quello aperto. questo è il codice che uso su un pulsante di comando...

Shell SysCmd(acSysCmdAccessDir) & "MSAccess.exe D:\Programma\aps.mde", vbNormalFocus
DoCmd.Quit

ma ottengo il seguente messaggio....

L'espressione su caricamento immessa come impostazione della proprietà
di evento ha generato l'errore seguente: Errore di accesso al percorso/file
* L'espressione non corrisponde al nome di una macro, di una funzione definita
dall'utente oppure a [routine evento]
* Si è verificato un errore durante la valutazione di una funzione, di un evento
o di una macro.

Non capisco dove sbaglio... potete aiutarmi ?
Grazie

@Alex

unread,
Aug 12, 2017, 3:40:26 AM8/12/17
to
Usa GETOBJECT per recuperare l'istanza del DB aperto quindi da automazione poi lo chiudi...

@Alex

Potone

unread,
Aug 12, 2017, 10:02:05 AM8/12/17
to
Ciao,
non sarà che SysCmd(acSysCmdAccessDir) restituisce un percorso contenente spazi?
Mat.

Augusto

unread,
Aug 13, 2017, 3:18:26 PM8/13/17
to
Il giorno sabato 12 agosto 2017 09:40:26 UTC+2, @Alex ha scritto:
> Usa GETOBJECT per recuperare l'istanza del DB aperto quindi da automazione poi lo chiudi...
>
> @Alex

non capisco... sii più esplicito Alex, io non ho la tua esperienza.

@Alex

unread,
Aug 14, 2017, 2:06:48 PM8/14/17
to
Iniziamo a capire cosa non ti è chiaro della guida in merito alla ricerca e lettura che sicuramente hai fatto relativamente a GETOBJECT... perché io sicuramente sono sintetico... ma la guida è estremamente chiara... con esempi anche...

Da lì poi andiamo avanti...

@Alex

Potone

unread,
Aug 16, 2017, 1:17:37 PM8/16/17
to
Scusa Augusto,
hai verificato cosa restituisce SysCmd(acSysCmdAccessDir)?
È molto probabile che il percorso restituito contenga spazi, pe: C:\Program files\Microsoft Office\...
in questo caso il comando shell non potrà fare accesso al file restituendo l'errore che hai riportato (piuttisto esplicativo, dice: errore di accesso al percorso o file).
Per risolvere devi includere l'intero percorso tra doppi apici.
Ciao
Mat.

@Alex

unread,
Aug 16, 2017, 1:39:55 PM8/16/17
to
Speriamo non venga aperta una seconda istanza...quel metodo... Non ho verificato ma mi sa tanto di si...

@Alex

Potone

unread,
Aug 16, 2017, 1:52:22 PM8/16/17
to
Ciao @Alex,
penso che il suo intento sia proprio quello di aprire una nuova istanza e chiudere quella corrente.
Mat.
Message has been deleted

ogrn

unread,
Aug 31, 2017, 4:47:47 PM8/31/17
to
>da un database aperto ad un certo punto ne voglio aprire un altro e
>chiudere quello aperto. questo è il codice che uso su un pulsante di
>comando...
>Shell SysCmd(acSysCmdAccessDir) & "MSAccess.exe D:\Programma\aps.mde",
>vbNormalFocus
>DoCmd.Quit

La richiesta di Augusto non e' cosi banale...
Pure io ho un problema, non sull'apertura del file Access da VBA, quanto
sulla chiusura.
Dopo il lancio con Shell di un DB, l'istanza resta attiva come processo
anche chiudendo il file, impedendo l'avvio di altri file Access.
Spiegando piu in dettaglio, ho 3 file Access che sono una *copia dello
stesso programma* ma con nomi diversi:
- Access.accdb - per il lancio programma stand-alone
- ERP.accdb - per lancio programma da pulsante su maschera dell'ERP
- Outlook.accdb - per lancio programma da Outlook con VBA

Sono 3 copie uguali dello stesso programma perche ero stanco di battagliare
controllando se Access gia aperto in memoria, condivisione form, ecc.
Il problema è che quando lancio il programma da VBA Outlook, esso parte
correttamente, ma quando esco da Access l'istanza resta attiva come
processo.
Posso buttarla giu solo con Task Manager.
In pratica Outlook.accdb parte, poi esco, ma non riesco ad aprire gli altri
ERP.accdb e Access.accdb.
Dove sbaglio?
Forse perché prima apro una connessione DAO e non la chiudo correttamente
distruggendo l'oggetto nel punto corretto?
Grazie se potete darmi una dritta.

Il sorgente che utilizzo in Outlook è il seguente:

Public Const Sistema = "C:\Programmi\Acc\Outlook.accdb"
Public Const Connessione = "C:\Program Files\Microsoft
Office\Office14\MSACCESS"

Sub AccCall(Selettore As Variant)
On Error GoTo Err_AccCall

Dim db As DAO.Database
Dim Filtro As String
Dim Servizio As String

If Nz(Selettore, "") = "" Then Exit Sub

Select Case Selettore:
Case "Documento":
Servizio = "fDocumento"
Filtro = SelezioneLeggi
SQL = "INSERT INTO Filtro(Filtro01) VALUES ('" & Filtro & "')"
Case "Anagrafica":
Servizio = "fAnagrafica"
Filtro = SelezioneLeggi
SQL = "INSERT INTO Filtro(Filtro01) VALUES ('" & Filtro & "')"
Case Else:
Servizio = "fMain"

End Select

Set db = DAO.OpenDatabase(Sistema)
db.Execute "DELETE * FROM Filtro"
db.Execute SQL
db.Close

Dim Retval As Variant
Retval = Shell("""" & Connessione & """" & " " & """" & Sistema & """" &
" /x Avvio /cmd " & """" & Servizio & """", vbNormalFocus)

Exit_AccCall:
Exit Sub

Err_AccCall:
Response = MsgBox("AccCall - " & Err.Description, vbCritical, "Errore")
Resume Exit_AccCall
End Sub


---
Questa e-mail è stata controllata per individuare virus con Avast antivirus.
https://www.avast.com/antivirus

GiorgioDaPrato

unread,
Sep 1, 2017, 10:35:43 AM9/1/17
to
mi permetto una IPOTESI DA SPROVVEDUTO
(e mi scuso per il tempo che perdi a leggere ...)

e se fosse che "non ci sia buona sincronia" fra VBA Outlook e gestione processi ?

se hai tempo e voglia puoi lanciare, da Outlook (come dagli altri ambienti),
un file VBS anche con istruzioni più ridotte (solo test) per vedere come la gestione processi Windows "smaltisce" Access alla sua normale chiusura.

Note (minime minime):

l'oggetto DBengine da utilizzare sarà (credo) DAO.DBEngine.140
credo pure che si possano eseguire query nello script

Ho una esperienza davvero ristretta sulla cosa
(adopero solo file mdb e quindi il "mio" oggetto DBengine è DAO.DBEngine.36)

però un inghippo è certo:

per eseguire un oggetto a 32 bit
(come nel mio caso è DAO.DBEngine.36 e come può essere per te DAO.DBEngine.140)
occorre utilizzare il motore vbscript a 32 bit
C:\Windows\SysWOW64\Wscript.exe -->fileVbs

mentre per eseguire un oggetto a 64 bit
occorre utilizzare il motore vbscript a 64 bit
C:\Windows\System\Wscript.exe -->fileVbs

ogrn

unread,
Sep 1, 2017, 11:34:38 AM9/1/17
to
>e se fosse che "non ci sia buona sincronia" fra VBA Outlook e gestione
>processi ?
>se hai tempo e voglia puoi lanciare, da Outlook (come dagli altri
>ambienti),
>un file VBS anche con istruzioni più ridotte (solo test) per vedere come la
>gestione processi Windows "smaltisce" Access alla sua normale chiusura.

Grazie tentero! Potrebbe essere!
Avevo anche tentato la strada di programmare l' "auto-kill" del processo
alla chiusura di Access, ma credo non sia possibile oppure non capisco quale
evento utilizzare.

@Alex

unread,
Sep 1, 2017, 1:33:05 PM9/1/17
to
Al fine di evitare Istanze multiple potrebbe essere un buon tentativo usare i MUTEX... purtroppo sconosciuti a molti...

Provate a leggere questo:
https://www.experts-exchange.com/articles/2104/Avoiding-running-multiple-instances-of-an-application.html

@Alex

ogrn

unread,
Sep 1, 2017, 2:43:10 PM9/1/17
to
>Al fine di evitare Istanze multiple potrebbe essere un buon tentativo usare
>i MUTEX... purtroppo sconosciuti a molti...
>https://www.experts-exchange.com/articles/2104/Avoiding-running-multiple-instances-of-an-application.html

Molto interessante, grazie!

ogrn

unread,
Oct 6, 2017, 6:37:02 PM10/6/17
to
Scusate se riapro la discussione.
Ho risolto il problema dell'impossibilità di chiudere Access dopo il lancio
del database con VBA da Outlook.
Il database lanciato da Outlook si chiude, ma facendo il debug e osservando
il task manager ho 2 processi MSACCESS.EXE che vengono lanciati...
Uno di questi due processi non si chiude mai. Perché?
Perché il primo processo è lanciato dall'istruzione:
If Nz(Selettore, "") = "" Then Exit Sub

Nz è un'istruzione Access e non Outlook, pertanto VBA procede col cercarla
nei Riferimenti del progetto e quindi istanzia un processo MSACCESS.
Ho risolto sostituendo Nz con una banale:
If IsNull(Selettore) Then Exit Sub

In conclusione, il programma definitivo per lanciare Access da Outlook con
l'inserimento di un dato di filtro in una tabella e lancio di una macro, è
il seguente:
(... di una semplicità disarmante!)

Public Const Sistema = "C:\Programmi\Acc\Outlook.accdb"
Public Const Connessione = "C:\Program Files\Microsoft
Office\Office14\MSACCESS"

Sub AccCall(Selettore As Variant)
On Error GoTo Err_AccCall

Dim db As DAO.Database
Dim Filtro As String
Dim Servizio As String

If IsNull(Selettore) Then Exit Sub
*****
0 new messages