Access 2010 - transferspreadsheet genera (a volte) errore 3027

di il
21 risposte

Access 2010 - transferspreadsheet genera (a volte) errore 3027

Salve a tutti,

ho realizzato un applicativo con access 2010 e l'ho distribuito a degli utenti.

In questo applicativo preparo una tabella e quindi la esporto in un foglio excel con questo comando
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12, "Export", app
Ora, è un comando normalissimo, non ci sono oggetti di mezzo, librerie strane o altro.

Ebbene, sul mio PC funziona, sui PC di molti utenti funziona, su quelli di altri non funziona e da quell'errore ovvero:

Run time error 3027:
Cannot update. Database or object is read-only

Finora ricerche in rete non hanno dato successo. L'errore non ha assolutamente senso abbinato a quel comando.
Ho provato a fare una verifica su uno di questi PC.
Non ci sono librerie MISSING nei riferimenti sotto menu strumenti del codice VBA.
Ho notato una piccola differenza col mio PC, io uso le librerie 14.0, l'altro PC le 16.0 ma non credo che sia lì il problema.

Non mi viene in mente nessuna soluzione plausibile

Qualche idea?
Grazie

Antonio

21 Risposte

  • Re: Access 2010 - transferspreadsheet genera (a volte) errore 3027

    Potrebbe non essere un problema di TransferSpreadsheet. Hai provato a leggere qui?
    https://answers.microsoft.com/en-us/msoffice/forum/msoffice_access-mso_winother/access-2010-runtime-error-3027/acc42082-e1e2-4971-9bfc-94a3c6ed305e?auth=1
  • Re: Access 2010 - transferspreadsheet genera (a volte) errore 3027

    chief ha scritto:


    ...
    DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12, "Export", app
    Run time error 3027:
    Cannot update. Database or object is read-only
    ...
    Qualche idea?
    Pure troppe, di idee.
    Il quarto paramentro di DoCmd.TransferSpreadSheet è FileName. Che valore contiene app (che immagino sia una variabile) nei computer dove dà errore?
    Il problema si presenta sempre su alcuni computer specifici? In quelli non funziona mai o a volte funziona?
    Gli altri computer hanno tutti Access o c'è il runtime? (domanda credo superflua, visto che se riesci a vedere i riferimenti non può che trattarsi di Access "completo")
    Aprono tutti lo stesso file (mdb o accdb) o hai distribuito file diversi per ogni "client"? Hai diviso tutto in FrontEnd e BackEnd?
    Ci sono restrizioni per particolari utenti a livello di sistema operativo/dominio sui percorsi in cui si trovano i file? (che fa parte di quanto indicato nel link suggerito da Osvaldo)
  • Re: Access 2010 - transferspreadsheet genera (a volte) errore 3027

    Philcattivocarattere ha scritto:


    chief ha scritto:


    ...
    DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12, "Export", app
    Run time error 3027:
    Cannot update. Database or object is read-only
    ...
    Qualche idea?
    Pure troppe, di idee.
    Il quarto paramentro di DoCmd.TransferSpreadSheet è FileName. Che valore contiene app (che immagino sia una variabile) nei computer dove dà errore?
    Il problema si presenta sempre su alcuni computer specifici? In quelli non funziona mai o a volte funziona?
    Gli altri computer hanno tutti Access o c'è il runtime? (domanda credo superflua, visto che se riesci a vedere i riferimenti non può che trattarsi di Access "completo")
    Aprono tutti lo stesso file (mdb o accdb) o hai distribuito file diversi per ogni "client"? Hai diviso tutto in FrontEnd e BackEnd?
    Ci sono restrizioni per particolari utenti a livello di sistema operativo/dominio sui percorsi in cui si trovano i file? (che fa parte di quanto indicato nel link suggerito da Osvaldo)
    Ciao, grazie per la risposta.
    Allora:

    1) app è composta dal path dove si trova l'applicativo più una stringa ricavata principalmente prendendo data e ora di sistema
    2) il problema si presenta solo su alcuni PC specifici e su questi sempre. Su altri PC compreso il mio funziona tutto perfettamente
    3) L'appplicativo è uno solo distribuito a tutti, si tratta di un accde unico senza FE e BE. Ho effettuato però un test su un PC incriminato anche con la copia master dell'applicativo ovvero l'accdb e l'errore esce fuori lo stesso
    4) ho chiesto ad uno degli utenti col problema di verificarmi i diritti sul folder destinazione e sto aspettando risposta. Dubito però che sia quello il problema in quanto funziona sui PC di alcuni dipendenti e non ha funzionato sul PC del responsabile IT che avrà sicuramente diritto di vita e di morte su tutto

    Le mie risposte ti suggeriscono qualcosa?
    Grazie

    Antonio
  • Re: Access 2010 - transferspreadsheet genera (a volte) errore 3027

    chief ha scritto:


    ...
    2) il problema si presenta solo su alcuni PC specifici e su questi sempre.
    Domanda banale: hanno qualcosa in comune questi computer che li rende diversi da quelli in cui tutto funziona? La versione di Access forse?
    Quali librerie ci sono nei riferimenti nella copia master?

    chief ha scritto:


    3) L'appplicativo è uno solo distribuito a tutti, si tratta di un accde unico senza FE e BE. Ho effettuato però un test su un PC incriminato anche con la copia master dell'applicativo ovvero l'accdb e l'errore esce fuori lo stesso
    E magari più di un utente apre lo stesso file? aiuto!!!! Se qualcun altro lo sta usando? (Però è improbabile che siano sempre gli stessi ad avere i problemi e mai gli altri)

    chief ha scritto:


    4) ho chiesto ad uno degli utenti col problema di verificarmi i diritti sul folder destinazione e sto aspettando risposta. Dubito però che sia quello il problema in quanto funziona sui PC di alcuni dipendenti e non ha funzionato sul PC del responsabile IT che avrà sicuramente diritto di vita e di morte su tutto
    Non è detto! Come avrai visto nel link indicato da Osvaldo una soluzione è la necessità di "controllo completo" e non solo di autorizzazione a scrittura e lettura. Questa rimane una delle spiegazioni più plausibili.
  • Re: Access 2010 - transferspreadsheet genera (a volte) errore 3027

    Philcattivocarattere ha scritto:


    chief ha scritto:


    ...
    2) il problema si presenta solo su alcuni PC specifici e su questi sempre.
    Domanda banale: hanno qualcosa in comune questi computer che li rende diversi da quelli in cui tutto funziona? La versione di Access forse?
    Quali librerie ci sono nei riferimenti nella copia master?

    La versione di access è la stessa, in teoria installata su ogni pc aziendale nello stesso modo
    Le librerie sono le stesse che trovo da me, con l'unica differenza che io uso le versioni 14.0, mentre uno di quelli a cui non funziona ha le 16.0.
    Sto cercando di farmi dire da altri che situazione hanno.
    Comunque in dettaglio sono:

    Visual basic for application
    Microsoft Access 14.0 Object Library
    Ole Automation
    Microsoft Access 14.0 database engine Object Library
    Microsoft Excel 14.0 Object Library

    chief ha scritto:


    3) L'appplicativo è uno solo distribuito a tutti, si tratta di un accde unico senza FE e BE. Ho effettuato però un test su un PC incriminato anche con la copia master dell'applicativo ovvero l'accdb e l'errore esce fuori lo stesso
    E magari più di un utente apre lo stesso file? aiuto!!!! Se qualcun altro lo sta usando? (Però è improbabile che siano sempre gli stessi ad avere i problemi e mai gli altri)

    No no aspetta, non è così. Il tool è stato messo a disposizione su un area condivisa dove ogni utente lo ha prelevato e usa la sua copia, comunque dello stesso tool

    chief ha scritto:


    4) ho chiesto ad uno degli utenti col problema di verificarmi i diritti sul folder destinazione e sto aspettando risposta. Dubito però che sia quello il problema in quanto funziona sui PC di alcuni dipendenti e non ha funzionato sul PC del responsabile IT che avrà sicuramente diritto di vita e di morte su tutto
    Non è detto! Come avrai visto nel link indicato da Osvaldo una soluzione è la necessità di "controllo completo" e non solo di autorizzazione a scrittura e lettura. Questa rimane una delle spiegazioni più plausibili.
    Beh, se il capo IT non ha diritti full control su qualcosa, sarebbe grave
    comunque per questo aspetto una sua risposta

    Antonio
  • Re: Access 2010 - transferspreadsheet genera (a volte) errore 3027

    Occhio che nel post precedente hai messo anche le tue risposte dentro il quote. (porta pazienza per la nota di stile che si aggancia al discorso quote, che avrebbe permesso di distinguere la tua risposta dalle parti veramente quotate: fatico a leggere il rosso, se vuoi evidenziare qualcosa usa il grassetto o il sottolineato. Finché è una parola o due non ci sono problemi, ma frasi intere colorate mi mettono in difficoltà. Grazie e scusa ancora per questa piccola osservazione)

    chief ha scritto:


    ogni utente lo ha prelevato e usa la sua copia, comunque dello stesso tool
    Capitolo chiuso.

    chief ha scritto:


    La versione di access è la stessa, in teoria installata su ogni pc aziendale nello stesso modo
    Le librerie sono le stesse che trovo da me, con l'unica differenza che io uso le versioni 14.0, mentre uno di quelli a cui non funziona ha le 16.0.
    Ma non è l'unico in cui non funziona. Quindi è importante ma non determinante.

    chief ha scritto:


    Sto cercando di farmi dire da altri che situazione hanno.
    Comunque in dettaglio sono:
    Visual basic for application
    Microsoft Access 14.0 Object Library
    Ole Automation
    Microsoft Access 14.0 database engine Object Library
    Microsoft Excel 14.0 Object Library
    Se è presente un 16.0 (di tutte le librerie?) significa che su quello c'è Access e/o Excel 2016. Quindi lì a meno che non ci siano entrambe le versioni di Excel (2010 e 2016) il riferimento a quella libreria sarà mancante. Toglilo e vai di latebinding. Le altre non si toccano.

    chief ha scritto:


    Beh, se il capo IT non ha diritti full control su qualcosa, sarebbe grave
    comunque per questo aspetto una sua risposta
    Resta una delle spiegazioni più plausibili (non riferita solo a lui, ovviamente) una volta risolto il problema dei riferimenti alle librerie.
  • Re: Access 2010 - transferspreadsheet genera (a volte) errore 3027

    MI piacerebbe capire perchè hai referenziato Excel..., serve, usi l'automazione di Excel...?
    Ovviamente non ha nulla a che fare con TransfertSpreadsheet che non accede al server OLE, ma fossi in te proverei ad OMETTERE la Versione o al limite prova con la acSpreadsheetTypeExcel9.
  • Re: Access 2010 - transferspreadsheet genera (a volte) errore 3027

    1) app è composta dal path dove si trova l'applicativo più una stringa ricavata principalmente prendendo data e ora di sistema
    Ovviamente data e ora di sistema NON contengono caratteri di formattazione (/,\,- : ,.) e
    magari sono anche formattati secondo un rigido schema (i.e. YYYYMMDDHHNNSS) ....
  • Re: Access 2010 - transferspreadsheet genera (a volte) errore 3027

    Philcattivocarattere ha scritto:


    chief ha scritto:


    Sto cercando di farmi dire da altri che situazione hanno.
    Comunque in dettaglio sono:
    Visual basic for application
    Microsoft Access 14.0 Object Library
    Ole Automation
    Microsoft Access 14.0 database engine Object Library
    Microsoft Excel 14.0 Object Library
    Se è presente un 16.0 (di tutte le librerie?) significa che su quello c'è Access e/o Excel 2016. Quindi lì a meno che non ci siano entrambe le versioni di Excel (2010 e 2016) il riferimento a quella libreria sarà mancante. Toglilo e vai di latebinding. Le altre non si toccano.
    Ciao
    Ok per il quoting, è stato solo per rispondere rapidamente su un quoting abbastanza strutturato
    Per la questione diritti, fatta la verifica, c'è il full control

    Su questa questione della versione della libreria, non ti capisco.
    Sul mio PC c'è la 14 con office 2010.
    Non ho ancora verifiche su altri PC dove funziona

    Su uno dei PC dove non funziona, ho verificato che le librerie ci sono tutte ma in versione 16 (le 3 che ho io col 14)
    E non c'è MANCA o MISSING

    Quindi perchè dovrei toglierla se risulta correttamente attiva?

    Grazie

    Antonio
  • Re: Access 2010 - transferspreadsheet genera (a volte) errore 3027

    @Alex ha scritto:


    MI piacerebbe capire perchè hai referenziato Excel..., serve, usi l'automazione di Excel...?
    Ovviamente non ha nulla a che fare con TransfertSpreadsheet che non accede al server OLE, ma fossi in te proverei ad OMETTERE la Versione o al limite prova con la acSpreadsheetTypeExcel9.
    Dopo la creazione del file excel lo devo formattare in una certa maniera e quindi uso del codice che interviene sulle celle
    Posso provare ad omettere la versione, ma perchè un tipo di formato dovrebbe essere discriminante?
    E perchè solo su alcuni PC?

    Grazie

    Antonio
  • Re: Access 2010 - transferspreadsheet genera (a volte) errore 3027

    max.riservo ha scritto:


    1) app è composta dal path dove si trova l'applicativo più una stringa ricavata principalmente prendendo data e ora di sistema
    Ovviamente data e ora di sistema NON contengono caratteri di formattazione (/,\,- : ,.) e
    magari sono anche formattati secondo un rigido schema (i.e. YYYYMMDDHHNNSS) ....
    E' un formato compatibile con un nome di file, tant'è che ci sono tanti utenti per cui il file viene creato regolarmente

    Grazie

    Antonio
  • Re: Access 2010 - transferspreadsheet genera (a volte) errore 3027

    chief ha scritto:


    Per la questione diritti, fatta la verifica, c'è il full control
    Altro capitolo chiuso, allora (anche se era il più plausibile, eventualmente lo ripeschiamo).

    chief ha scritto:


    Su questa questione della versione della libreria, non ti capisco.
    Sul mio PC c'è la 14 con office 2010.
    Come precisato da @Alex, per il TransferSpreadsheet non serve il riferimento alla libreria di Excel.
    Ecco che quindi hai detto, sostanzialmente, che usi Excel con Automazione per intervenire sul file.
    Concentriamoci sul riferimento alla libreria di Excel che nel tuo db è alla versione 14.0 (2010). Hai dovuto inserirlo perché sicuramenti hai usato l'earlybinding.
    Salvo che tu non abbia un supercodice che modifica i riferimenti all'avvio del programma, per quanto ne so io VBA non riesce a trovare il riferimento giusto alla libreria di Excel (e non solo) in presenza di una versione diversa, con il classico "Missing-Manca". Ecco perché avevo tirato in ballo il latebinding che si usa per la "portabilità" del codice.
    La visualizzazione dei riferimenti, tra l'altro, è inibita nei file accde, quindi non so come tu abbia fatto a vedere quelli con la versione 16 (2016). Forse anche questo con codice? (ammesso che sia possibile, non lo so)
    Forse l'hai fatto usando la "copia master" (quindi già lo scenario è diverso) ma resto ancora perplesso sul fatto che compaia il riferimento corretto alla libreria di Excel, 16.0, e non venga marcata come mancante, perché quello sarebbe il comportamento tipico.
    Il "mancante" spiegherebbe molte cose, come ad esempio il fatto che un'operazione che nulla ha a che vedere con l'uso di Excel (lascia perdere il fatto che TransferSpreadsheet crei un xls(x), lo fa anche con Mid, Left, Right ecc) vada in tilt.
    Potresti postare un po' più di codice, specie nella parte in cui valorizzi app e dintorni?
    Altra cosa: verificato che tutto sia a posto con le TrustedLocation e simili? Questo cambia per ogni postazione.
  • Re: Access 2010 - transferspreadsheet genera (a volte) errore 3027

    L'errore 3027 indica che il database o l'oggetto (nel caso il foglio di Excel) è disponibile solo in lettura e non in scrittura.
    E' necessario controllare i permessi di accesso ai file e directory dei vari utenti al folder interessato sulla rete dove è da esportare il foglio.
    https://msdn.microsoft.com/en-us/vba/access-vba/articles/cannot-update-database-or-object-is-read-onlyerror-3027
    https://msdn.microsoft.com/en-us/library/bb223465.asp
  • Re: Access 2010 - transferspreadsheet genera (a volte) errore 3027

    Philcattivocarattere ha scritto:


    chief ha scritto:


    Su questa questione della versione della libreria, non ti capisco.
    Sul mio PC c'è la 14 con office 2010.
    Come precisato da @Alex, per il TransferSpreadsheet non serve il riferimento alla libreria di Excel.
    Ecco che quindi hai detto, sostanzialmente, che usi Excel con Automazione per intervenire sul file.
    Concentriamoci sul riferimento alla libreria di Excel che nel tuo db è alla versione 14.0 (2010). Hai dovuto inserirlo perché sicuramenti hai usato l'earlybinding.
    Salvo che tu non abbia un supercodice che modifica i riferimenti all'avvio del programma, per quanto ne so io VBA non riesce a trovare il riferimento giusto alla libreria di Excel (e non solo) in presenza di una versione diversa, con il classico "Missing-Manca". Ecco perché avevo tirato in ballo il latebinding che si usa per la "portabilità" del codice.
    La visualizzazione dei riferimenti, tra l'altro, è inibita nei file accde, quindi non so come tu abbia fatto a vedere quelli con la versione 16 (2016). Forse anche questo con codice? (ammesso che sia possibile, non lo so)
    Forse l'hai fatto usando la "copia master" (quindi già lo scenario è diverso) ma resto ancora perplesso sul fatto che compaia il riferimento corretto alla libreria di Excel, 16.0, e non venga marcata come mancante, perché quello sarebbe il comportamento tipico.
    Il "mancante" spiegherebbe molte cose, come ad esempio il fatto che un'operazione che nulla ha a che vedere con l'uso di Excel (lascia perdere il fatto che TransferSpreadsheet crei un xls(x), lo fa anche con Mid, Left, Right ecc) vada in tilt.
    Potresti postare un po' più di codice, specie nella parte in cui valorizzi app e dintorni?
    Altra cosa: verificato che tutto sia a posto con le TrustedLocation e simili? Questo cambia per ogni postazione.

    Ciao e grazie per la pazienza.

    Allora, in effetti avevo usato l'earlybinding per la modifica del foglio excel dichiarando le variabili come excel application.
    Quando mi è comparso questo errore, ho scoperto di questo possibile problema e ho cambiato le dichiarazioni usando gli object.
    Il problema però persiste.
    Per fare la verifica dei riferimenti, sì certo, ho dovuto usare la copia master dell'accdb e ti dico, non c'erano MISSING, 5 librerie io, 5 lui, lui col 16.0
    Per la cronaca il tool mi crea file XLSB

    Per quanto riguarda il codice, ora te lo posto, con la precisazione che il problema avviene alla creazione del file, quindi al punto della questione earlybinding (che ora non c'è più, non c'arriva proprio
    Grazie
    Dim app As String, app1 As String
        Dim rst As Recordset
        Dim i As Integer
        
        DoCmd.SetWarnings False
        DoCmd.RunSQL "DELETE export.* FROM export;"
        DoCmd.OpenQuery "Export Results"
        
        Set rst = CurrentDb.OpenRecordset("Group Store")
        rst.MoveFirst
        For i = 1 To rst.RecordCount
            app1 = app1 & rst.Fields(0)
            If i < rst.RecordCount Then
                app1 = app1 & "-"
                rst.MoveNext
            End If
        Next i
        Set rst = Nothing
        
        app = Left(CurrentDb.Name, Len(CurrentDb.Name) - 24)
        app = app & "Export " & app1 & " " & Replace(Date, "/", "-") & " " & Replace(Time, ":", "_")
        
        DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12, "Export", app
        modifica_xls (app)
        
        DoCmd.SetWarnings True
        MsgBox "Data successfully exported"
    Public Sub modifica_xls(x As String)
    
        Dim xlApp As Object
        Dim xlBook As Object
        Dim xlSheet As Object
        Set xlApp = CreateObject("Excel.Application")
        Set xlBook = xlApp.Workbooks.Open(x & ".xlsb")
        'Set xlBook = GetObject(x & ".xlsb")
        Set xlSheet = xlBook.Worksheets(1)
        
        With xlSheet
            .Range("B2").Select
            .Application.ActiveWindow.FreezePanes = True
            .Range("A1").Cells.Interior.Pattern = xlSolid
            .Range("A1").Cells.Interior.PatternColorIndex = xlAutomatic
            .Range("A1").Cells.Interior.Color = 32768
            .Range("A1").Cells.Interior.ThemeColor = xlThemeColorDark1
            .Range("A1").Cells.Font.Bold = True
            .Range("B1:K1").Cells.Interior.Pattern = xlSolid
            .Range("B1:K1").Cells.Interior.PatternColorIndex = xlAutomatic
            .Range("B1:K1").Cells.Interior.Color = 6697728
            .Range("B1:K1").Cells.Interior.ThemeColor = xlThemeColorDark1
            .Range("B1:K1").Cells.Font.Bold = True
            .Range("A1").Cells.Interior.Color = 32768
            .Range("B1:K1").Cells.Interior.Color = 13395456 '6697728
            .Range("A1:K1").Cells.Font.Color = 16777215
            .Rows("1:1").EntireRow.AutoFit
            .Columns("A:L").EntireColumn.AutoFit
            .Rows(1).Select
            .Rows(1).HorizontalAlignment = xlCenter
            .Rows(1).VerticalAlignment = xlCenter
        End With
    Fine:
        'xlSheet.Save
        xlBook.Save
        xlBook.Close
        Set xlApp = Nothing
        Set xlBook = Nothing
        Set xlSheet = Nothing
        
    End Sub
Devi accedere o registrarti per scrivere nel forum
21 risposte