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

di nickbi78 il
12 risposte
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

  • 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)
  • 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.
  • 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
  • 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.
  • 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
  • @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
  • Io scriverei così
    
        With Me.RecordsetClone
            .MoveFirst
            Do Until .EOF
               ' tuo codice
               .MoveNext
            Loop
            .Bookmark = Me.Bookmark
        End With
  • Grazie mille Alex,
    in serata provo
  • 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
  • Ma se scrivi

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

    e così via ...

    la cella è sempre la stessa ...
  • 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...
Devi accedere o registrarti per scrivere nel forum
12 risposte