Gestione Immagini Collegate in Word con il VBA

Come cambiare il percorso o incorporare immagini collegate oppure viceversa come estrarre immagini incorporate e trasformarle in immagini collegate.

Gestire immagini e testo in un documento di Microsoft Word può sembrare una operazione semplice, ma come molti (noi compresi) hanno imparato a proprie spese, spesso non lo è.


Vediamo di risolvere alcuni casi particolari che possono presentarsi in pratica, soprattutto quando si ha a che fare con documenti complessi come dispense, tesi di laurea, relazioni, guide o manuali.

Come banco di prova abbiamo selezionato per questo tutorial uno stralcio del manuale di uno dei nostri corsi, il corso Internet da Zero e Posta Elettronica, ancora disponibile on line su www.mc2.it (vedi figura1).

In questo tutorial vedremo in particolare come risolvere con il VBA le seguenti problematiche:

1. Come cambiare il percorso delle immagini collegate quando si sposta il documento Word in una posizione differente da quella originale.

2. Come incorporare le immagini collegate all'interno di un documento Word eliminando tutti i collegamenti esterni.

3. Come estrarre le immagini incorporate all'interno di un documento Word in una cartella di windows separata.

4. Come trasformare le immagini incorporate in immagini collegate riducendo drasticamente le dimensioni del documento Word.

Apriamo Microsoft Word (ci riferiamo qui alla versione 2010), quindi il Visual Basic Editor (sezione Sviluppo nella barra multifunzione, icona Visual Basic).

Se non vedete la sezione Sviluppo occorre abilitare la casellina di spunta nel riquadro di destra della sezione Personalizzazione Barra Multifunzione delle Opzioni di Word.

Per gestire le problematiche 1 e 4 ci serviamo di 2 UserForm, il primo per selezionare il Nome / Percorso del documento Word da elaborare, il vecchio percorso alle immagini collegate, il nuovo percorso (di solito cambia solo la lettera dell'unità disco ma in ogni modo possiamo impostare il nuovo percorso anche se totalmente differente dal vecchio).

Il secondo UserForm è simile al primo come struttura ma ha la funzione di specificare, oltre al Nome / Percorso del documento Word, la posizione e il nome della cartella esterna dove abbiamo estratto le immagini incorporate nel documento, come vedremo più avanti in questo tutorial.

In entrambe le maschere vogliamo che venga visualizzata una barra di progressione di colore verde per informare l'utente dello stato di avanzamento dell'elaborazione immagini che verrà eseguita da una routine VBA richiamata dal clic sul pulsante OK a runtime.

In figura2 potete vedere lo UserForm1 in modalità visualizzazione struttura con la proprietà etichetta impostata su Cambia percorso immagini collegate.

Il controllo barra progressione o ProgressBar purtroppo non è disponibile immediatamente tra i controlli del VBA di Microsoft Word. Abbiamo allora utilizzato un trucco. La barra che vedete in figura è stata ottenuta attraverso la creazione di 50 controlli Label (etichetta), posizionati uno di fianco all'altro. Il nome dei 50 controlli label è lb1, lb2, lb3 e così via fino a lb50.

All'apertura dello UserForm, evento UserForm_Activate, il colore dei 50 controlli etichetta viene impostato sullo stesso colore dello sfondo della maschera (copiando il codice colore da uno qualsiasi degli altri controlli Etchetta). Vedi routine InizializzaProgressBar:

Private Sub InizializzaProgressBar()
Dim i As Integer
Dim lbName As String
ColoreSfondo = Label1.BackColor
ColoreVerde = lb1.BackColor
For i = 1 To 50
lbName = "lb" + CStr(i)
Me.Controls(lbName).BackColor = ColoreSfondo
Next
End Sub


Più avanti mostreremo il codice che fa funzionare la barra di progressione mentre è in esecuzione la routine principale.

1. Soluzione alla problematica numero1: come cambiare il percorso delle immagini collegate quando si sposta il documento Word in una posizione differente da quella originale.

Posizioniamo sulla maschera 3 controlli casella di testo con i rispettivi controlli etichetta, 2 pulsanti di comando a fianco della prima e terza casella di testo e 2 pulsanti di comando, OK e Chiudi in fondo alla maschera, come in figura.

Subito dopo l'etichetta Immagini in Elaborazione ci sono 3 altri controlli etichetta, lbPath, lbCurrent e lbTotal, che non sono visibili in figura, ma che serviranno per visualizzare a runtime rispettivamente il nome e il percorso dell'immagine in esterna in elaborazione, il numero di posizione dell'immagine all'interno del documento e il totale immagini da elaborare.

Sul clic del pulsante OK, dopo avere richiesto all'utente se intende confermare l'operazione (aggiornare il percorso delle immagini) viene eseguita la routine OpenWordDocument che a sua volta richiama la routine principale: UpdateIncludePictureFields(OldDrive, NewDrive).

Le routine si trovano nel Modulo1. Le variabili OldDrive e NewDrive (nel nostro caso sono G: e D:) vengono individuate leggendo i primi 2 caratteri da sinistra delle caselle di testo Percorso immagini attuale e Nuovo percorso.

Nel vostro caso specifico dovrete cambiare il codice CommandButton1_Click() per adattarlo alle vostre esigenze. Per esempio se cambia anche il percorso della nuova cartella alla quale volete far puntare i riferimenti delle immagini collegate nel documento.

La routine UpdateIncludePictureFields in sostanza va a modificare la proprietà SourceFullName dell'insieme LinkFormat dell'oggetto Shape corrente, sostituendo al vecchio percorso quello nuovo.

E' anche possibile effettuare questa operazione manualmente facendo clic sul collegamento Modifica collegamenti a file che si trova nella sezione File, riquadro Informazioni, richiamabile dalla barra multifunzione di Word 2010, come in figura 3.

La routine VBA ha il grosso vantaggio che elabora tutte le immagini presenti nel documento, ma occorre fare attenzione nel caso, per la verità piuttosto raro, in cui ci siano immagini collegate su drive differenti, oppure su cartelle differenti almeno per quanto riguarda la prima parte del percorso, esempio D:\MANUALI al posto di G:\GUIDA, occorre valutare caso per caso.


Aprima allora il file Manuale1.docx, che contiene le prime 50 pagine del manuale Internet da Zero e Posta Elettronica. Si tratta di un documento Word, convertito nella versione 2010, il quale contiene circa una novantina di immagini, tra l'altro non tutte collegate, alcune infatti sono immagini incorporate, altre collegate. Quelle collegate facevano riferimento a questo percorso:

G:\GUIDA\MC2_INT_DA_ZERO\

Ora invece vogliamo che il nuovo percorso sia:

D:\GUIDA\MC2_INT_DA_ZERO

La situazione del documento, prima della elaborazione, si presenta come in figura 4. E' evidente come Word non riesca a visualizzare le immagini collegate che puntano ancora al vecchio percorso (il documento è stato spostato su un altro PC e ora le immagini si trovano sull'unità D del PC corrente)

Infatti al posto della immagine, nel primo segnaposto Word visualizza una crocetta rossa e il messaggio:

"Impossibile visualizzare l'immagine collegate. E' possibile che il file sia stato spostato, rinominato e eliminato. Verificare che il collegamento rimandi al file e al percorso corretti."

Se torniamo a Modifica collegamenti a file (File, Informazioni) possiamo individuare che l'immagine fa ancora riferimento al collegamento seguente:

G:\GUIDA\MC2_INT_DA_ZERO\Instal1.jpg (figura 5)

mentre ora l'immagine si trova in questa posizione:

D:\GUIDA\MC2_INT_DA_ZERO\Instal1.jpg

E' possibile naturalmente modificare manualmente il collegamento facendo clic sul pulsante di comando Cambia origine, ma immaginate quanto tempo occorre per modificare manualmente una ad una tutte le immagine collegate!

Ecco che ci viene in aiuto il VBA. Richiamiamo la Macro MostraUserForm1 la quale apre lo UserForm1 (Sviluppo / Macro, Esegui Macro MostraUserForm1).

Facciamo clic sul pulsante di comando con i 3 puntini, immediatamento a lato della casella di testo Nuovo Percorso. Il codice VBA collegato alla routine evento Su_Click del pulsantino ci consente di selezionare una cartella e non un singolo file, mediante queste istruzioni:

Dim strFile As String
Application.FileDialog(msoFileDialogFolderPicker).Title = "Seleziona una cartella"
Application.FileDialog(msoFileDialogFolderPicker).Show
TextBox3.Text = Application.FileDialog(msoFileDialogFolderPicker).SelectedItems(1)


La costante msoFileDialogFolderPicker passata come argomento al metodo FileDialog dell'oggetto Application permette di selezionare la cartella quando si fa clic sul pulsante OK della finestra di dialogo Seleziona una cartella (FileDialog) (figura 6).

Ora non ci resta che fare clic sul pulsante OK dello UserForm1 e attendere che venga eseguita l'elaborazione. Intanto la barra di progressione e i controlli etichetta al centro della maschera ci informano sullo stato di avanzamento (figura 7).

Al termine il documento viene salvato con un altro nome (Manuale2.docx).

Il Codice VBA della routine UpdateIncludePictureFields(OldDrive, NewDrive) che permette la modifica dei percorsi delle immagini collegate è il seguente:

For i = 1 To .shapes.Count

With .shapes(i)
If .Type = msoLinkedPicture Then

OldPath = .LinkFormat.SourceFullName
If InStr(OldPath, strOldDrive) > 0 Then
NewPath = Replace(OldPath, strOldDrive, strNewDrive)
.LinkFormat.SourceFullName = NewPath
.LinkFormat.Update
End If

......
End If
End With

DoEvents

Next i


In sostanza vengono ciclati prima tutti gli oggetti Shape e poi anche quelli InlineShape, compresi quelli contenuti nelle sezioni Intestazione e Piè di pagina del documento Word.

Per ciascun oggetto shape o inlineshape viene sostituito il nuovo percorso (NewPath) al vecchio (OldPath) e quindi eseguito il metodo .LinkFormat.Update

E questo è invece il codice VBA che fa funzionare la barra di progressione, all'interno della routine UpdateIncludePictureFields(OldDrive, NewDrive):

     ' aggiorna barra di progressione
prgIndex = Int(((i / ActiveDocument.shapes.Count) * 100) / 2)
For J = 1 To prgIndex
strLbName = "lb" + CStr(J)
UserForm1.Controls(strLbName).BackColor = ColoreVerde
Next


La variabile intera prgIndex può assumere soltanto valori che vanno da 1 a 50 (che è il numero dei controlli etichetta lb della nostra barra) perchè l'espressione interna, che è una percentuale 1-100 viene divisa per 2.

L'espressione interna ((i / ActiveDocument.shapes.Count) * 100) varia in funzione dell'indice i e del numero totale degli oggetti shape, e quindi, per qualsiasi numero di controlli produrrà sempre un risultato da 1 a 100.

Il risultato finale è visibile in figura 8. Ora le immagini sono di nuovo visibili.

Se andiamo ora nuovamente a controllare il link Modifica collegamenti a file, ci accorgeremo che tutte le immagini collegate puntano ora al nuovo percorso (figura 9).


2. Soluzione alla problematica numero 2: come incorporare le immagini collegate all'interno di un documento Word eliminando tutti i collegamenti esterni.

In questo caso e nel successivo non ci servono UserForm o routine VBA. Ci sono casi in cui le dimensioni del vostro documento Word non sono un problema, per cui volete eliminare completamente i link alle immagini collegate esterne al documento ed incorporarle invece all'interno.

Per fare questo basta aprire nuovamente la finestra di dialogo Collegamenti dopo avere fatto clic sul link Modifica collegamenti a file (sezione File barra multifunzione di Word 2010, riquadro Informazioni).

Selezionate tutti i collegamenti con il mouse o con i tasti di direzione. Basta selezionare il primo, poi tenete premuto il tasto delle maiuscole sulla sinistra della tastiera e contemporaneamente premete il testo freccia giù sulla destra della tastiera.

A questo punto assicuratevi che la casellina di controllo Salva immagine nel documento, posta nell'angolo inferiore sinistro della finestra di dialogo sia selezionata (vedi figura 10).

Quindi fate clic sul pulsante Interrompi collegamento come evidenziato in figura. Il risultato è che ora il link Modifica collegamenti a file è sparito e le immagini sono state incorporate nel documento word, ora più pesante in termini di dimensioni.

Da questo momento in poi non dovrete più preoccuparvi dei collegamenti. Le immagini sono state tutte incoporate nel documento Word, come desiderato.

3. Soluzione alla problematica numero 3: come estrarre le immagini incorporate all'interno di un documento Word in una cartella di windows separata.

Contrariamente al caso prededente, ora ci siamo accorti che il nostro file .docx è troppo pesante in termini di dimensioni e quindi vogliamo ridurne le dimensioni portando fuori tutte le immagini incorporate nel documento.

Ci sono diversi metodi per risovere questo problema, anche se a prima vista non sono del tutto evidenti. Una prima soluzione potrebbe essere quella di salvare il documento in formato HTML.

In questo caso verrà prodotta una cartella con i file immagine separata dal documento principale che avrà estensione .html e conterrà ancora naturalmente il testo.

Se tuttavia volete mantenere il formato .docx per varie ragioni, esiste un'altra soluzione più elegante anche se a prima vista fuori dell'ordinario: quella di rinominare temporaneamente il documento Word in formato .zip

Noi preferiamo quest'ultima soluzione, anche perchè, abbinata alla soluzione 4 che utilizza lo UserForm2 e un'altra routine VBA, ci consente di automatizzare gran parte del procedimento, risparmiando tempo.

Aprite Esplora Risorse di Windows e localizzate la cartella in cui si trova il documento Word, nel nostro caso è Manuale3.docx, quindi rinominatelo brutalmente in Manuale3.zip (figura 11).

Noi abbiamo una versione di inglese di Windows Vista, nel vostro caso il MessageBox dovrebbe visualizzare un messaggio tipo: Se cambi l'estensione del file, il file potrebbe diventare inutilizzabile, Sei sicuro di volerlo modificare? Rispondete Sì.

Ovviamente consigliamo di fare sempre delle copie dei vostri documenti Word, ad ogni passaggio.

A questo punto fate doppio clic sul file rinominato. Nel nostro caso facciamo doppio clic su Manuale3.zip.

Sorpresa! Vi accorgerete subito che il vostro documento di Word 2010, che aveva estensione .docx, altro non era che un file compresso!

Come vedete ci sono diversi files, quelli che ci interessano sono quelli presenti nella sottocartella Word\Media (figura 12).

Si tratta dei files immagine incorporati nel documento, il loro nome è image1, image2, image3, numerati secondo l'ordine con il quale sono visibili nel documento. Se c'è una immagine nella Intestazione Pagina, solitamente viene inserita per ultima.

L'estensione può essere .jpg, .gif o .png ma in ogni caso si tratta di un file immagine. Selezionate tutti i files in corrispondenza della sottocartella virtuale word\media\ ed estraeteli invece in una cartella reale di vostra scelta, nel vostro PC.

Nel nostro caso la cartella reale è

C:\Users\Public\Progetti Word\Gestione Immagini Collegate in Word\Immagini esterne\

Dopo avere estratto tutti i files immagine potete ora rimominare il file .zip nuovamente in .docx. Nel nostro caso rinominiamo Manuale3.zip di nuovo in Manuale3.docx

Se ora riaprite il vostro documento in Microsoft Word, vi accorgerete che è tuttora integro ed esattamente uguale a come lo avevate lasciato prima di estrarre le immagini, che ora sono in una cartella separata di windows (figura 13)

4. Soluzione alla problematica numero 4: come trasformare le immagini incorporate in immagini collegate riducendo drasticamente le dimensioni del documento Word.

Questa è probabilmente l'operazione più complessa di tutte. Immaginate di avere centinaia di immagini incorporate nel vostro documento Word, che potrebbe essere una tesi di laurea, un manuale come nel nostro caso, oppure qualsiasi altro documento contenente immagini, testo, segnalibri, sezioni, tabelle, collegamenti ipertestuali, ecc.

Il problema più complesso, non ve lo nascondiamo, è quello di mantenere la formattazione del testo attorno alle immagini. Poichè non è possibile trasformare un controllo Shape o InlineShape embedded in uno linked (cioè un controllo immagine incorporata in un controllo immagine collegata, magari lo fosse), abbiamo scelto una soluzione un pò elaborata, ma che funziona, ad una condizione però: le immagini e il testo devono stare su paragrafi differenti.

Quello che vogliamo fare è sostituire automaticamente tutti i controlli immagine Shape o InlineShape che contengono immagini incorporate, con nuovi controlli immagine di tipo linked (immagine collegata) che puntano ai files .jpg, .gif o .png che abbiamo estratto e salvato precedentemente su una cartella di windows esterna al documento word.

L'operazione può essere portata a termine rispettando la posizione e le dimensioni di ciascuna immagine all'interno del paragrafo di appartenenza.

Se avete testo incorniciato la routine che ora vi presenteremo funziona ugualmente ma in questo caso quasi certamente dovrete riposizionare manualmente parecchie immagini e relativo testo.

Se invece il testo è separato in paragrafi diversi da quelli in cui sono contenute le immagini, allora tutto fila liscio e non sarà necessario apporre alcuna modifica manuale. In questo caso si dovrà però rinunciare al testo incorniciato.

Torniamo al nostro progetto Word VBA. La routine VBA ElaboraImmagini() che viene richiamata dal clic sul pulsante OK dello UserForm2, a sua volta richiamato dalla macro MostraUserForm2 non fa altro che ciclare gli oggetti Shape e InlineShape come nel caso 1, ma questa volta richiamandoli dall'interno degli oggetti Paragraph (Paragrafo).

La parte centrale della routine è la seguente:

For Each wPar In ActiveDocument.Paragraphs
With wPar.Range
If .ShapeRange.Count > 0 Then
For i = 1 To .ShapeRange.Count
N = N + 1
Set sh = .ShapeRange(i)

' legge alcune proprietà del vecchio controllo immagine prima di eliminarlo
.
' strPicName(N) contiene Percorso e Nome del file immagine da collegare
ActiveDocument.shapes.AddPicture strPicName(N), True, False, sh.Left, sh.top, sh.Width, sh.Height, wPar.Range

' NewSh è il nuovo oggetto (immagine collegata)
Set NewSh = wPar.Range.ShapeRange(1)

' ricopia le proprietà sul nuovo oggetto Shape
.
' elimina il vecchio oggetto (immagine incorporata)
sh.Delete
' passa al successivo oggetto ShapeRange se presente all'interno dello stesso paragrafo
Next i
End If
End With
DoEvents
' passa al wPar successivo
Next

.


In sostanza la routine ElaboraImmagini passa in rassegna, paragrafo per paragrafo, tutto il documento Word, individua i controlli immagine incorporata (la cui proprietà .LinkFormat non esiste), ne legge le proprietà come Top, Left, Width, Height, Tipo disposizione testo e Lato disposizione testo inlcusi, aggiunge un nuovo controllo immagine, questa volta con collegamento esterno, ricopia le proprietà sul nuovo controllo in modo da sovrapporlo al vecchio, quindi elimina il vecchio (sh.Delete).

I nuovi controlli con immagine collegata avranno la proprietà .LinkFormat impostata sull'immagine esterna e, se disgiunti dal testo, appariranno esattamente nella stessa posizione di quelli vecchi, che vengono eliminati automaticamente.

le dimensioni dell'immagine sono quelle del vecchio controllo e non quelle del file immagine originale.

Il codice VBA per l'aggiornamento della barra di progressione verde è invece il seguente:

      UserForm2.lbPath = strPicName(N)
UserForm2.lbCurrent = CStr(N)
' aggiorna barra di progressione
prgIndex = Int(((N / Max) * 100) / 2)
For J = 1 To prgIndex
strLbName = "lb" + CStr(J)
UserForm2.Controls(strLbName).BackColor = ColoreVerde
Next



Il funzionamento è analogo a quello visto nel caso 1. L'espressione interna N/Max*100 ci assicura che il valore è una percentuale prima di dividerlo per 2 per individuare il controllo etichetta lb (da 1 a 50) il cui colore deve essere portato a verde.

Il secondo ciclo serve ad evitare che alcune etichette vengano saltate, con conseguente spiacevole effetto grafico!

Nella figura 14 è mostrata lo UserForm2 a runtime.

Le dimensioni del documento di Word Manuale3.docx, cioè del documento prima dell'elaborazione, quello con le immagini incorporate, sono di 2.490 KB (Prime 18 pagine soltanto). Il Manuale completo è di 279 pagine!

Il nuovo file, Manuale4.docx, risultato dell'ultima elaborazione, occupa invece soltanto 57 KB! (figura 15)

Dal punto di vista dell'aspetto grafico, il nuovo documento, Manuale4.docx non necessita di alcun intervento, anche perchè avevamo portato fuori il testo dai paragrafi che contenevano le immagini.

Ci siamo però accorti soltanto all'ultimo momento che ce ne era scappata una, con testo incorniciato, eccola nella figura 16, sostituita dal nuovo controllo immagine collegata, in questo caso non ha dato alcun problema di impaginazione!

Ci resta soltanto un ultimo controllo da effettuare. Verifichiamo che il link Modifica collegamenti a file sia presente ora nel riquadro Informazioni, sezione File della barra multifunzione di Word. Facciamo clic e apriamo la finestra Collegamenti, la quale ci mostra le immagini collegate al documento con il rispettivo percorso (figura 17).



Avvertenza !

Il file zip dell'esempio Gestione Immagini Collegate in Word con il VBA contenente il progetto completo incluso il codice vba in chiaro di cui si discusso in questo tutorial, disponibile nell'area 'Videotutorial Download' riservata agli iscritti ai nostri corsi on line.

Nella colonna di destra puoi vedere una anteprima della 'Videotutorial Download area' e quanti e quali altri progetti Access, Excel, VBA sono disponibili.

Acquista anche uno solo dei nostri corsi per avere immediatamente accesso alla 'Videotutorial Download Area': facile, basta un clic:

http://www.mc2.it






Tutorials di informatica argomenti avanzati


Home page MC2 E-Learning



Dr.Maurizio Cucchiara

Amministratore unico
MC2 E-Learning S.a r.l.
Formazione per il Web
autore del corso:
"VBA Corso Base"
disponibile on line su questo sito
http://www.mc2.it/html/vba.html

Condividi sui social network:

Social buttons



Iscriviti al nostro
nuovissimo
canale Youtube!


Iscrivi al nostro canale Youtube



Potrai restare aggiornato
sui nostri pi recenti
video-tutorial su:
Microsoft Access ed Excel
e molto altro...



Cerca sul web con Google:




Guarda il video-tutorial
sul nostro canale Youtube:


Gestione immagini collegate in Word con VBA

NOVITA'!

'VIDEO TUTORIAL
DOWNLOAD AREA'

(Fai clic sull'immagine
qui sotto per vedere
una anteprima della
pagina di accesso)



L'accesso riservato agli iscritti ai corsi on line www.mc2.it

Acquista anche uno solo
dei nostri corsi
per avere immediatamente
accesso alla
'Videotutorial Download Area': facile, basta un clic:

http://www.mc2.it



Iscriviti alla newsletter: E' GRATIS! (?)

 Nome: (?)

 (?)

e-mail: (?)

 (?)

Newsletter:

formato preferito:

Microsoft Access (?)

Impariamo Excel e il VBA(?)

Internet "da zero"! (?)

Html (?)

Consiglio

(?) = Aiuto

Leggi qui la Informativa completa sulla privacy.