TheTruster's Box

  • Increase font size
  • Default font size
  • Decrease font size
Home Programmazione Articoli Automazione 1 - Importare dati da Excel a Word

Automazione 1 - Importare dati da Excel a Word

E-mail Stampa PDF
Le applicazioni del pacchetto Office, possiedono in compendio alle loro già numerose funzioni, anche un ambiente di sviluppo integrato: il Visual Basic for Application o VBA.
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  

 
0 #1 2010-07-29 16:58
sbalordito dalla tua preparazione mi accingo a proporti un problema che mi affligge.... premetto ke di programmazione non ci capisco molto, in pratica seguendo questa tua compilazione sono riuscito a prelevare i file da excell e metterli in word, ma il mio problema principale è: copiare il valore di una cella e metterlo su una riga di word, copiare la cella seguente (sulla stessa riga ) e incollarla sulla riga subito sotto al precedente... in pratica ho la necessità di copiare dei valore da excell messi in celle adiacenti su una riga ed incollarli su una tabella in word che è disposta in colonne. spero di essere stato kiaro e ke possa rispondermial più presto.... grazie in anticipo
Citazione
 
 
0 #2 TheTruster 2010-07-29 17:06
Citazione davide:
il mio problema principale è: copiare il valore di una cella e metterlo su una riga di word, copiare la cella seguente (sulla stessa riga ) e incollarla sulla riga subito sotto al precedente... in pratica ho la necessità di copiare dei valore da excell messi in celle adiacenti su una riga ed incollarli su una tabella in word che è disposta in colonne.


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).Value

Impostando 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.
Citazione
 
 
0 #3 2010-09-12 15:30
ciao anche io avrei una domanda sul tema. vorrei scrivere un codice in grado di importare da un folgio excel un grafico.

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?
Citazione
 
 
0 #4 TheTruster 2010-09-13 07:03
Citazione newuser:
ciao anche io avrei una domanda sul tema. vorrei scrivere un codice in grado di importare da un folgio excel un grafico.


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
Citazione
 
 
0 #5 2010-09-22 14:23
devo mettere le mani su una porzione di codice VBA in Excel.
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
Citazione
 
 
0 #6 TheTruster 2010-09-22 19:31
Citazione Dario:
devo mettere le mani su una porzione di codice VBA in Excel.
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


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.
Citazione
 
 
0 #7 ElDuca 2011-11-16 09:41
Ciao TheTruster;
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
Citazione
 
 
0 #8 TheTruster 2011-11-17 08:05
Citazione ElDuca:
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?


Dopo le istruzioni per l'apertura del Workbook (Set xlBook = ...)
ti basta inserire l'istruzione:

xlApp.Visible=True

Citazione ElDuca:
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?


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.
Citazione
 
 
0 #9 ElDuca 2011-11-17 08:57
Intanto grazie della risposta.

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.
Citazione
 
 
0 #10 TheTruster 2011-11-17 20:01
Citazione ElDuca:
Devo riuscire, con una macro, a prendere i dati che mi servono dal foglio excel già aperto e portarli sul documento word.


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.
Citazione
 
 
0 #11 Elduca 2011-11-18 14:18
Ho postato il problema su master drive e per adesso
mi hanno consigliato di guardare la sezione HowTo.

Magari proseguiamo la discussione di la.

Grazie di nuovo
Citazione
 

Aggiungi commento

Si prega di aggiungere commenti in tema.
Sono assolutamente vietati messaggi volgari, pubblicitari e/o promozionali.
I commenti ritenuti non conformi saranno rimossi.


Codice di sicurezza
Aggiorna

Sondaggio

Cosa vorresti vedere di più su TheTruster's Box?
 

Utenti on-line

 3 visitatori online

MasterDrive.it



Aggiungi TheTruster's Box ai preferiti!