Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

2147417848 - Errore di automazione (da Access a Excel)

644 views
Skip to first unread message

viviana

unread,
Jun 15, 2005, 5:11:44 AM6/15/05
to
Ciao,

Ho un problema che non riesco proprio a risolvere, nonostante stia
'googlando' da un paio di giorni, qualcuno può aiutarmi? Devo passare
dati dai campi di un form in Access alle celle di un foglio excel
(Faccio la stessa cosa senza problemi dallo stesso form di access ad un
documento di word).

L'errore è questo:
2147417848 - Errore di automazione
L'oggetto invocato si è disconnesso dai client corrispondenti.

...e il codice questo:

***********************************
Private Sub cmdCopiaE_Click()

Dim oApp As Object
Dim oWks As Object
Dim oWsh As Object

Dim blnOpen As Boolean
Dim quiPath As String

Dim strPrezzo1 As String
Dim strPrezzo2 As String
Dim strPrezzo3 As String

blnOpen = True
quiPath = myPath & "fgl1.xls"

On Error Resume Next
Set oApp = GetObject(, "Excel.Application")
If Err.Number = 429 Then
Set oApp = CreateObject("Excel.Application")
blnOpen = False
Err.Number = 0
End If

On Error GoTo gestErrori
With oApp
If Dir(quiPath) <> "" Then
Set oWks = oApp.workbooks.Open(quiPath)
.workbooks.Open quiPath
.Visible = False
Else
Set oWks = oApp.workbooks.Add
oWks.SaveAs quiPath
End If
End With

' Set oWsh = oWks.Worksheets(1)

oApp.Visible = True
' oWks.Activate

' oWks.Cells(2, 1).Value = "b"
***********************************

le righe incriminate sono, indifferentemente, tutte quelle commentate.

Ho trovato tanti riferimenti in rete a questo problema, ma sempre
legati a fattori che ho già verificato; preciso che:
- Ho WinXP Professional e Office 2002 SP3
- NON sto usando Crystal Report
- NON sto usando un controllo calendario o altri ActiveX particolari.
- Ho referenziato (sia in Excel che in Access: non si sa mai... :-/ )
Microsoft Office 10.0 Object Library, Microsoft ActiveX Data Object 2.7
Library, Microsoft Excel 10.0 Object Library, Microsoft Access 10.0
Object Library; più una quantità di altre librerie che potevano anche
solo vagamente entrarci qualcosa, per esasperazione

Si tratta di una libreria da aggiornare? E se sì quale?? E se no...
che cavolo devo fare???

Ogni aiuto sarà accolto con entusiasmo :-)

ciao :-]

viviana

giorgio rancati

unread,
Jun 15, 2005, 9:26:57 AM6/15/05
to

"viviana" <lamb...@despammed.com> ha scritto nel messaggio
news:1118826704....@o13g2000cwo.googlegroups.com...
Ciao,

>Ho un problema che non riesco proprio a risolvere, nonostante stia
>'googlando' da un paio di giorni, qualcuno può aiutarmi? Devo passare
>dati dai campi di un form in Access alle celle di un foglio excel
>(Faccio la stessa cosa senza problemi dallo stesso form di access ad un
>documento di word).

>L'errore è questo:
>2147417848 - Errore di automazione
>L'oggetto invocato si è disconnesso dai client corrispondenti.

>...e il codice questo:
[CUT]

Ciao Viviana,

se ho inteso bene il tuo scopo prova questo esempio tratto dal tuo codice,
poi lo adatti alle tue esigenze.
(Provala bene, l'ho buttata giù al volo)

Ciao
--
Giorgio Rancati
[Office Access MVP]

---
Sub ProvaExcel()

Dim oApp As Object 'Excel Application
Dim blnOpen As Boolean 'Applicazione già aperta
Dim wrkbOpen As Boolean 'WorkBook Già aperto

Dim MyPath As String 'Path
Dim NomeWrkb As String 'Nome del file xls
Dim quipath As String 'Path+Nome del file xls

Dim i As Integer ' contatore di comodo

MyPath = "C:\Dati\"
NomeWrkb = "fgl1.xls"
quipath = MyPath + NomeWrkb

blnOpen = True


On Error Resume Next
Set oApp = GetObject(, "Excel.Application")
If Err.Number = 429 Then
Set oApp = CreateObject("Excel.Application")
blnOpen = False
Err.Number = 0
End If

On Error GoTo gestErrori
If Dir(quipath) <> "" Then
'Se il file esiste e non è già aperto lo apro
For i = 1 To oApp.Workbooks.Count
If oApp.Workbooks(i).FullName = quipath Then Exit For
Next
If i > oApp.Workbooks.Count Then
'Il WorkBook non era già aperto
oApp.Workbooks.Open quipath
Else
oApp.Workbooks(i).Activate
'Il WorkBook era già aperto
wrkbOpen = True
End If
Else
'Il file non esiste quindi lo creo
oApp.Workbooks.Add
oApp.Workbooks(oApp.Workbooks.Count).SaveAs quipath
End If

oApp.Worksheets(1).Cells(2, 1).Value = "aaa"

oApp.Workbooks(NomeWrkb).Save

'Se il WorkBook non era già aperto lo chiudo
If wrkbOpen = False Then
oApp.Workbooks(NomeWrkb).Close
End If

'Se l'applicazione non era già aperta la chiudo
If blnOpen = False Then
oApp.Quit
End If

Fine:
Set oApp = Nothing
Exit Sub

gestErrori:
MsgBox Error
Resume Fine:

End Sub
---


giorgio rancati

unread,
Jun 15, 2005, 11:53:01 AM6/15/05
to

"viviana" ha scritto:

> Ciao,
>
> Ho un problema che non riesco proprio a risolvere, nonostante stia
> 'googlando' da un paio di giorni, qualcuno può aiutarmi?

Ciao Viviana,
ti ho risposto circa tre ore fa e non vedendo nulla ne da web ne da OE provo
a riPostare.


==============


se ho inteso bene il tuo scopo prova questo esempio tratto dal tuo codice,
poi lo adatti alle tue esigenze.
(Provala bene, l'ho buttata giù al volo)

Ciao
--
Giorgio Rancati
[Office Access MVP]

---
Sub ProvaExcel()

Dim oApp As Object 'Excel Application
Dim blnOpen As Boolean 'Applicazione già aperta
Dim wrkbOpen As Boolean 'WorkBook Già aperto

Dim MyPath As String 'Path
Dim NomeWrkb As String 'Nome del file xls
Dim quipath As String 'Path+Nome del file xls

Dim i As Integer ' contatore di comodo

MyPath = "C:\Dati\"
NomeWrkb = "fgl1.xls"
quipath = MyPath + NomeWrkb

blnOpen = True


On Error Resume Next
Set oApp = GetObject(, "Excel.Application")
If Err.Number = 429 Then
Set oApp = CreateObject("Excel.Application")
blnOpen = False
Err.Number = 0
End If

On Error GoTo gestErrori

Gaspare

unread,
Jun 15, 2005, 7:07:07 PM6/15/05
to

[CUT]

Ciao Viviana,

la soluzione di Giorgio va più che bene (come al solito...), se invece
interessa capire perchè viene fuori quell'errore...

Dichiari 3 oggetti
-------------------


Dim oApp As Object
Dim oWks As Object
Dim oWsh As Object

--------------------------

Istanzi il 1° oggetto (praticamente apri una sessione di lavoro di excel)
---------------------------


Set oApp = CreateObject("Excel.Application")

-------------------------------------------

Istanzi il 2° oggetto "WorkBooks" come una nuova cartella di lavoro
rendendola visibile (Add). Se noti bene la classe WorkBooks viene ereditata
dalla classe ("Excel.Application") e quindi la consideri una sua
sottoclasse e fin qui qui nulla da dire...
-----------------------------------
Set oWks = oApp.workbooks.Add
-------------------------------------------------

A questo punto ti viene fuori l'errore perchè cerchi di istanziare l'oggetto
WorkSheets (i fogli di lavoro di excel) come oggetto ereditato dalla classe
WorkBooks e qui Access si arrabbia ;-)

-------------------------------------------
' Set oWsh = oWks.Worksheets(1)
--------------------------------------------


Se vuoi utilizzare 3 variabili di tipo oggetto puoi fare nel seguente modo:

------------------------------------
Dim ApplicazioneExcel As Object

Dim CartellaExcel As Object

Dim FoglioExcel As Object

Set ApplicazioneExcel = CreateObject("Excel.Application")

Set CartellaExcel = ApplicazioneExcel.WorkBooks

CartellaExcel.Add

Set FoglioExcel = ApplicazioneExcel.WorkSheets

FoglioExcel.Add

ApplicazioneExcel.Visible = True
--------------------------------------

Notte :-)

Gaspare


Gaspare

unread,
Jun 15, 2005, 8:19:05 PM6/15/05
to

[CUT]

Ciao Viviana,
qull'errore
---------------------------


L'errore è questo:
2147417848 - Errore di automazione
L'oggetto invocato si è disconnesso dai client corrispondenti.

------------------------
viene fuori perchè nonostante la gerarchia delle classi sia la seguente

Application----|
|
WorkBooks----|
|
Worksheets


Access non ti consente di dichiarare 3 oggetti


Dim oApp As Object
Dim oWks As Object
Dim oWsh As Object


ed istanziarli nel seguente modo...

1) Set oApp = CreateObject("Excel.Application") <- OK
2)Set oWks = oApp.workbooks.Open(quiPath) <-OK

3) Set oWsh = oWks.Worksheets(1) <- ERRATO
infatti qui ti si blocca l'esecuzione del codice...


Se vuoi usare 3 variabili di tipo oggetto puoi farlo nel seguente modo:

-----------------------------------------------------------------------------------

Dim ApplicazioneExcel As Object

Dim CartellaExcel As Object

Dim FoglioExcel As Object

Set ApplicazioneExcel = CreateObject("Excel.Application")


Set CartellaExcel = ApplicazioneExcel.WorkBooks

CartellaExcel.Add

'Il foglio di excel viene istanziato con riferimento alla classe Application
e non con riferimento alla classe WorkBooks

Set FoglioExcel = ApplicazioneExcel.WorkSheets

FoglioExcel.Add

ApplicazioneExcel.Visble=True

-----------------------------------------------------------------------------------------

Notte :-)

Gaspare


viviana

unread,
Jun 16, 2005, 3:46:49 AM6/16/05
to
ciao!

ieri ad una certa ora ho gettato la spugna...
... ma adesso riparto :-)


Provo subito a mettere in pratica questa via (grazie a tutti e due!):
mi sa che devo riguardare con un po' di attenzione la gerarchia delle
classi, effettivamente.

poi vi dico se funziona, intanto avete 'illuminato' al mio arrivo in
ufficio ed è già un risultato ^____^

viviana

viviana

unread,
Jun 16, 2005, 4:18:10 AM6/16/05
to
ciao Giorgio,


>se ho inteso bene il tuo scopo prova questo esempio tratto dal tuo codice,
>poi lo adatti alle tue esigenze.


il codice è perfetto, ti ringrazio davvero :-)


>(Provala bene, l'ho buttata giù al volo)

ops! e io ci ho messo mezza mattinata per partorire quello sbagliato
:-/

...miiiiiinchia quanto devo studiare ancora! :-)


Gaspare,

>la soluzione di Giorgio va più che bene (come al solito...), se invece
>interessa capire perchè viene fuori quell'errore...

sì, mi interessa molto, perché un po' alla volta cerco di riempire le
mie 'voragini' di incompetenza;

e poi perché bisogna sempre capire come funziona, sennò non è
divertente, quindi GRAZIE.

Come avrai capito, non avevo idea di questo aspetto dell'articolazione
delle classi.

Immagino che sia valido sempre, vero?

Voglio dire, e scusami il linguaggio poco preciso: una classe ereditata
da una classe a sua volta ereditata da un'altra si istanzia sempre come
sottoclasse della prima? Cioè la nipote risulta figlia della nonna ;->

Buon lavoro ad entrambi

(non dico a buon rendere perché mi sa che ne devo ancora mangiare di
pane & codice, prima!)

viviana

viviana

unread,
Jun 16, 2005, 4:28:59 AM6/16/05
to
"giorgio rancati" scrive:

>se ho inteso bene il tuo scopo prova questo esempio tratto dal tuo codice,
>poi lo adatti alle tue esigenze.

fatto! e funziona benissimo.

Ti ringrazio ancora e lo scrivo in lista anche qui, se casomai passasse
qualcuno con il mio stesso problema.

In pratica se ho ben capito, se istanziavo il foglio di excel come
sottoclasse della cartella, avendo già istanziato la cartella come
sottoclasse dell'applicazione

Set oWsh = oWks.Worksheets(1)

Sbagliavo perché in questo caso devo istanziare il foglio direttamente
come sottoclasse dell'applicazione; se commentavo questa riga invece
l'errore me lo davano quelle successive perché, comunque, il foglio va
istanziato!

ciao!
viviana

0 new messages