Newsgroup: it.comp.lang.visual-basic
Titolo: Esportazione su excel

 
          Buongiorno a tutti ho il seguente problema sto cercando di esportare tramite
una procedura da me realizzati dati su un foglio excel, problema è che alla
fine dell'esportazione il file viene salvato ma resta un istanza aperta di
excel nonostante la setti a nothing, come posso risolvere questo
inconveniente?
riporto una parte del codice incriminato sperando di avere una dritta grazie
a tutti x l'attenizione
Dim i As Integer
Dim Ssql As String
Dim FileExcel As String
Dim Rec As DAO.Recordset
Dim IsExcel As Object
On Error GoTo Err_ExportExcel_Click
 
    If Cornice23.Visible = True Then
        'eseguo la ricerca per ricavare il recordset da esportare in excel
        Ssql = "SELECT [Dipendenti].[Matricola], [Dipendenti].[Cognome], [Dipendenti
       '''''''''''cut criteri di ricerca
    End If
 
        Set Rec = CodeDb.OpenRecordset(Ssql)
 
        If Not IsNull(Rec.Fields(0)) Then
            Rec.MoveFirst
 
            ' Apertura Applicazione Excel
            If OpenExcel = True Then
                Set IsExcel = GetObject(, "Excel.Application")
            Else
                Set IsExcel = CreateObject("Excel.Application")
                OpenExcel = True
            End If
 
            IsExcel.WorkBooks.Add
 
            i = 1
            'inserisco le intestazioni in excel
            IsExcel.WorkBooks(1).Worksheets(1).Cells(i, 1).Value = "Matricola "
            IsExcel.WorkBooks(1).Worksheets(1).Cells(i, 2).Value = "Cognome "
            IsExcel.WorkBooks(1).Worksheets(1).Cells(i, 3).Value = "Nome "
            IsExcel.WorkBooks(1).Worksheets(1).Cells(i, 4).Value = "D.Assunzione"
            IsExcel.WorkBooks(1).Worksheets(1).Cells(i, 5).Value = "D.Scadenza"
            IsExcel.WorkBooks(1).Worksheets(1).Cells(i, 6).Value = "Contratto "
            IsExcel.WorkBooks(1).Worksheets(1).Cells(i, 7).Value = "Livello"
            IsExcel.WorkBooks(1).Worksheets(1).Cells(i, 8).Value = "Lordo Annuo "
            IsExcel.WorkBooks(1).Worksheets(1).Cells(i, 9).Value = "Lordo Mensile "
            IsExcel.WorkBooks(1).Worksheets(1).Cells(i, 10).Value = "Sgravi Fiscali"
 
            'adatto la larghezza dei campi alla dimensione delle etichette
 
            IsExcel.WorkBooks(1).Worksheets(1).Columns("A:L").EntireColumn.AutoFit
            IsExcel.WorkBooks(1).Worksheets(1).Activate
 
            'inizio a riempire il foglio
            DoEvents
            Do Until Rec.EOF
 
                i = i + 1
 
                If IsNull(Rec.Fields(0)) = False Then
                    IsExcel.WorkBooks(1).Worksheets(1).Cells(i, 1).Value = Rec.Fields(0)
                    IsExcel.WorkBooks(1).Worksheets(1).Cells(i, 1).Select
                    Selection.HorizontalAlignment = xlRight
                End If
 
                If IsNull(Rec.Fields(1)) = False Then
                    IsExcel.WorkBooks(1).Worksheets(1).Cells(i, 2).Value = Rec.Fields(1)
                    IsExcel.WorkBooks(1).Worksheets(1).Cells(i, 2).Select
                    Selection.HorizontalAlignment = xlRight
                End If
 
                If IsNull(Rec.Fields(2)) = False Then
                    IsExcel.WorkBooks(1).Worksheets(1).Cells(i, 3).Value = Rec.Fields(2)
                    IsExcel.WorkBooks(1).Worksheets(1).Cells(i, 3).Select
                    Selection.HorizontalAlignment = xlRight
                End If
 
                If IsNull(Rec.Fields(3)) = False Then
                    IsExcel.WorkBooks(1).Worksheets(1).Cells(i, 4).Value = CDate(Rec.Fields(3))
                    IsExcel.WorkBooks(1).Worksheets(1).Cells(i, 4).Select
                    Selection.HorizontalAlignment = xlRight
                    Selection.NumberFormat = "dd/mm/yyyy"
                End If
 
                If IsNull(Rec.Fields(4)) = False Then
                    IsExcel.WorkBooks(1).Worksheets(1).Cells(i, 5).Value = CDate(Rec.Fields(4))
                    IsExcel.WorkBooks(1).Worksheets(1).Cells(i, 5).Select
                    Selection.HorizontalAlignment = xlRight
                    Selection.NumberFormat = "dd/mm/yyyy"
                End If
 
                If IsNull(Rec.Fields(5)) = False Then
                    IsExcel.WorkBooks(1).Worksheets(1).Cells(i, 6).Value = Rec.Fields(5)
                    IsExcel.WorkBooks(1).Worksheets(1).Cells(i, 6).Select
                    Selection.HorizontalAlignment = xlRight
                End If
 
                If IsNull(Rec.Fields(6)) = False Then
                    IsExcel.WorkBooks(1).Worksheets(1).Cells(i, 7).Value = Rec.Fields(6)
                    IsExcel.WorkBooks(1).Worksheets(1).Cells(i, 7).Select
                    Selection.HorizontalAlignment = xlRight
                End If
 
                If IsNull(Rec.Fields(7)) = False Then
                    IsExcel.WorkBooks(1).Worksheets(1).Cells(i, 8).Value = CDbl(Rec.Fields(7))
                    IsExcel.WorkBooks(1).Worksheets(1).Cells(i, 8).Select
                    Selection.NumberFormat = "0.00"
                End If
 
                If IsNull(Rec.Fields(8)) = False Then
                    IsExcel.WorkBooks(1).Worksheets(1).Cells(i, 9).Value = CDbl(Rec.Fields(8))
                    IsExcel.WorkBooks(1).Worksheets(1).Cells(i, 9).Select
                    Selection.NumberFormat = "0.00"
                End If
 
                If IsNull(Rec.Fields(9)) = False Then
                    IsExcel.WorkBooks(1).Worksheets(1).Cells(i, 10).Value = CInt(Rec.Fields(9))
                End If
 
                Rec.MoveNext
 
            Loop
 
        End If
        'lo rendo visibile e lo salvo
        'IsExcel.Visible = True
        FileExcel = "Report" & Format(Now, "_dd_mm_yyyy_hh_mm_ss")
        IsExcel.WorkBooks(1).SaveAs Filename:=FileExcel
        IsExcel.WorkBooks(1).Close
 
        Rec.Close
        Set Rec = Nothing
        Set IsExcel = Nothing
 
        MsgBox "Attenzione è stato creato il file excel: " & FileExcel & ".xls",
vbOKOnly, "Informazione"
 
    End If
    Exit Sub
Err_ExportExcel_Click:
 
    Set IsExcel = Nothing
    MsgBox Err.Description
 
 
End Sub
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

        Set IsExcel = Nothing
Chiudi il Workbook numero 1, ma dov'è che chiudi l'applicazione Excel?
Alberto
-- 
"C'è un Calvelli dentro ognuno di noi" (cit.) 


scusami, ma salvando e poi chiudendo il workbook e settando a nothing
l'istanza excel non dovrebbe chiudersi?
tu cosa fai di solito?


 tu cosa fai di solito?
Non ricordo esattamente se il metodo č Quit, ma sicuramente sull'help 
dell'object model di Excel trovi tutto ciň che serve, esempi e codice pronto 
compresi.
Ciao
Alberto
-- 
"C'č un Calvelli dentro ognuno di noi" (cit.) 

Wodka40° wrote:
in effetti
http://www.exceltip.com/st/Control_Excel_from_Word_using_VBA_in_Microsoft_Excel/463.html
guarda un po.....
"....
    xlWB.Close False ' close the workbook without saving
    xlApp.Quit ' close the Excel application
    Set xlWB = Nothing
    Set xlApp = Nothing
....
"
e poi
http://www.expressnewsindia.com/c4/ex2/C1170.html
".....
'Use a message box to pause code execution.
strMsg = "Click OK to close the Excel object."
MsgBox prompt:=strMsg, Buttons:=vbInformation, _
Title:="Getting Started"
'Close the object.
mobjXL.Quit
'Clear the object variable.
Set mobjXL = Nothing
End Sub
....
"
Guarda il tuo codice....hai fatto cosě?????
-- 
------------------------------------------------
Il Wodkino Nazionale č a : 
www.martek.it
Pagina Vb/Bestiario/Lamer Experience :
http://www.martek.it/go.asp?portamia=2
 New Entry nel bestiario!
:-)

 ;-)
ciao scusa se ti rispondo solo adesso, ero in pausa pranzo.
Cmq ho provato, ma purtroppo l'applicazione resta sempre lě.
Comunque dal task manager io visualizzo il processo.
Oramai sono ancora piů convinto che magari su un office 2003
andrebbe molto meglio che dire service pack non sono installati
piů di questo non posso fa.
Cmq ho chiesto anche sul news group di access
ma alcuni burloni mi hanno risposto che era troppo complicato che
dire ....
almeno ci ho provato
grazie lo stesso


 in attesa di essere distutta con il termina applicazione
VB6 è una cosa
VBA un altra!
e poi...forse access si mantiene un riferimento...chiudi anche il recordset
...prova!
e poi....c'è un NG di Access molto ben preparato...chiedi li!
E poi ...sopratutto.....
una applicazione che va ammazzata da task manager è una applicazione
quantomeno in errore!
Non posso farti il debug del tuo codice...ma io comincierei a sentire puzza
di bruciato!




 Wodka40° wrote:
per essere ancora + chiari!
.....TU SCRIVI
".....
        IsExcel.WorkBooks(1).Close
        Rec.Close
        Set Rec = Nothing
        Set IsExcel = Nothing
...."
Io proverei a scrivere
"
.....
       IsExcel.WorkBooks(1).Close
IsExcel.Quit
        Rec.Close
        Set Rec = Nothing
        Set IsExcel = Nothing
....



ciao alberto ti ringrazio per la disponibilità, ho provato ma non ne vuole
sapere
il codice provato è il seguente
IsExcel.Application.Quit
considera anche che il codice è scritto in vba in access non vorrei che
fosse un baco
di questa splendida suite! ;-)
mi domando a questo punto se tu il codice lo scrivi in vb semplice perchè
problemi non me ne risultano almeno fino ad oggi ;)
ciao e grazie


 almeno ci ho provato
Prova a esplicitare il parent di quel Selection monco che usi qua e là.
Non vorrei che andasse ad autoistanziare qualcosa.
Usa qualche metodo che ti restituisca un range, e usalo (Selection è un 
Range, se non sbaglio...).
Comunque ti ripeto che sull'help di VBA per Excel c'è parecchio codice di 
esempio. Hai trovato qualcosa?
Ciao
Alberto
-- 
"C'è un Calvelli dentro ognuno di noi" (cit.) 

 di questa splendida suite! ;-)
Credo non cambi niente (relativamente a OleAutomation, intendo).
Ciao
Alberto
-- 
"C'è un Calvelli dentro ognuno di noi" (cit.) 


 


 di questa splendida suite! ;-)
Se non ti piace non usarla!


 quindi se sbaglia lui non so proprio che pesci prendere
Resta però inteso che un conto è usare Excel Macro e un conto è usare Ole 
verso Excel.
Excel Macro (VBA) può permettersi di non referenziare tutto l'object model, 
tanto è implicito che .Application sia lui stesso.
VB (così come VBA da altre applicazioni), devono esplicitare tutta la 
navigazione nell'Object Model.
Quindi, non riuscirai mai ad arrivare a niente, finchè non avrai l'umiltà di 
lasciare come ultimissima opzione il fatto del bug dell'ambiente o 
dell'errore del registratore di macro.
Se tutto il mondo usa senza problemi entrambe le cose, è discretamente 
improbabile che tu, alla tua prima esperienza e facendo delle cose di 
estrema semplicità, individui un bug.
Ripeto: prova ad esplicitare i parent di Selection, e sono fiducioso che ti 
possa risolvere tutto.
Facci sapere.
Saluti



be considera che il codice che utilizzo l'ho generato tramite la
registrazione macro di excel
quindi se sbaglia lui non so proprio che pesci prendere
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

finalmente ho risolto, avevi ragione alberto ho inserito l'intero percorso
dell'oggetto e finalmente l'istanza viene chiusa senza cadaveri
pensolanti!!!!!!!
Meno male che ci sono persone come voi disponibili e testarde!!!
grazie 1000


 Prova a esplicitare il parent di quel Selection monco che usi qua e là.
[...]
Ciao, Alberto.
    Per ora e` solo monco... Un domani forse piuttosto vicino ci sara` da
andare a raccogliere i pezzi sparsi in un raggio di qualche chilometro se il
buon Sal non usa Option Explicit.
-- 
Ciao :o)
Maurizio Borrelli, Microsoft MVP - Office Systems - Access
--------
?SPQR(C)
 X
--------


be in realtà l'option explicit è impostato di default in vba access,
nonostante tutto non ho avuto nessuna avviso.


 chilometro se il buon Sal non usa Option Explicit.
La cosa è ancora peggiore.
In realtà Sal potrebbe anche usare Option Explicit.
Però ha sicuramente referenziato una Object Library, nel suo progetto, 
altrimenti non avrebbe la disponibilità delle costanti che utilizza.
E Selection probabilmente istanzia un nuovo Excel.Application in maniera 
implicita, e questa istanza rimane aperta alla fine dell'app.
E' la solita storia. Si usa (giustamente) il latebinding, però, per comodità 
di intellisense o per pura pigrizia, si mette anche un riferimento ad una 
object library e poi si finisce per andare a distribuire anche quella (con 
tutti i casini di versioni che possono accadere...).



ma no! albert cosa dici, in primo luogo non ci sarà nessun compilato
pertanto resterà il semplice db da consegnare alle poche persone che
utilizzeranno questa applicazione.
e nell'azienda dove sono arrivato mi sa che lo standard è windows 2000 +
office 2000
la referenza la eliminerò, considera che utilizzo la createobject quindi
niente new e nessun riferimento pertanto tutto l'apocalisse che predici non
ci sarà
ciaoooo


 quindi niente new e nessun riferimento
Appunto.
Proprio perchè non c'è necessità dell'earlybinding, perchè mettere il 
riferimento al progetto?
Fra le altre cose, se tu non avessi messo il riferimento avresti trovato il 
problema con un giorno di anticipo. Già questa sarebbe una buona ragione.


 tutti i casini di versioni che possono accadere...).
Ciao, Alberto. Ciao, Sal.
    Infatti. Dicevo appunto *se* non usa... :)
    Ho letto in fretta, ma mi sembra ci sia analogia con i problemi
segnalati nel 3D:
        [VB6] procedura di anteprima di stampa......help me
Sal, l'hai letto, vero?
