Aggiornare tabelle Excel

di il
18 risposte

Aggiornare tabelle Excel


Premessa:
Tramite questa Sub apro ad aggiorno un file di Excel.
Il file in questione l'ho collegato al mio database di Access ed è stato esportato da un'altra fonte dati.

Problema
A volte non mi si aggiorna per due motivi:

18 Risposte

  • Re: Aggiornare tabelle Excel

    Prova a leggere questo
    https://stackoverflow.com/questions/9373082/detect-whether-excel-workbook-is-already-open
  • Re: Aggiornare tabelle Excel

    Shaul ha scritto:


    
        Dim AppExcel As Excel.Application ' Variabile che farà riferimento ad excel
        Dim BookExcel As Excel.Workbook   ' Variabile che farà riferimento al workbook
        Dim SheetExcel As Excel.Worksheet ' Variabile che lo farà al worksheet
        
        Set AppExcel = CreateObject("Excel.Application") ' Creo l'oggetto excel alla variabile
    
    Oltre a quanto suggerito da @Alex per vedere se qualcun altro sta usando il file (verifica che presumibilmente va fatta prima di tutto il resto) suggerisco di modificare l'uso di Excel tramite Automazione.
    Scritto così mescoli l'earlybinding con il latebinding e questo può essere causa di problemi. O l'uno o l'altro. Quindi o tutto As Object e poi CreateObject oppure tieni gli oggetti come li hai dichiarati adesso ma invece di CreateObject devi usare New Excel.Application. (chi ne se intende dice che in sviluppo si usa l'earlybinding, in distribuzione il latebinding).

    Forse questo già potrebbe risolvere il problema di dover attendere il completamento dell'azione di aggiornamento, cosa sulla quale, in caso di necessità, è bene che tu fornisca informazioni più dettagliate (cosa aggiorna, come, da dove ecc)
    Una breve ricerca su internet ha riportato molte situazioni con problemi simili al tuo.
    Ad intuito avrei provato con un DoEvents al posto di Sleep ma che sia adatto alla tua situazione lo puoi dire solo tu.
  • Re: Aggiornare tabelle Excel

    Il codice seguente indicatomi da Alex è perfetto per determinare se il file è aperto.
    Function IsWorkBookOpen(FileName As String)
        Dim ff As Long, ErrNo As Long
    
        On Error Resume Next
        ff = FreeFile()
        Open FileName For Input Lock Read As #ff
        Close ff
        ErrNo = Err
        On Error GoTo 0
    
        Select Case ErrNo
        Case 0:    IsWorkBookOpen = False
        Case 70:   IsWorkBookOpen = True
        Case Else: Error ErrNo
        End Select
    End Function
    Phil, ho sostituito il codice:
    Set AppExcel = CreateObject("Excel.Application")
    ...con il seguente:
    Set AppExcel = New Excel.Application
    ...ed ho sostituito il banalissimo "Sleep" con DoEvents nello stesso posto.

    Il tutto sembra funzionare.
    Faccio ancora un po' di test.
    Intanto grazie!!!
  • Re: Aggiornare tabelle Excel

    Avrei evitato la tecnica di associazione della libreria(EarlyBinding) a favore dell'associazione Tardiva(Latebinding)... ma se lo sviluppo gira solo sul tuo pc e non devi distribuire va benissimo.
  • Re: Aggiornare tabelle Excel

    Sono incappato in tutti i problemi da voi preventivati.
    Sto usando il database Access su più pc con versioni diverse di Office e ovviamente adesso non funziona più su alcuni pc.
    Ho recuperato anche questo post ** di Alex, ma non riesco a capire cosa devo modificare.
    Dalle indicazioni di Phil mi sembrava di aver capito che fosse meglio non usare il CreateObject, ma dal post di Alex sembra il contrario.
    Sono certo di essermi perso qualche passaggio, ma non trovo dove.
    Adesso il mio codice è il seguente:
    Public Sub AggiornaFileExcel(sPath, sFile As String, iPause As Single)
    
        Dim sPathFile As String
        sPathFile = sPath & sFile
        
        Dim AppExcel As Excel.Application ' Variabile che farà riferimento excel
        Dim BookExcel As Excel.Workbook   ' Variabile che farà riferimento al workbook
        Dim SheetExcel As Excel.Worksheet ' Variabile che farà riferimento al worksheet
        
        Set AppExcel = New Excel.Application 'Era CreateObject("Excel.Application")    ' Creo l'oggetto excel alla variabile
        Set BookExcel = AppExcel.Workbooks.Open(sPathFile) ' Setto la variabile del workbook al file che devi aprire e sul quale operare
        Set SheetExcel = BookExcel.Worksheets("Foglio1") ' Imposto su quale foglio di lavoro operare
        
        AppExcel.Visible = False ' Apro il foglio in Background
        
        BookExcel.RefreshAll ' Aggiorno i dati
        'Call Sleep(iPause) ' E' necessario dare il tempo al file di Excel di effettuare l'aggiornamento
        DoEvents
        BookExcel.Close SaveChanges:=True ' Chiudo il file salvandolo
        
        AppExcel.Quit ' Chiudo l'applicazione
    
        ' Svuoto le veriabili che fanno riferimento a applicazione, book e sheet
        Set SheetExcel = Nothing
        Set BookExcel = Nothing
        Set AppExcel = Nothing
        
    End Sub
    Per contestualizzare la situazione, i file in Excel che ho bisogno di aggiornare, sono delle esportazioni di alcune query da un Gestionale (Arca).
    Aprendo il file Excel e facendo Aggiorna, i dati vengono ripescati dalla fonte.
    Io vorrei automatizzare l'aggiornamento da Access.
  • Re: Aggiornare tabelle Excel

    Devi rimuovere dal codice la definizione di tipo...
    
    Dim ObjXls Ad Excel.Application
    Non potrai farla in quanto devi rimuovere dai riferimenti Excel.
    Quindi le tipologie tipiche di Excel non saranno disponibili e dovrai quindi dichiarare gli oggetti come Object.
    A quel punto DEVI usare CreateObject.
    Chiaramente anche le costanti tipo che di Excel non vanno... suggerisco di dichiararle in modo esplicito e non usare il valore...

    Dai fai qualche prova e ripubblica il codice modificato..
  • Re: Aggiornare tabelle Excel

    L'ho modificata nel seguente modo:
    Public Sub AggiornaFileExcel(sPath, sFile As String, iPause As Single)
    
        Dim sPathFile As String
        sPathFile = sPath & sFile
        
        Dim AppExcel As Object ' Dichiaro l'oggetto
        
        Set AppExcel = CreateObject("Excel.Application") ' Creo l'oggetto excel alla variabile
        AppExcel.Workbooks.Open sPathFile ' Apro il file
        ActiveWorkbook.Worksheets("Foglio1").Activate ' Imposto su quale foglio di lavoro operare
        
        AppExcel.Visible = False ' Apro il foglio in Background
        
        ActiveWorkbook.RefreshAll
        DoEvents
        ActiveWorkbook.Close Savechanges:=True ' Chiudo il file salvandolo
    
        AppExcel.Quit ' Chiudo l'applicazione
    
        ' Svuoto le veriabili che fanno riferimento all'applicazione
        Set AppExcel = Nothing
        
    End Sub
    
    Ma la cosa strana è che la prima volta che chiamo la Sub funziona, la seconda si blocca.
    Ho l'impressione che usando l'ActiveWorkbook la seconda volta faccia di nuovo riferimento al primo giro.
    C'è un modo per impostarlo di nuovo o di usare i comandi specifici senza usare l'ActiveWorkbook?
    Non riesco a trovare la giusta sintassi.
  • Re: Aggiornare tabelle Excel

    L'oggetto ActiveWorkbook non esiste... devi dichiararlo come variabile oggetto ed assegnarlo... altrimenti non ha senso.
    Tu lo fai senza accorgertene... ecco perché la prima volta funziona... ma non puoi usare ActiveWorkbook in Access ss non sai sue sia il WorkBook attivo.
    AppExcel.Workbooks.Open sPathFile
    
    Secondo te questa riga cosa fa e che cosa restituisce...?
    Magari puoi usarla proprio per assegnare ad una variabile Object L'oggetto WorkBook...?
  • Re: Aggiornare tabelle Excel

    Così?
    Public Sub AggiornaFileExcel(sPath, sFile As String, iPause As Single)
    
        Dim sPathFile As String
        sPathFile = sPath & sFile
        
        Dim AppExcel As Object ' Variabile che farà riferimento excel
        Dim BookExcel As Object ' Variabile che farà riferimento al workbook
        
        Set AppExcel = CreateObject("Excel.Application") ' Creo l'oggetto excel alla variabile
        Set BookExcel = AppExcel.Workbooks.Open(sPathFile)  ' Apro il file
        
        AppExcel.Visible = False ' Apro il foglio in Background
        
        BookExcel.RefreshAll ' Aggiorno il file Excel
        DoEvents
        BookExcel.Close Savechanges:=True ' Chiudo il file salvandolo
    
        AppExcel.Quit ' Chiudo l'applicazione
    
        Set AppExcel = Nothing ' Svuoto le veriabili che fanno riferimento all'applicazione
        
    End Sub
    Sembra funzionare.
  • Re: Aggiornare tabelle Excel

    Ma non mi dire...
  • Re: Aggiornare tabelle Excel

    Grazie Alex!
    Ultima domanda... per oggi, ma quel DoEvents "appoggiato lì" fa effettivamente quel che deve?
  • Re: Aggiornare tabelle Excel

    Shaul ha scritto:


    Grazie Alex!
    Ultima domanda... per oggi, ma quel DoEvents "appoggiato lì" fa effettivamente quel che deve?
    In realtà secondo me quel codice non fa nulla in generale...
    Apri il file lo tendi visibile fai un Refresh, di cosa non capisco... e chiudi salvando... cosa salvi...?
  • Re: Aggiornare tabelle Excel

    Ohhh... osservazione interessante davvero!
    Lo scopo di questa Sub è quella di Aggiornare il contenuto di un file Excel collegato ad un gestionale.
    Quindi, aprendo Access, aggiorno i dati alla fonte dati originale.
    Vuoi quindi dirmi che il comando
        BookExcel.RefreshAll 
    non aggiorna i dati contenuti nel file come farebbe il tasto "Aggiorna tutti" nel menu "Dati" di Excel?

    ...in effetti non fa una cippa lippa.
    Eppure quando è nato questo post, la Sub faceva esattamente questo!
  • Re: Aggiornare tabelle Excel

    Hai abilitato i calcoli automatici...?
Devi accedere o registrarti per scrivere nel forum
18 risposte