Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [VB6] Handle di un Workbook Excel

    Ciao a tutti...
    vi descrivo, cercando di essere il più conciso possibile, ciò che mi affligge...
    Ho un programmino VB6 che mi crea un bellissimo file Excel tramite
    codice:
    Excel.Application.Workbooks.Add
    Nel foglio che viene SEMPRE creato con successo vengono inseriti una serie di dati che risultano SEMPRE presenti. Il problema è il settaggio delle opzioni che avviene tramite un
    codice:
    MioFoglio.ActiveSheet.Range(Cells(...)...).width
    Difatti, questa istruzione viene eseguita correttamente solo alla sua prima esecuzione... Cioè

    UTENTE AVVIA IL PROG. >>> UTENTE CHIEDE AL PROG IL FOGLIO EXCEL >>> PROG CREA FOGLIO EXCEL ( Dati OK - OpzioniCelle OK) >>> UTENTE CHIUDE FOGLIO EXCEL.
    UTENTE CHIEDE DI NUOVO AL PROG DI CREARE UN ALTRO FOGLIO EXCEL >>> PROG CREA FOGLIO EXCEL (Dati OK - OpzioniCelle NO!!!Err.Number=1004)

    quindi, per far si che questa venga effettuata senza scatenarmi un fatidico Error (1004) devo ogni volta riavviare il mio progetto...
    E' vero, potrei settare tranquillamente le singole celle una volta inserito il relativo dato... ma sono cocciuto!!E poi non vedo perchè utilizzare 30 righe di codice in più quando ne posso usare una...

    Ho fatto di tutto... ho chiuso il file da progetto, ho chiuso il file aperto tramite l'API "_lClose" usando l'Handle del file stesso... Ho chiuso l'Handle tramite l'API "CloseHandle"...

    Spero di esser stato il più chiaro possibile...

    C'è qualche anima Pia disposta a darmi una mano????

    Grazie milleX

    AsanoRonin
    Non ho casa. Ho il mio onore.
    Non ho amici. Ho la mia spada.
    Non ho padrone...Sono come il vento che scivola sulla lama...

  2. #2
    Utente di HTML.it L'avatar di Boolean
    Registrato dal
    Oct 2005
    Messaggi
    758
    probabilmente hai già controllato... maè meglio esserne assolutamente sicuri:

    ti sei assicurato del fatto che l'istanza di Excel aperta venga poi chiusa effettivamente?

    una volta chiusa l'istanza, annienti le variabili oggetto relative ai fogli di lavoro, al workbook e all'applicazione excel?

    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?

    Boolean

  3. #3

    mmm...

    Ciao Boolean,
    alor, hai ragione anche tu... l'istanza l'ho chiusa e le variabili sono state svuotate... tramite una "MiaApplicazioneExcel.Workbooks.Close" e "Set MiaApplicazioneExcel = Nothing"... oltretutto è il programma stesso a chiudere il foglio salvandone il contenuto...
    Ho anche provato con l'API TerminateProcess... MA per ora niente da fare...

    Inizio ad essere un po cotto...

    Thanks, Bye

    AsanoRonin.
    Non ho casa. Ho il mio onore.
    Non ho amici. Ho la mia spada.
    Non ho padrone...Sono come il vento che scivola sulla lama...

  4. #4
    Non c'è proprio niente da fare... non gli piace il .Range...
    Non ho casa. Ho il mio onore.
    Non ho amici. Ho la mia spada.
    Non ho padrone...Sono come il vento che scivola sulla lama...

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Se mostri il codice, tento di replicare la tua situazione (errore compreso) per risolverlo ...

  6. #6

    Sob...

    Eccomi... scusate il ritardo ma ho dovuto rifare...

    codice:
    'Uso la Microsoft Excel 11.0 Object Library
    
    Option Explicit
    
    Dim ApplExcel As New Excel.Application          'Creo questa santa variabile...
    Dim WorkExcel As New Excel.Workbook             'Creo la variabile (come mi hai suggerito)nella quale alloco il workbook...
    
    Dim ExcRow As Byte
    Dim ExcCol As Byte
    
    'Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
    'Private Declare Function CloseHandle Lib "kernel32" Alias "CloseHandle" (ByVal hObject As Long) As Long
    
    Private Sub cmdCreateSheet_Click()
        On Error GoTo GeErr
        'Dim myHandle    As Long                    'Dove Allocavo l'handle dell'applicazione che aprivo...
        
        
        'ApplExcel.Workbooks.Add                    'Prima il WorkBook non lo inserivo in una variabile...
        'myHandle = ApplExcel.hWnd
        Set ApplExcel = CreateObject("Excel.Application")
        Set WorkExcel = ApplExcel.Workbooks.Add     'Setto la variabile con un nuovo workbook
        
        With WorkExcel.ActiveSheet                  'Forse inizio a capire dove ho sbagliato...
            For ExcRow = 1 To 20
                For ExcCol = 1 To 7
                    .Cells(ExcRow, ExcCol).Value = Rnd(1) * 10  'Vabbè...
                Next ExcCol
            Next ExcRow
            ExcCol = ExcCol - 1
            ApplExcel.Visible = True                            'Visualizzo il foglio per rendere valido il settaggio delle opzioni celle sull'activesheet...
            For ExcRow = 1 To 20                                '...effetto bellino
                If ExcRow Mod 2 = 0 Then
                    .Range(Cells(ExcRow, 1), Cells(ExcRow, ExcCol)).Interior.Color = &H80FF&     'Setto alcune opzioni delle celle sfruttando la proprietà range (...invece che usare un ciclo...)
                Else
                    .Range(Cells(ExcRow, 1), Cells(ExcRow, ExcCol)).Interior.Color = &H80C0FF
                End If
            Next ExcRow
            ExcRow = ExcRow - 1
            .Range(Cells(1, 1), Cells(ExcRow, ExcCol)).Borders.LineStyle = xlContinuous
            .Range(Cells(1, 1), Cells(ExcRow, ExcCol)).Font.Name = "Arial"
            .Range(Cells(1, 1), Cells(ExcRow, ExcCol)).Font.Size = 10
        End With
        WorkExcel.Close                             '...
        Set WorkExcel = Nothing
        Set ApplExcel = Nothing
        'TerminateProcess myHandle, 0
        'CloseHandle (myHandle)
        Exit Sub
        
    GeErr:
        Select Case Err.Number
            Case Is = 1004      'Quel fatidico errore che mi si presenta alla seconda elaborazione del foglio excel
                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
    NOTA - Se metto come commento

    codice:
    Set AppExcel = CreateObject ("Excel.Application")
    
    Set AppExcel = Nothing
    Mi funziona.... Why ??

    Can SomebodY HelpME??

    Grazie Anticipate...
    Non ho casa. Ho il mio onore.
    Non ho amici. Ho la mia spada.
    Non ho padrone...Sono come il vento che scivola sulla lama...

  7. #7
    Utente di HTML.it L'avatar di Boolean
    Registrato dal
    Oct 2005
    Messaggi
    758
    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

  8. #8

    OKAPPA!!

    FUNZIONA DI BRUTTO!!

    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"...
    Esattamente, il problema lo avevo intuito... e contavo di eliminare questo 'legame'(della quale recuperavo l'handle) tramite un'API (la CloseHandle, o la TerminateProcess)...

    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).
    Ho dimostrato forse troppa superfilcialità nell'interpretare quel 'tutti'... che p*@#a.
    Beh, era una lacuna che mi hai colmato... Non hai idea di quanto mi sei stato d'aiuto (...forse più per il chiarimento che per il codice... compresa la delucidazione sulla referenza)

    Ti ringrazio nuovamente.

    AsanoRonin.
    Non ho casa. Ho il mio onore.
    Non ho amici. Ho la mia spada.
    Non ho padrone...Sono come il vento che scivola sulla lama...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.