Condividi:        

Excel/Access - Chiudere un file Excel da macro Access

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

Excel/Access - Chiudere un file Excel da macro Access

Postdi Flash30005 » 12/09/08 10:29

Ciao Anthony,
Ho letto il post che hai fatto su Topic di Antom (chiusura di tutti i file tranne uno predefinito: quello del macro)

a me invece occorre chiudere un determinato file e ho preso lo spunto dal codice da te postato

Codice: Seleziona tutto
Workbooks.Open Filename:="C:\pippo.xls"

Che apre il file pippo.xls
volendo chiudere questo file?
Ho provato con
Codice: Seleziona tutto
Sub Macro1()
Dim WB As Workbook
If WB.Name = "Pippo.xls" Then WB.Close savechanges:=True '(potrebbe essere anche False non interessa il salvataggio)
End Sub

ma mi dà errore:
Variabile oggetto o variabile del blocco With non impostata
Cosa mi consigli?
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Sponsor
 

Re: Excel - Chiudere un determinato file

Postdi Flash30005 » 12/09/08 10:44

premetto che ho usato anche il codice consigliato dall'Help

Codice: Seleziona tutto
Sub ClosePippo()
Workbooks("PIPPO.XLS").Close SaveChanges:=False
End Sub


ma... mi da errore runtime 9
indice non incluso nell'intervallo
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Excel - Chiudere un determinato file

Postdi Flash30005 » 12/09/08 12:20

Con questo codice riesco a chiudere il file ma...

Codice: Seleziona tutto
Workbooks.Open Filename:="c:\pippo.xls"
'Workbooks("pippo.xls").Close


Il mio problema è che la macro sarà in un database situato in rete
Questo database una volta lanciato crea il file pippo.xls nella root di c:\
lo compila e lo apre per visualizzarlo.
Al successivo lancio del comando di compilazione il foglio dovrà essere chiuso altrimenti non sarà possibile ripristinare il file pippo.xls vuoto per essere ricompilato con la nuova elaborazione.
Sapendo che non tuti gli utenti chiudono il foglio vorrei che prima di ogni ricompilazione un codice vba mi chiuda il foglio.
il codice postato qui funziona bene se l'utente ha già usato almeno una volta il db perché ha creato il file nella root del suo pc ma se un utente lancia l'applicativo (db) per la prima volta il file pippo.xls non sarà nella root e il codice qui sopra darà errore.
Chiedo se è possibile mettere la condizione che controlli se esiste il file oppure se esso è aperto?
Con questa condizione avrei risolto.
grazie
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Excel - Chiudere un determinato file

Postdi Anthony47 » 12/09/08 13:33

Per il problema dell' errore sul tuo primo posto:
1- se scrivi If WB.Name = "Pippo.xls" Then WB.Close savechanges:=True, quel WB non e' niente; non basta una dim per dare significato a una sigla.
Tu che cosa vuoi fare, chiudere un file specifico o chiudere tutti meno qualcuno?

2- Workbooks("PIPPO.XLS").Close SaveChanges:=False e'
Se ti da' errore e' perche' non e' un file aperto
Come sopra, tu cosa vuoi fare di preciso?

Per l' ultimo post:
usa la sintassi Workbooks.Open Filename:="C:\Documents and Settings\User_1\Documenti\pippo.xls"
Cioe' indica anche il path nell' istruzione open.
Puoi testare se un file e' gia' apero, o lo puoi chiudere se esiste, utilizzando il blocco istruzioni suggerito ad antom con le opportune modifiche:
Codice: Seleziona tutto
Sub closePippo()
For Each WB In Workbooks
If WB.Name = "Pippo.xls" Then WB.Close savechanges:=True  'o =False, decidi tu
Next WB
End Sub

Ciao, fai sapere.
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Excel - Chiudere un determinato file

Postdi Flash30005 » 12/09/08 14:44

Niente da fare Anthony...
il seguente codice oltre a non chiudere il file pippo.xls sembra che vada in loop
Codice: Seleziona tutto
For Each WB In Workbooks
If WB.Name = "Pippo.xls" Then WB.Close savechanges:=False
Next WB


Spiego il problema in maniera sintetica.
Ho un file di excel "Pippo.xls" che dovrà essere chiuso, da una macro, se aperto.
Se, invece, non è aperto, la macro, non dovrà dare alcun tipo di errore (di file non trovato etc)
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Excel - Chiudere un determinato file

Postdi Anthony47 » 12/09/08 15:01

La macro fa esattamente quello che tu desideri ottenere.
E' un ciclo For Each /Next, va in loop per quanti oggetti contiene la collezione Workbooks = quanti file sono aperti al momento; se ci rimane oltre e' un bug da riportare a Microsoft.
Ovviamente penso che sia il resto del codice che va il loop, magari senza nemmeno passare/arrivare al ciclo For each/Next; metti un break sulla For Each ... e poi esegui passo passo per debuggare; per il break: 1 click sulla riga e poi F9 per mettere/togliere il break; manda in esecuzione la macro, dovrebbe arrestarsi sul break, con l' istruzione in evidenza; per il passo passo: un F8 per volta; per rilanciare: F5.

Se non trovi il bandolo, posta il codice che usi e che da' problema; anche solo un pezzo, ma che sia autosufficiente e tu l' abbia provato.

Comunque fai sapere, ciao.
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Excel - Chiudere un determinato file

Postdi Flash30005 » 14/09/08 22:15

Ok Anthony!

Ho riprovato la macro
Codice: Seleziona tutto
For Each WB In Workbooks
If WB.Name = "Pippo.xls" Then WB.Close savechanges:=False
Next WB


e in Excel funziona (non entra in loop: non sapevo che F8 in excel ricominciasse la macro ero abituato ad Access che si ferma all'End Sub)

Ma riportato il codice all'interno di un comando di Access e pur dimensionando e settando i codici per l'applicazione excel come uso normalmente il foglio Pippo non si chiude.
Facendo eseguire il codice passo-passo noto che arrivato alla riga For Each Wb In oApp.Workbooks "salta" a "Riga successiva programma"

Codice: Seleziona tutto
Private Sub Comando10_Click()
Dim oApp As Object
Set oApp = CreateObject("Excel.Application")
For Each Wb In oApp.Workbooks           'da questo punto salta a "Riga successiva programma"
If Wb.Name = "Pippo.xls" Then Wb.Close savechanges:=False
Next Wb

Riga successiva programma
...
...
...
End Sub

senza passare per la
if Wb.Name = "Pippo.xls" Then Wb.Close savechanges:=False
Dove può essere l'errore?
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Excel - Chiudere un determinato file

Postdi Anthony47 » 15/09/08 22:54

Ovviamente lavorare su excel da una macro di access e' leggermente piu' complicato; al momento controllo se il file e' aperto, se SI lo chiudo, ma non sono ancora riuscito a riaprirlo nella stessa istanza di excel. Grrrrr
Questo lavorando da Word; su Access io so praticamente niente, vediamo cosa possono dire anche esperti di Db.

Ciao.
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Excel/Access - Chiudere un file Excel da macro Access

Postdi Flash30005 » 16/09/08 00:13

La cosa che fa fare anche a me Grrrrrrr :lol: è questo:
(riporto solo una piccola routine rispetto ad altre, che ho, molto più complesse)
Codice: Seleziona tutto
Private Sub Comando10_Click()
...
....'Programma access che lavora sulle tabelle, query etc fino a che

inpfile = "\\111.111.111.111\MS\MResaL.xls"  ' Cartella master formattata ma senza dati (si trova in rete come il database ma sia MsAccess che MsExcel è locale)
outfile = "c:\ResaL.xls"    ' Cartella dove riverserò i dati con il programma di access (nel foglio "Dati1") collegato alla tabella Datiex di access
On Error GoTo err_nexte  ' Qui c'è un rinvio in caso di errore ad una Subroutine che chiude il foglio di Excel se aperto (procedura da me realizzata e funzionante ma "pesante")
FileCopy inpfile, outfile   'Comando che copia il master (in rete) sul disco locale di ogni utente (se il foglio è aperto va in errore e quindi alla subroutine, la subroutine chiude il file excel e rinvia di nuovo a questo comando "Comando10_Click")

----
criterio = "Insert Into Datiex (Campo1, Campo2, Campo3, Campo4, Campo5, Campo6, Campo7, Campo8, Campo9, Campo10) SELECT CampoT1, CampoT2, CampoT3, CampoT4, CampoT5, CampoT6, CampoT7, CampoT8, CampoT9, CampoT10 FROM TabellaX where " & wherex        'dove werex è la condizione definita precedentemente
db.Execute criterio
db.Close

Dim oApp. as object
'----------------------------- Qui inizio a lavoare sul foglio di excel (come dicevo sono poche istruzioni solo come esempio)
    Set oApp = CreateObject("Excel.Application")
    oApp.Visible = False
    oApp.Workbooks.Open FileName:=(outfile)
    oApp.ActiveWindow.Visible = False
    oApp.Windows("ResaL.xls").Activate
    oApp.Sheets("Dati1").Select
    oApp.Rows("2:2").Select
    oApp.Selection.EntireRow.Hidden = True
    oApp.Range("A3").Select
    oApp.Visible = True
    oApp.Application.CutCopyMode = False
    oApp.ActiveWorkbook.Save
    (*)   
End sub

(*) se aggiungo il codice "oApp.ActiveWorkbook.Close" dove segnalato con (*) il foglio si chiude senza problemi ma rende tutta l'elaborazione inutile perché i riusltati del foglio devono essere mostrati con l'apertura dello stesso

Tutto questo per dire:
Perché qui il codice non dà problemi mentre posizionato all'avvio del comando pur riportando diverse righe di quest'ultima parte non riesco a farlo funzionare?

Scusate le chiacchiere ma è per avere un quadro forse più chiaro

P.S.Il problema è che a volte gli utenti dopo una prima analisi non chiudono il foglio e tornando alla maschera di access ed elaborando un'altra analisi il programma andrebbe in errore
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Excel/Access - Chiudere un file Excel da macro Access

Postdi archimede » 16/09/08 08:53

Il codice non può chiudere qualcosa che non ha aperto: ad ogni analisi dovrai dare un nuovo nome al tuo xls.

HTH.

Alessandro
archimede
Moderatore
 
Post: 2851
Iscritto il: 07/11/02 12:41
Località: Genova

Re: Excel/Access - Chiudere un file Excel da macro Access

Postdi Flash30005 » 16/09/08 11:02

Si, l'avevo notato infatti mettendo un codice di apertura foglio ottengo qualcosa di più ma non risolvo in quanto se già aperto mi apre di nuovo il foglio in sola lettura.

Vorrà dire che mi tengo la mia routine (ricavata dall'help) che fa attendere un paio di secondi per l'elaborazione, in caso di foglio aperto, ma è efficace e pensando di fare cosa gradita la pubblico volentieri nel vostro interessantissimo forum
Codice: Seleziona tutto
Private Sub Comando15_Click()
Screen.MousePointer = 11
...
inpfile = "\\111.111.111.111\DB\M_Pippo.xls"
outfile = "c:\Pippo.xls"

On Error GoTo err_nexte  'in caso di foglio aperto invia alla subroutine
FileCopy inpfile, outfile
... '
Set oApp = CreateObject("Excel.Application")
    oApp.Visible = False
    oApp.Workbooks.Open FileName:=(outfile)
    oApp.ActiveWindow.Visible = False
    oApp.Windows("Pippo.xls").Activate
etc etc
...
Screen.MousePointer = 0
Exit_Comando15_Click:
    Exit Sub

err_nexte:
Call err_nexterout
Comando15_Click   'al ritorno dalla routine (dopo aver chiuso il foglio) si riattiva il comando

End Sub


Routine di chiusura foglio
Codice: Seleziona tutto
Sub err_nexterout()
       
    Dim MyXL As Object
    Dim ExcelWasNotRunning As Boolean
    On Error Resume Next
    Set MyXL = GetObject(, "Excel.Application")
    If Err.Number <> 0 Then ExcelWasNotRunning = True
    Err.Clear
    DetectExcel                           'Rinvio alla subroutine di controllo processo aperto
    Set MyXL = GetObject("c:\Pippo.xls")
    MyXL.Application.Visible = False
    MyXL.Parent.Windows(1).Visible = True
    If ExcelWasNotRunning = False Then
    MyXL.Application.Quit
    End If
Set MyXL = Nothing
    Screen.MousePointer = 0


Soubroutine di controllo processo
Codice: Seleziona tutto
Sub DetectExcel()

    Const WM_USER = 1024
    Dim hWnd As Long
    hWnd = FindWindow("Pippo.xls", 0)
    If hWnd = 0 Then
        Exit Sub
    Else
        SendMessage hWnd, WM_USER + 18, 0, 0
    End If
End Sub


Grazie ad Anthony e a te Archimede per l'interessamento
am
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Excel/Access - Chiudere un file Excel da macro Access

Postdi Anthony47 » 16/09/08 14:48

Non ne sono particolarmente orgoglioso, ma pubblico quello che sono riuscito a fare:
Codice: Seleziona tutto
Sub testB()
'
Dim XlOpen As Boolean
Dim oXls As Object
XlFile = "C:\Documents and Settings\Nome_Utente\Documenti\A_CONVERTER.xls"    '<<< TARGET File
On Error Resume Next
Set oXls = GetObject(XlFile)
If Err.Number = 0 Then XlOpen = True
Err.Clear
If XlOpen = True Then oXls.Close savechanges:=False    'Close versione ignota
Set oXls = GetObject(XlFile)                                          'Open ultima versione
'Set oXls = Nothing        'Chiudi e Disconnetti
End Sub

In un modo non so quanto lineare, la macro chiude il Target File (se non fosse aperto lo apre) e poi lo apre (garantendo cosi' che sia la versione piu' aggiornata), ma lo lascia nascosto; non sono riuscito a "scoprirlo" da codice, comunque interagisce con altri file excel.
Ho collaudato quanto sopra inserendola in una macro di word, non so se in access puo' essere usato impunemente, lo lascio scoprire ai piu' coraggiosi.

Ciao.
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Excel/Access - Chiudere un file Excel da macro Access

Postdi Flash30005 » 18/09/08 09:12

COMPLIMENTI!
Anthony, la macro funziona egregiamente anche in access.
Vedo che non ti arrendi mai!
Bravo!

Ho aggiunto solo
On Error GoTo 0 'occorre per evitare di saltare eventuali errori nelle successive righe del programma

dopo il codice
Set oXls = Nothing
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-


Torna a Applicazioni Office Windows


Topic correlati a "Excel/Access - Chiudere un file Excel da macro Access":


Chi c’è in linea

Visitano il forum: Nessuno e 40 ospiti