Metodo "open" dell'oggetto 'workbooks' non riuscito

di il
12 risposte

Metodo "open" dell'oggetto 'workbooks' non riuscito

Ciao a tutti,
in un db access 2007, a fronte del salvataggio di un file XLS, ho il codice vba riportato qui di seguito.
Funziona perfettamente su tutti i pc tranne su uno che mi restituisce l'errore in oggetto sulla riga Set objWorkbook1 = objExcel.Workbooks.Open(sPath & "tuofile.xlsx")
Ho provato a disinstrallare tyutto il pacchetto, reinstallare, pulire il registro ma non c'è verso di farlo funzionare...
il percorso/file esiste

cosa c'è che non va?
--------------------

sPath = "C:\miopercorso\"
'creo l'oggetto Excel
Set objExcel = CreateObject("Excel.Application")
'apro e metto un riferimento ai workbook tuoFile.xls
Set objWorkbook1 = objExcel.Workbooks.Open(sPath & "tuofile.xlsx")
'metto un riferimento al Foglio1 del workbook tuoFile.xls
Set objWorksheet1 = objWorkbook1.WorkSheets("Foglio1")
'rendo visibile Excel(se serve)
objExcel.Visible = True
With objWorksheet1
'.Unprotect password:="Pippo"
objWorksheet1.Cells(1, 2) = Me.Intestazione
objWorksheet1.Cells(4, 4) = "Ordine del " & Format$(Now(), "dd/mm/yyyy hh:mm:ss") & " --- Destinazione: " & Me.Testo99
objWorksheet1.Cells(1, 6) = "Cliente: " & Me.CLIENTE
objWorksheet1.Cells(2, 6) = "Indirizzo: " & Me.Testo25
objWorksheet1.Cells(3, 6) = "Città: " & Me.Testo27
For i = 1 To Me.RecordsetClone.RecordCount
xxx = Me.Percorso
objWorksheet1.Rows(i + 5).RowHeight = 100
.Range(.Cells(5 + i, 1), .Cells(5 + i, 16)).Borders.LineStyle = 7
'objExcel.ScreenUpdating = False
.Pictures.insert(xxx).Select
.shapes(i).Top = .Range("B" & 5 + i).Top
.shapes(i).Left = .Range("B" & 1 + i).Left
.shapes(i).Width = 100
.shapes(i).Height = 100
.shapes(i).Locked = True
objWorksheet1.Cells(5 + i, 1) = i
objWorksheet1.Cells(5 + i, 3) = Me.ARTICOLO
objWorksheet1.Cells(5 + i, 4) = Me.CODART
objWorksheet1.Cells(5 + i, 5) = "=myean13(Left(" & Me.CODART & ", Len(" & Me.CODART & ") - 1))"
objWorksheet1.Cells(5 + i, 6) = Me.DESCRIZION
objWorksheet1.Cells(5 + i, 7) = Me.colli
objWorksheet1.Cells(5 + i, = Me.IMBALLO
objWorksheet1.Cells(5 + i, 9) = Me.IMBALLO * Me.colli
objWorksheet1.Cells(5 + i, 10) = Me.PREZZO
objWorksheet1.Cells(5 + i, 11) = Me.sr1
objWorksheet1.Cells(5 + i, 12) = Me.sr2
objWorksheet1.Cells(5 + i, 13) = Me.sr3
objWorksheet1.Cells(5 + i, 14) = Me.DISPONIBIL
objWorksheet1.Cells(5 + i, 15) = Me.PrimoArr
objWorksheet1.Cells(5 + i, 16) = Me.ORDINABILI
.Range(.Cells(5 + i, 1), .Cells(5 + i, 16)).Locked = True
If i = Me.RecordsetClone.RecordCount Then
Else
DoCmd.GoToRecord , , acNext
DoEvents
End If
Next i

End With
'salvo le modifiche
objWorkbook1.Saveas Me.NOMEFILE & "_catalogo.xlsm"
'chiudo il workbook
objWorkbook1.Close
RigaChiusura:
'chiudo Excel
objExcel.Quit
'Set a Nothing dei vari oggetti
Set objWorksheet1 = Nothing
Set objWorkbook1 = Nothing
Set objExcel = Nothing
---------------------

grazie!

Nico

12 Risposte

  • Re: Metodo "open" dell'oggetto 'workbooks' non riuscito

    nickbi78 ha scritto:


    il percorso/file esiste
    Guarda che se però il problema è qui... grrrrr

    nickbi78 ha scritto:


    ...
    Funziona perfettamente su tutti i pc tranne su uno che mi restituisce l'errore in oggetto sulla riga Set objWorkbook1 = objExcel.Workbooks.Open(sPath & "tuofile.xlsx")
    ...
    Hai pubblicato (senza usare i tag code è ancora più difficile orientarsi nel codice) solo una porzione del codice e il problema potrebbe essere altrove.
    Prima cosa da verificare: gli altri computer hanno una versione di office - access - excel diversa? Hai i riferimenti alle librerie di Office e/o Excel? Perché qui si vede l'assegnazione degli oggetti con la tecnica tipica del latebinding ma non vediamo quelle variabili come sono state dichiarate e lì magari sono in earlybinding (e si torna così al discorso riferimenti alle librerie)
  • Re: Metodo "open" dell'oggetto 'workbooks' non riuscito

    Per l'errore del metodo Open ti ha risposto PHIL... e credo sia quello...
    Io tuttavia punto l'attenzione al modi in cui avanzi il recordset... che è estremamente errato ancorché funzionante.
    Il metodo movenext che usi tu agisce sull'oggetto Recordset di form obbligando oltre all'avanzamento a che all'aggiornamenti dell'interfaccia grafica... la form, ad ogni step.
    Il motivo per cui esiste l'oggetto RecordsetClone è proprio evitare queste cose... quindi si usa il movenext sull'oggetto RecordsetClone finché non è EOF.
  • Re: Metodo "open" dell'oggetto 'workbooks' non riuscito

    Diciamo che il codice è solo questo, scatenato all'evento click di un pulsante
    provo a dichiarare le variabili (alcune volte dimentico di dichiarar ele variabili e le uso "al volo") ma mi fa strano che gira senza problemi su più di 20 macchine e su una no con sistemi w7 e w10 con office 2007 e 2010...
    stavo valutando l'idea di formattare ma se posso evitare è meglio...

    A proposito delle macchine con office 2010, ho un'altra domanda a proposito (non so se devo chiedere qui o sul forum excel:

    come mai questo codice con excel 2010 non incoropora le foto come invece fa con excel 2007?

    Nico
  • Re: Metodo "open" dell'oggetto 'workbooks' non riuscito

    nickbi78 ha scritto:


    ...
    provo a dichiarare le variabili (alcune volte dimentico di dichiarar ele variabili e le uso "al volo")
    Metti Option Explicit, sempre. Dichiara sempre le variabili, si evitano tanti di quegli strafalcioni che non immagini (esperienza personale, nel senso che li scrivevo io gli strafalcioni)

    nickbi78 ha scritto:


    ma mi fa strano che gira senza problemi su più di 20 macchine e su una no con sistemi w7 e w10 con office 2007 e 2010...
    stavo valutando l'idea di formattare ma se posso evitare è meglio...
    Guarda nella macchina dove non funziona se ci sono riferimenti mancanti in VBE. Anche se non li usi toglili.
    A proposito delle macchine con office 2010, ho un'altra domanda a proposito (non so se devo chiedere qui o sul forum excel:
    come mai questo codice con excel 2010 non incoropora le foto come invece fa con excel 2007?
    Di certo 1 thread = 1 domanda. Nuova domanda, nuovo thread.
  • Re: Metodo "open" dell'oggetto 'workbooks' non riuscito

    Philcattivocarattere ha scritto:


    nickbi78 ha scritto:


    ...
    provo a dichiarare le variabili (alcune volte dimentico di dichiarar ele variabili e le uso "al volo")
    Metti Option Explicit, sempre. Dichiara sempre le variabili, si evitano tanti di quegli strafalcioni che non immagini (esperienza personale, nel senso che li scrivevo io gli strafalcioni)
    Niente, ho provato a dichiarare le variabili ma alla fine sono stato costretto a farmattare la macchina, reinstallare, configurare tutto e ha funzionato al primo colpo...
    misteri dell'informatica...

    Nico
  • Re: Metodo "open" dell'oggetto 'workbooks' non riuscito

    @Alex ha scritto:


    Per l'errore del metodo Open ti ha risposto PHIL... e credo sia quello...
    Io tuttavia punto l'attenzione al modi in cui avanzi il recordset... che è estremamente errato ancorché funzionante.
    Il metodo movenext che usi tu agisce sull'oggetto Recordset di form obbligando oltre all'avanzamento a che all'aggiornamenti dell'interfaccia grafica... la form, ad ogni step.
    Il motivo per cui esiste l'oggetto RecordsetClone è proprio evitare queste cose... quindi si usa il movenext sull'oggetto RecordsetClone finché non è EOF.

    ho recuperato questo codice da poco e mi capita poco spesso di usare i recordset...

    Quindi invece di scorrere i record da 1 a n, infilo tutto il codice in

    while not eof
    ...
    ...
    movenext
    loop

    esatto?

    grazie

    Nico
  • Re: Metodo "open" dell'oggetto 'workbooks' non riuscito

    Io scriverei così
    
        With Me.RecordsetClone
            .MoveFirst
            Do Until .EOF
               ' tuo codice
               .MoveNext
            Loop
            .Bookmark = Me.Bookmark
        End With
  • Re: Metodo "open" dell'oggetto 'workbooks' non riuscito

    Grazie mille Alex,
    in serata provo
  • Re: Metodo "open" dell'oggetto 'workbooks' non riuscito

    Buongiorno,
    ho mdificato il codice come suggerito da Alex utilizzando i recordset (che riporto qui sotto), ci sto sbattendo la testa da più di un'ora ma succede che il file xls viene compilato solo con il primo record ripetuto per quanti effettivamente sono i record...
    cosa sto sbagliando?


    Dim objExcel As Object
    Dim objWorkbook1 As Object
    Dim objWorksheet1 As Object
    Dim sPath As String
    'definisco la Path del db
    sPath = Application.CurrentProject.Path & "\modelli\"
    'creo l'oggetto Excel
    Set objExcel = CreateObject("Excel.Application")
    'apro e metto un riferimento ai workbook tuoFile.xls
    Set objWorkbook1 = objExcel.Workbooks.Open(sPath & "modelloxls.xlsx")
    'metto un riferimento al Foglio1 del workbook tuoFile.xls
    Set objWorksheet1 = objWorkbook1.WorkSheets("Foglio1")
    'rendo visibile Excel(se serve)
    objExcel.Visible = True
    Dim i As Integer
    Dim xxx As String
    i = 0
    '''inizio nuovo codice
    With Me.RecordsetClone
    .MoveFirst
    Do Until .EOF
    '''fine nuovo codice

    With objWorksheet1
    .Unprotect Password:="Pippo"
    objWorksheet1.cells(1, 5) = Me.nomecli
    objWorksheet1.cells(2, 5) = Me.Indirizzo
    objWorksheet1.cells(3, 5) = Me.Citta
    objWorksheet1.cells(4, 5) = Me.destinaz
    xxx = Me.percorso
    i = i + 1
    objWorksheet1.Rows(i + 5).RowHeight = 100
    .Range(.cells(5 + i, 1), .cells(5 + i, ).Borders.LineStyle = 7
    '.objExcel.ScreenUpdating = False
    .Pictures.INSERT(xxx).SELECT
    .shapes(i).Top = .Range("A" & 5 + i).Top
    .shapes(i).Left = .Range("A" & 1 + i).Left
    .shapes(i).Width = 100
    .shapes(i).Height = 100
    .shapes(i).Locked = True
    objWorksheet1.cells(5 + i, 2) = Me.Articolo
    objWorksheet1.cells(5 + i, 3) = Me.Descrizione
    objWorksheet1.cells(5 + i, 4) = Me.Prezzo
    objWorksheet1.cells(5 + i, 5) = Me.Imballo
    objWorksheet1.cells(5 + i, 6) = Me.Sc
    objWorksheet1.cells(5 + i, 7) = Me.Qta
    objWorksheet1.cells(5 + i, = Me.TotRiga
    '.Range(.Cells(5 + i, 1), .Cells(5 + i, ).Locked = True
    End With
    .MoveNext
    Loop
    .Bookmark = Me.Bookmark
    End With


    grazie

    Nico
  • Re: Metodo "open" dell'oggetto 'workbooks' non riuscito

    Ma se scrivi

    objWorksheet1.cells(1, 5) = Me.nomecli

    e così via ...

    la cella è sempre la stessa ...
  • Re: Metodo "open" dell'oggetto 'workbooks' non riuscito

    Ok per la parte intestazione, posso spostarla fuori dal ciclo, ma il problema è in fase di compilazione delle righe del file excel...
    se ho 10 record, mi riporta 10 righe sempre con il primo articolo...
  • Re: Metodo "open" dell'oggetto 'workbooks' non riuscito

    Non serve tutto quel papocchio... dal momento che sono sequenzuali... sia le colonne che le righe, prova a leggere questo metodo che risulta estremamente veloce e performante.
    https://docs.microsoft.com/en-us/office/vba/api/excel.range.copyfromrecordset
Devi accedere o registrarti per scrivere nel forum
12 risposte