non te ne sei assicurato...Originariamente inviato da Boolean
ti sei assicurato del fatto che l'istanza di Excel aperta venga poi chiusa effettivamente?
come volevasi dimostrare non facevi riferimento a Excel esclusivamente tramite variabili oggetto...Originariamente inviato da Boolean
sei sicuro che *tutti* i riferimenti all'applicazione excel, come al workbook e ai fogli di lavoro siano effettuati tutti tramite le variabili oggetto istanziate?
l'errore si scatenava per un problema noto nell'uso dell OLE Automation, in due parole, se da VB si usano riferimenti diretti alle celle, o ai fogli o al workbook stesso, VB crea implicitamente delle variabili oggetto che fanno riferimento all'oggetto chiamato, ma una volta chiusa (almeno così si crede) l'istanza di Excel, l'area di memoria utilizzata per i riferimenti agli oggetti non viene liberata, e quindi l'istanza di Excel rimane "appesa"...
la prima volta questo non crea problemi, perchè di istanze di excen non ce ne sono... ma alla seconda volta, quando già un'istanza di excel è in sospeso, il problema si presenta puntualmente!
per evitare questo, come ti ripeto, è necessario istanziare delle variabili oggetto che facciano riferimento a TUTTI gli oggetti che si intendono utilizzare (tranne, in qualche caso, per il Range).
poi un'altra cosa... nel momento in cui decidi di utilizzare il riferimento alla libreria direttamente in VB, è inutile utilizzare la CreateObject. se la utilizzi (decisamente consigliabile farlo) è possibile NON includere alcun riferimento alla libreria nel progetto.
questo è il codice come l'ho modificato... e dovrebbe funzionare a dovere
codice:Option Explicit Dim ApplExcel As New Excel.Application Dim WorkExcel As Excel.Workbook Dim SheetExcel As Excel.Worksheet Dim ExcRow As Byte Dim ExcCol As Byte Private Sub cmdCreateSheet_Click() Set ApplExcel = New Excel.Application Set WorkExcel = ApplExcel.Workbooks.Add Set SheetExcel = WorkExcel.ActiveSheet With SheetExcel For ExcRow = 1 To 20 For ExcCol = 1 To 7 .Cells(ExcRow, ExcCol).Value = Rnd(1) * 10 Next ExcCol Next ExcRow ExcCol = ExcCol - 1 ApplExcel.Visible = True For ExcRow = 1 To 20 If ExcRow Mod 2 = 0 Then .Range(SheetExcel.Cells(ExcRow, 1), SheetExcel.Cells(ExcRow, ExcCol)).Interior.Color = &H80FF& Else .Range(SheetExcel.Cells(ExcRow, 1), SheetExcel.Cells(ExcRow, ExcCol)).Interior.Color = &H80C0FF End If Next ExcRow ExcRow = ExcRow - 1 .Range(SheetExcel.Cells(1, 1), SheetExcel.Cells(ExcRow, ExcCol)).Borders.LineStyle = xlContinuous .Range(SheetExcel.Cells(1, 1), SheetExcel.Cells(ExcRow, ExcCol)).Font.Name = "Arial" .Range(SheetExcel.Cells(1, 1), SheetExcel.Cells(ExcRow, ExcCol)).Font.Size = 10 End With WorkExcel.SaveAs "C:\TuoNuovoFoglio.xls" WorkExcel.Close ApplExcel.Quit Set WorkExcel = Nothing Set ApplExcel = Nothing Set SheetExcel = Nothing Exit Sub GeErr: Select Case Err.Number Case Is = 1004 Err.Number = 0 Resume Next Case Else MsgBox Err.Number & " " & Err.Description Exit Sub End Select End Sub Private Sub Form_Load() Me.Left = (Screen.Width - Me.Width) / 2 Me.Top = (Screen.Height - Me.Height) / 2 End SubBoolean


Boolean
Rispondi quotando