PDA

View Full Version : [VB6] Attendere Excel


Spike79
18-11-2008, 14:58
Ciao, sto sviluppando con VB6 un'applicazione che crea e popola dei fogli XLS, e fin qui, tutto ok....vorrei però fare in modo che l'utente possa decidere di aprire il file XLS prodotto in Excel, modificarlo, salvarlo, chiuderlo mentre la mia applicazione "attende" in background che finisca queste operazioni e intervenga solo alla chiusura del foglio Excel....è fattibile ?

Altra domanda, mi trovo sempre un processo Excel.exe appeso alla chiusura del mio programma, eppure ogni variabile Excel.Application la setto = nothing!

MarcoGG
19-11-2008, 09:24
Ciao, sto sviluppando con VB6 un'applicazione che crea e popola dei fogli XLS, e fin qui, tutto ok....vorrei però fare in modo che l'utente possa decidere di aprire il file XLS prodotto in Excel, modificarlo, salvarlo, chiuderlo mentre la mia applicazione "attende" in background che finisca queste operazioni e intervenga solo alla chiusura del foglio Excel....è fattibile ?


Cioè hai un ciclo che crea diversi Xls in sequenza, e dopo averne compilato uno, lo lascia aperto in attesa delle eventuali modifiche dell'utente. Se l'utente lo chiude ( salvando o meno le modifiche ) il ciclo continua...
Così ?


Altra domanda, mi trovo sempre un processo Excel.exe appeso alla chiusura del mio programma, eppure ogni variabile Excel.Application la setto = nothing!

C'è sicuramente un errore occulto nel tuo codice. Forse apri n istanze, e ne rimane sempre una orfana. Difficile saperlo se non posti il codice.

Spike79
19-11-2008, 17:22
Beh , più o meno....diciamo, apro un file TXT , leggo dei valori, faccio dei conti, apro un XLS e li inserisco in uno sheet (in caselle precise), chiudo sheet e xls e salvo.
Nel ciclo di lettura può succedere di aprire di nuovo l'xls e creare nuovi sheets.
Io vorrei che al termine del TXT, ossia alla fine della lettura e di tutti i vari salvataggi, l'utente possa confermare di voler modificare il file XLS prodotto, il mio programma dovrà aprire l'xls e 'attendere' che l'utente faccia le sue modifiche, in seguito a ciò (ossia quando l'utente chiuderà Excel), il programma dovrà riprendere il controllo per fare ulteriori calcoli sul file XLS modificato.

Riguardo gli orfani, è probabile, dovrò ricontrollare tutto.

MarcoGG
20-11-2008, 09:44
Io proverei a semplificare il tutto aprendo direttamente il file xls in una Form VB6. In questo modo si può risparmiare molto codice ed evitare i fastidi e gli errori di un continuo dialogo tra VB6 ed Excel...
Dai un'occhiata a questo componente :
Microsoft Office Web Components 11.0

10.0 > Office XP
11.0 > Office 2003 ecc...

La DLL è :
C:\Programmi\File comuni\Microsoft Shared\Web Components\11\OWC11.DLL

A dispetto del nome "Web" è perfetto per le WinForms, e una volta importato aggiunge vari controlli alla ToolBar, tra cui lo "Spreadsheet".

Gestire lo Spreadsheet via codice è semplicissimo :

Dim percorso As String
percorso = App.Path & "\"

'Carico un workbook:
Spreadsheet1.XMLURL = percorso & "PROVA.xls"

'Inserisco valori:
Spreadsheet1.Sheets("Foglio1").Range("A1") = "PROVA1"
Spreadsheet1.Sheets("Foglio2").Range("A1") = "PROVA2"
Spreadsheet1.Sheets("Foglio3").Range("A1") = "PROVA3"

'Salvo il workbook:
Spreadsheet1.Export percorso & "PROVA.xls", ssExportActionNone, ssExportAsAppropriate

A questo punto l'utente potrebbe modificare il workbook direttamente dalla Form, e fare Click su un pulsante, confermando che ha finito di apportare le modifiche... problema risolto. ;)

Spike79
20-11-2008, 10:09
Fantastico, appena ci rimetto sopra le mani mi ci fiondo....però una domanda mi sorge spontanea...e per distribuirlo ? Se l'utente ha Office 2007 o Office 2003 o addirittura Office 2000, può succedere qualcosa ?

MarcoGG
20-11-2008, 10:29
Fantastico, appena ci rimetto sopra le mani mi ci fiondo....però una domanda mi sorge spontanea...e per distribuirlo ? Se l'utente ha Office 2007 o Office 2003 o addirittura Office 2000, può succedere qualcosa ?


Se prevedi di distribuirlo per tutte le versioni di Office, è possibile che ad esempio OWC11.DLL, distribuito con il programma, gestisca anche i file excel di tutte le versioni precedenti alla 2003.
Penso proprio che sia così, anche se non te lo posso "giurare".
Per Excel 2007 il discorso è diverso, perchè lì cambia proprio il formato del file. Sarà necessario avere OWC12.DLL.

La cosa migliore ? Anzichè smazzarsi un'unica gestione centralizzata di TUTTE le versioni di Office, meglio accordarsi col cliente su quale sia la sua, e fare diverse versioni del programma...

E comunque, meglio evitare Office '97 e precedenti !

Spike79
20-11-2008, 10:47
Uhm...sto provando ma non riesco a fargli caricare il mio foglio, dice che non è un foglio dati XML....eppure è un banale XLS...

MarcoGG
20-11-2008, 14:02
Uhm...sto provando ma non riesco a fargli caricare il mio foglio, dice che non è un foglio dati XML....eppure è un banale XLS...


Usi Office 2007 per caso ? A me con Excel 2003 ( OWC11.DLL ) funziona normalmente...

Spike79
20-11-2008, 14:34
No, Office 2003, e appena apro il mio file, col comando che mi hai dato (Spreadsheet1.XMLURL = percorso & "PROVA.xls"), si incricca e dà quell'errore.

"Il documento non è un file XML corretto"

MarcoGG
21-11-2008, 09:13
No, Office 2003, e appena apro il mio file, col comando che mi hai dato (Spreadsheet1.XMLURL = percorso & "PROVA.xls"), si incricca e dà quell'errore.

"Il documento non è un file XML corretto"


Purtroppo temo sia il limite del controllo ( non mi dava errore perchè nella mia prova salvavo come "foglio di calcolo XML" pur mantenendo l'estensione "xls" ).
Se, come penso, non ti va di convertire i tuoi books xls in fogli di calcolo Xml ( manterresti i dati e la suddivisione in fogli, ma eventuali formule e macro andrebbero perse ), rimane l'embedding tramite OLE Container ( da provare, anche se personalmente non è che mi faccia impazzire... ), oppure tornare a gestire Excel da VB6, ma senza vedere un esempio del tuo codice non sono in grado...

Spike79
21-11-2008, 10:54
Gentilissimo, grazie.

Allora, il programma potrebbe anche salvare in XML (mantenendo XLS come estensione), tanto il file lo creo/salvo IO partendo da una base fissa vuota (popolo dei fogli, e salvo con un altro nome)....proverò anche questa strada.

MarcoGG
21-11-2008, 12:55
Gentilissimo, grazie.

Allora, il programma potrebbe anche salvare in XML (mantenendo XLS come estensione), tanto il file lo creo/salvo IO partendo da una base fissa vuota (popolo dei fogli, e salvo con un altro nome)....proverò anche questa strada.

Perfetto allora. :)
Puoi usare tranquillamente il controllo SpreadSheet, come ti avevo suggerito. ;)