Programmando la mia macro per esportare misure dal cad ad Excel ho appreso due cose:
- nello stesso gruppo di lavoro non tutti hanno lo stesso software (versioni diverse di Autocad e Office);
- i controlli visuali non standard inseriti in fase di disegno (design time) a volte spariscono quando eseguiamo l’applicazione in un’altra postazione (run time).
L’applicazione mostra una form con un foglio di calcolo all’interno di Autocad, utile per immagazinare le misure che rileviamo graficamente selezionando oggetti quali polilinee, poligoni, cerchi e regioni. Lanciamo l’editor di Visual Basic (Alt+F11) ed inseriamo una form che chiameremo ViewData.
Early Binding
Per dire al compilatore di utilizzare la libreria di Excel dobbiamo inserire una referenza ad hoc
Nel mio pc c’è una versione di Excel 2007 per cui mi appare la libreria Microsoft Excel 12.0 Object Library, per le altre versioni di Excel troveremo rispettivamente:
- Excel 97: Microsoft Excel 8.0 Object Library
- Excel 2000: Microsoft Excel 9.0 Object Library
- Excel 2002: Microsoft Excel 10.0 Object Library
- Excel 2003: Microsoft Excel 11.0 Object Library
Il compilatore a questo punto ha letto la libreria di Excel, conosce tutti i suoi metodi ed Intellisense si attiva fornendoci l’autocompletamento del codice, per cui procediamo con l’inizializzazione dell’oggetto exAp che erediterà i metodi di Excel ed il collegamento al file “documento.xls” da visualizzare
Dim exAP As Excel.Application
Dim exWB As Excel.Workbook
Dim exWS As Excel.Worksheet
Set exAP = Excel.Application
Set exWB = exAP.Workbooks.Open("c:\documento.xls")
Set exWS = exWB.Worksheets(1)
exWS.Activate
Ora abbiamo bisogno di un controllo spreadsheet dove visualizzare i dati, attiviamo il quadro con gli strumenti e con il bottone destro del mouse accediamo ai “controlli addizionali” ed inseriamo il collegamento alla libreria OWC10.dll Ecco che nella maschera degli strumenti ci appare il controllo “spreadsheet”
Con il solito drag and drop trasciniamo il controllo sulla form e appare la familiare griglia di excel, ora un pó di codice per poter riempire il controllo con i dati del file documento.xls, inseriamo un bottone e nell’evento click scriviamo il seguente codice:
totrange="A1:I65000"
ViewData.Spreadsheet1.ActiveSheet.Range(totrange).Value = exWS.Range(totrange).Value
exAP.Workbooks.Close
exAP.Quit
Set exAP = Nothing
È molto importante chiudere il documento Excel altrimenti non sarà possibile salvare i dati nello stesso foglio. Quello che abbiamo fatto finora si conosce come “Early Binding” o “Static Binding” (“Early Binding” = “connessione a priori”, prima della compilazione) il compilatore prima ancora di eseguire il programma già conosce l’implementazione dei metodi dell’oggetto Excel e dello spreadsheet perchè abbiamo inserito una chiamata alle librerie Excel e OWC10.dll . Early Binding è prezioso durante lo sviluppo e i test, ma cosa succede in una postazione diversa dalla nostra?
- Il pc “target” non ha Excel 2007 ma 2002: avremo un errore a runtime
- il controllo spreadsheet semplicemente “sparisce” pur essendo presente OWC10.dll
- Il pc “target” potrebbe non avere affatto Excel
Soluzione? terminato lo sviluppo dell’applicazione eliminare i riferimenti all’ambiente del nostro pc e ricorrere al “Late Binding”
Late Binding
Late o Dynamic Binding è una tecnica con cui l’implementazione del metodo non avviene a priori ma solo dopo la compilazione del programma attraverso una forma diversa di creare gli oggetti. Quando abbiamo verificato il buon funzionamento dell’applicazione si procede in questo modo:
- Eliminare il riferimento alla libreria “Microsoft Excel 12.0 Object Library
- Eliminare il riferimento al controllo addizionale “Microsoft Office Spreadsheet 10.0″
- Modificare la dichiarazione dell’elemento exAP che dovrà ereditare i metodi dell’oggetto Excel a runtime
'Codice utilizzato con la tecnica dell'EARLY BINDING"
'Dim exAP As Excel.Application
'Dim exWB As Excel.Workbook
'Dim exWS As Excel.Worksheet
'Set exAP = Excel.Application
'Set exWB = exAP.Workbooks.Open("c:\documento.xls")
'Set exWS = exWB.Worksheets(1)
'exWS.Activate
'Codice definitivo "LATE BINDING" da distribuire con l'applicazione
Dim exAP As Object
Dim exWB As Object
Dim exWS As Object
Set exAP = CreateObject("Excel.Application")
Set exWB = CreateObject("Excel.Workbook")
Set exWS = CreateObject("Excel.Worksheet")
Set exWB = exAP.Workbooks.Open("c:\documento.xls")
Set exWS = exWB.worksheets(1)
exWS.Activate
È evidente la differenza: il documento, il libro ed il foglio vengono dichiarati come oggetti generici e poi creati a runtime come oggetti derivati da Excel, in questo modo non siamo più vincolati alla nostra versione di Office. Lo spreadsheet va cancellato dalla form, deve crearsi a runtime e non graficamente, a questo scopo aggiungiamo del codice nell’evento initialize:
Public Sub UserForm_Initialize()
Dim Spreadsheet1 As New Control
Set Spreadsheet1 = ViewData.Controls.Add("OWC10.Spreadsheet", "Spreadsheet1", True)
Spreadsheet1.Left = 12
Spreadsheet1.top = 107.9
Spreadsheet1.Width = 399
Spreadsheet1.Height = 250.2
Set objSheet1 = Spreadsheet1.worksheets(1)
End Sub
Inoltre anche la lettura del documento excel nel controllo spreadsheet avviene diversamente:
totrange="A1:I65000"
'ViewData.Spreadsheet1.ActiveSheet.Range(totrange).Value = exWS.Range(totrange).Value
ViewData.Controls("Spreadsheet1").ActiveSheet.Range(totrange).Value = exWS.Range(totrange).Value
exAP.Workbooks.Close
exAP.Quit
Set exAP = Nothing
Se il computer “target” non ha nessuna installazione di Office non c’è problema basta installare Microsoft Office XP Web Component che include la libreria OWC10.dll ed il gioco è fatto. Questo post è il resoconto della soluzione di un problema reale che mi ha portato via molte ore per risolverlo, hanno contribuito alla risoluzione del problema la lettura dei seguenti siti web: Early and Late Binding: dicks-clicks.com Dynamic User Forms: Tech Trax
Popularity: 22% [?]
Related posts:
