Originariamente inviato da Boolean
ti sei assicurato del fatto che l'istanza di Excel aperta venga poi chiusa effettivamente?
non te ne sei assicurato...

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?
come volevasi dimostrare non facevi riferimento a Excel esclusivamente tramite variabili oggetto...

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 Sub
Boolean