Newsgroup: it.comp.lang.visual-basic
Titolo: [Excel] il mio problema si infittisce...

Con riferimento al mio problema su Excel:
http://www.newsland.it/nr/browse/it.comp.lang.visual-basic/65493.html
ho scoperto questa novità: il problema accade solo se la mia classe cExcel
è compilata in una DLL ActiveX. Se la includo nel progetto, va tutto bene.
In particolare:
-classe-------------------------------------------
Public Sub AddWorkBook()
    Dim objWorksheet As Excel.Worksheet
    'Add this Workbook to Excel.
    Set m_objWorkbook = m_objExcel.Workbooks.Add    
End Sub
Public Sub SaveWorkBook(FileName As String, Optional closeWorkBook As
Boolean = True, _
                        Optional Password As String = "", Optional
writeResPassWord As String = "", _
                        Optional readOnlyRecommended As Boolean = False)
    m_objWorkbook.SaveAs FileName, , Password, writeResPassWord,
readOnlyRecommended
 
    'm_objWorkbook.SaveCopyAs FileName
 
    If closeWorkBook = True Then
        m_objWorkbook.Close
    End If
 
End Sub
-fine classe-----------------------------------------------------------
Usando semplicemente
    Set xl = New cExcel
    'xl.visible = True
    xl.AddWorkBook
    xl.SaveWorkBook "E:\Tmp\test3.xls"
funziona se cExcel è compilata nel progetto, non funziona se la classe è
compilata in una DLL a parte.
Mah... 
Boh...
:/
-- 
-----------------------------------
"A strange game. The only winning move is not to play"
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 ha scritto nel messaggio 
news:d1pg76$mhn$1...@news.newsland.it...

ma il codice della classe è tutto lì?

 
http://www.newsland.it/nr/browse/it.comp.lang.visual-basic/65493.html
..ok, mi auto-rispondo, visto che ho trovato il problema.
Il fatto è che la DLL ActiveX usava un riferimento ad "Excel 11.0 Object
library", quella creata con MS Office 2003. Usandola con Office 2000,
funzionava "quasi tutto"... fino a quando non si arrivava alla SaveAs.
Ricompilando il tutto con un riferimento alla "Excel 9.0 Object library"
(Office 2000), funziona tutto (sia con 2000 che con 2003).
Mah...
Grazie a tutti, comunque.


 library" (Office 2000), funziona tutto (sia con 2000 che con 2003).
Veramente io ti avevo chiesto come istanziavi l'oggetto, proprio perchč se 
usi il CreateObject non ti servono i riferimenti nel progetto.
Quando ho visto che istanziavi col CreateObject, ho scartato l'ipotesi dei 
riferimenti sballati.
Ti consiglio comunque di toglierli dal progetto.
Ciao
Alberto
-- 
E tutto mi sembrava andasse bene... 

 Ti consiglio comunque di toglierli dal progetto.
???
Come?
Scusa, ma questa non l'ho capita.
Ok usare CreateObject, però il riferimento serve lo stesso (o no?),
altrimenti quando fai riferimento a:
Private m_objExcel As Excel.Application
non compila e genera l'errore:
"User-defined type not defined."
...
oppure, mi sto perdendo qualcosa?
Puoi spiegare meglio? Grazie mille.


 oppure, mi sto perdendo qualcosa?
Non vorrei dire, ma sei il primo che sento che mette i riferimenti e poi usa 
comunque il late-binding.
O una o l'altra.
Se metti i riferimenti, l'oggetto puoi crearlo col New (ma sei vincolato ad 
una versione di Excel).
Se usi il late-binding (CreateObject o GetObject), i riferimenti non servono 
(tranne durante lo sviluppo per avere la comodità dell'intellisense). Non 
vedo perchè incasinarsi con le versioni, e poi usare comunque il 
late-binding.
Comunque è un argomento trito e ritrito, se cerchi su google trovi parecchia 
roba.


 usare comunque il late-binding.
mmm... e se hai più versioni installate la CreateObject a quale si attacca?
Ciao 


Non ho mai provato, ma quando invochi "Excel.Application", credo che presso 
il sistema operativo di registrate così ce ne sia solo una (presumo l'ultima 
installata, anche se credo che ogni setup di Excel verifichi l'esistenza di 
una versione maggiore, per cui potrebbe anche attaccarsi alla versione più 
recente).



All'ultima registrata...
in particolare se vai a vedere la chiave Excel.Application nel registro, 
vedrai intanto che ne esiste piu' di una
(Excel.Application , Excel.Application.9, Excel.Application.11 a seconda 
delle versioni installate) e soprattutto che nella prima, quella generica, 
c'e' una chiave in piu' CurVer che rimappa ad una delle altre.
Il CLSID e' comunque uguale perche' tra loro sono in compatibilita' binaria
Ciao
-- 
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown 

 binaria
Quindi il problema del versioning non è risolto, perchè quei fessi hanno 
sicuramente modificato l'interfaccia mantenendo lo stesso CLSID.
Ciao 

 hanno sicuramente modificato l'interfaccia mantenendo lo stesso CLSID.
Effettivamente l'interfaccia è diversa (beh, non proprio, diciamo che 
l'interfaccia è uguale ma risponde in modo diverso a determinate chiamate).
Ma esiste anche documentazione che spiega dove e come sono diverse, per cui 
è possibile scrivere roba che 'eviti' i metodi con comportamento dipendente 
da versione.
In linea di massima, sono critici i metodi che consentono di entrare 
nell'object model 'in mezzo'.
Istanziando .Application, e scendendo nell'albero in maniera normale, cioè 
passando di riferimento in riferimento, funziona tutto senza problemi 
(almeno da Excel95 a Excel2003, per il futuro non saprei...).


 roba.
Infatti, sono andato ...affangoogle... e ho trovato parecchie spiegazioni.
Grazie per avermi spiegato questa cosa: in realtà, solo parte di quella
classe l'avevo scritta io: lo "scheletro" l'avevo trovato su internet, ed
usato tale e quale... 
Grazie mille
Marco.


 usato tale e quale...
anche saper copiare e' un'arte ;-)
--
ciao, hal
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/