Ognuna delle applicazioni ovvero Excel, Access, Word, etc., ha delle peculiarità, principalmente dovute alla diversità degli oggetti che in esse vengono trattati. Per fare un esempio, in Word esistono gli oggetti Document, mentre in Excel gli oggetti Worksheet, e così via.
La base del linguaggio, quindi, è una sola ed è Visual Basic (seppure in una versione "ridotta" e adattata), ma a seconda dell'applicazione che si sta utilizzando è possibile avere a disposizione degli oggetti ognuno con sue proprietà e metodi utili per automatizzare molte delle operazioni che normalmente andrebbero compiute manualmente.
Descrivere seppur brevemente tutte le possibilità offerte dall'automazione sarebbe impossibile per cui mi limiterò a descrivere come è possibile accedere ad un file di Excel dall'esterno, ovvero da un programma Visual Basic 6, o un altro file di Excel o ancora da un documento Word o un Database Access.
La metodologia non cambia e data la base comune del linguaggio le operazioni da compiere sono esattamente le stesse.
La prima cosa da considerare è che Excel stesso è un oggetto, come pure oggetti sono i suoi vari elementi gerarchicamente dipendenti come Workbook, WorkSheet, Range, Cell, etc.
Tutti questi oggetti fanno parte di una cosiddetta Libreria che, se si usa Excel, è già referenziata e fruibile senza fare null'altro, ma che va referenziata nel caso in cui si abbia intenzione di accedere ad un'applicazione Excel da un qualsiasi altro programma VB6 o applicazione Office.
Per referenziare la libreria è sufficiente andare nella finestra dell'Editor di Visual Basic attraverso Strumenti -> Macro -> Visual basic Editor - oppure premendo CTRL+F11 - scegliere da questa nuova finestra, dal menu Strumenti, la voce Riferimenti... e cercare la libreria che si chiama Microsoft Excel xx.x Object Library spuntando l'apposita casellina.

Effettuata questa semplice operazione avremo a disposizione tutti gli oggetti che Excel espone normalmente all'interno del proprio VBA.
Come accennato in precedenza la struttura degli oggetti di Excel è di tipo gerarchico, nel senso che esiste un oggetto principale ovvero Application, dal quale interdipendono via via altri oggetti.
Im maniera molto, molto semplificata, potrebbe riassumersi in questo modo:

Tenendo a mente questa struttura è facile immaginare come può essere possibile gestire più Workbook facenti parte della stessa applicazione o più Worksheet sempre dipendenti dallo stesso Workbook.
Alla base ci sono gli oggetti Range che rappresentano una cella o un loro insieme, e gli oggetti Cells attraverso i quali è possibile identificare una singola cella attraverso riga e colonna.
Ognuno di questi oggetti possiede numerosi metodi e proprietà, che sarebbe eccessivamente dispersivo trattare in questo piccolo spazio, ma che è possibile esplorare e provare con un minimo di intraprendenza e l'aiuto della Guida in Linea.
Fatta questa doverosa presentazione, entriamo nel vivo dell'argomento, ovvero l'accesso ad un file di Excel da VBA.
Proveremo, da un Documento Word, ad accedere ad un Workbook Excel salvato sul nostro HardDisk per prelevare il valore da alcune celle, importandole contestualmente sul nostro documento.
La prima cosa da fare in Word, dopo aver referenziato la libreria come descritto sopra, è aggiungere un nuovo Modulo VBA.
Si fa semplicemente scegliendo la voce Modulo dal menu Inserisci.
Nel nuovo Modulo cominciamo con l'istanziare gli oggetti che ci serviranno per accedere al nostro file di Excel, iniziando dall'Applicazione e proseguendo con il WorkBook e il Worksheet.
Dim xlApp As Excel.Application Dim xlBook As Excel.Workbook Dim xlSheet As Excel.Worksheet
Quindi creiamo una nuova sub che chiameremo Importa.
All'interno di questa dovremo occuparci di "dare vita" alla nuova istanza dell'applicazione Excel che intenderemo utilizzare, assegnando di seguito i vari oggetti, "puntandoli" sul Workbook che intendiamo aprire e sul Worksheet sul quale risiedono i dati che vogliamo importare.
C'è da precisare che accedendo ad Excel in questo modo, esso rimarrà invisibile (a meno che non si renda visibile esplicitamente), permettendoci così di effettuare le operazioni che ci servono in maniera trasparente per l'utente.
Sub Importa() 'Dichiaro le variabili locali Dim ValoreCella As String Dim i As Integer 'Creo la nuova applicazione Set xlApp = New Excel.Application 'Attraverso la nuova applicazione apro il Workbook 'assegnandolo alla variabile oggetto xlBook Set xlBook = xlApp.Workbooks.Open("C:\ImportaExcel.xls") 'Decido quale foglio utilizzare Set xlSheet = xlBook.Worksheets("Foglio1") 'Instauro un ciclo per prendere, una alla volta, il 'valore dalle prime 100 celle della prima colonna, 'passandole sul documento Word For i = 1 To 100 ValoreCella = xlSheet.Cells(i, 1).Value Application.Selection.TypeText ValoreCella & vbCrLf Next i 'Chiudo il Workbook e l'Applicazione xlBook.Close xlApp.Quit 'Annullo le variabili per liberare le risorse Set xlSheet = Nothing Set xlBook = Nothing Set xlApp = Nothing End Sub
Possiamo già provare il funzionamento del nostro codice chiudendo la finestra di Visual Basic e, da Word, andando sul menu
Strumenti -> Macro -> Macro...
per visualizzare una finestra contenente la lista di tutte le macro contenute nel Documento Word, tra le quali dovremmo trovare anche la nostra, denominata Importa. Selezioniamola e premiamo Esegui per avviarne l'esecuzione.
Se tutto è andato bene sulla pagina del Documento Word, a partire dal cursore, dovrebbe visualizzarsi la lista di valori contenuta nella prima colonna del nostro file di Excel.
Spero che questo semplice esempio sia stato abbastanza chiaro e utile a comprendere almeno i meccanismi che stanno alla base dell'automazione.
In caso contrario non esitate a chiedermi ulteriori chiarimenti.
Nel prossimo intervento proverò a spiegare come trattare Excel come un DB, accedendovi attraverso il modello ad oggetti ADO e prelevando dei valori da un Foglio di Lavoro, importandoli su una Tabella di un Database Access.

























Commenti
Se non sai nulla di programmazione sarà piuttosto arduo relazionarsi con il codice.
Ad ogni modo, il codice esposto nell'articolo, copia i valori in colonna poichè la variabile del ciclo serve ad indirizzare le righe, attraverso l'oggetto Range.
In pratica ad ogni iterazione il valore che individua la riga subisce un incremento, mentre la colonna viene mantenuta costante.
Codice:
Valore = Range(Riga, Colonna).ValueImpostando opportunamente riga e colonna potrai essere in grado di avanzare per colonne anzichè per righe, riportado poi il valore sul foglio Word.
Per il codice necessario alla costruzione di una tabella ti consigli la registrazione di alcune Macro direttamente in Word, così da ottenere il codice VBA adeguato allo scopo, che potrai modificare secondo le tue esigenze.
Ovvero dispongo di un folgio excel con un grafico gestito ad esempio in uno sheet.
Poi ho un documento word: vorrei inserire un pezzo di codice in word in VB in grado di lincarsi al foglio excel e di importarsi il grafico presente in quel foglio.
Sai se si può fare?
Ciao newuser,
La domanda non è propriamente a tema perché, sebbene sia necessario anche nel tuo caso utilizzare l'automazione, gli oggetti coinvolti sono diversi.
Per una risoluzione pressoché immediata, ti consiglio di rivolgerti all'ottima community di MasterDrive.it
In pratica dobbiamo eliminare una DLL che non è più compatibile e al suo posto scrivere una porzione di codice.
Il fatto è che la DLL creava una Collection ad albero, del tipo:
(Collection.add )
Item1
Item1
Item2
Item2
item1
Item2
Item3
Item1
Item2
Come si puà fare con codice VBA ?
grazie e ciao
Ciao Dario,
La domanda non è attinente con l'argomento trattato nell'articolo. Ti consiglio di rivolgerti all'ottima community di MasterDrive.it, dove troverai certamente la soluzione al tuo problema.
anche se è passato diverso tempo da questo articolo provo a farti un paio di richieste:
1. Vorrei prelevare i dati da un foglio excel già aperto sul pc quindi non ho bisogno di aprire excel in maniera nascosta come insegnato nel tuo articolo. Come faccio?
2. devo riempire un modulo precompilato di word quindi i dati prelevati da excel devo scriverli in punti precisi del documento di word. Come faccio a posizionarli su word?
Grazie
Dopo le istruzioni per l'apertura del Workbook (Set xlBook = ...)
ti basta inserire l'istruzione:
xlApp.Visible=True
Citazione ElDuca:
Ti segnalo la lettura di un altro mio articolo (http://thetruster.altervista.org/index.php/programmazione/articoli/21-compilare-un-modello-word-da-visual-basic-6), riguardante la compilazione di un modello Word con dei dati provenienti da Access.
Tralasciando la parte relativa ad Access, l'articolo spiega come predisporre un documento con dei campi di testo da compilare via codice.
Ho letto l'articolo, ma ho questo problema:
il file excel su cui ho i dati non è statico: il file è vuoto e viene riempito con una macro che tira su i dati da Data Base.
In pratica:
-il nostro utente riceve il file di word dal nostro cliente. -Controlla quali dati ha richiesto il cliente
-carica questi dati sul foglio excel settando opportunamente dei filtri
-copia questi dati sul modello word che gli ha inviato il cliente
(questo punto è quello che vorrei automatizzare)
Quindi il file excel è già aperto
Devo riuscire, con una macro, a prendere i dati che mi servono dal foglio excel già aperto e portarli sul documento word.
Forse sarebbe più corretto scrivere una macro sul foglio excel invece che su Word?
Un'ultima domanda: non è possibile scrivere su un determinato punto di un documento word senza usare i campi modulo?
Grazie.
Se vuoi "catturare" un'istanza di Excel già aperta, anzichè usare l'Early Binding, ovvero la creazione dell'App Excel con
Set xlApp = New Excel.Application
Puoi usare il Late Binding con la GetObject:
Set xlApp = GetObject("Excel.Application")
In questo modo, se un'istanza di Excel è già aperta verrà referenziata sulla variabile-oggetto xlApp.
Da qui puoi ciclare la collection Workbooks per referenziare il WorkBook corretto, etc...
In ogni caso, il problema così come l'hai esposto è piuttosto articolato e difficile da trattare qui, senza intasare i commenti.
Se ti va, ti consiglio l'ottima community di MasterDrive.it, della quale faccio parte, ove potrai esporre il tuo problema, confidando nell'aiuto di persone molto preparate.
mi hanno consigliato di guardare la sezione HowTo.
Magari proseguiamo la discussione di la.
Grazie di nuovo
RSS feed dei commenti di questo post.