VBA: una macro per creare automaticamente le didascalie delle figure di un documento Word

Capita spesso di generare un documento Word esportandolo da un altro tool nel quale si é svolto tutto il lavoro di inserimento dei contenuti e delle figure. Una volta esportato il documento, eventualmente anche fornendo un template al tool utilizzato, possono però essere necessari ulteriori interventi sulla formattazione del documento generato. Interventi che a volte vengono eseguiti manualmente e possono anche richiedere diverso tempo.

In questo post vediamo un esempio in cui, nel documento esportato dal tool utilizzato per crearlo, i testi che dovrebbero rappresentare le didascalie delle figure sono esportati come testo semplice, con stile di formattazione “Normale”, subito al di sotto delle figure stesse e non come veri oggetti didascalia.
Possiamo vedere la situazione appena descritta nella figura seguente che mostra un documento di esempio dove le diciture “Figura 1: ….” e “Figura 2: …” sotto alle figure sono dei semplici testi e non degli oggetti didascalia con il relativo campo di numerazione.

[FIGURA 1]
Document with images

Potremmo in questo caso inserire manualmente (MAI!) le didascalie, andando su ciascuna figura, cliccando con il tasto destro del mouse, selezionando “Inserisci Didascalia” e facendo taglia/incolla del testo sotto la figura nel box che ci viene mostrato, come illustrato nelle 2 figure seguenti.
[FIGURA 7]
Menu Inserisci Didascalia

[FIGURA 8]
Inserisci Didascalia Form

Ovviamente questo procedimento manuale é impensanbile da utilizzare quando, come nel mio caso, le immagini presenti nel documento sono qualche centinaio. Per questo motivo, automatizzeremo il procedimento scrivendoci una macro in VBA (Visual Basic for Application).

Ok, mettiamoci all’opera per scrivere la macro che ci permetterà di creare automaticamente le didascalie di tutte le figure prendendo il testo dal primo
paragrafo sotto alle figure stesse. Quindi, quello che dobbiamo fare é:

1) identificare tutte le figure
2) per ciascuna di esse recuperare il testo immediatamente successivo
3) creare l’oggetto didascalia e settare le proprietà che vogliamo dargli
4) cancellare il testo semplice originale

Ecco come si traduce questo algoritmo descritto a parole in codice VBA:

Public Sub CreaDidascaliaFigure()

Dim i As InlineShape
Dim p As Paragraph
Dim s As String

    For Each i In ThisDocument.InlineShapes
        Set p = i.Range.Paragraphs(i.Range.Paragraphs.Count).Next
        s = p.Range.Text
        i.Range.InsertCaption Label:=wdCaptionFigure, Title:=": " + s, Position:=wdCaptionPositionBelow
        i.Range.Paragraphs.Last.Next.Alignment = wdAlignParagraphCenter  'allinea la label'
        p.Range.Delete
                    
    Next

End Sub

Analizziamo brevemente il codice prima di andare ad eseguirlo:
InlineShapes ritorna una collection di tutte le InlineShape (senza ‘s’ finale)
presenti nel documento sul quale viene utilizzata, in questo caso “ThisDocument”, cioé quello su cui stiamo eseguendo la macro. A questo punto prendiamo il paragrafo successivo (Next) all’ultimo paragrafo del Range dell’immagine e recuperiamo il suo valore (p.Range.Text). Inseriamo poi, nel Range della nostra InlineShape i, la didascalia (InsertCaption) definendo il tipo di label che vogliamo fare comparire (la costante wdCaptionFigure ci permette di far precedere il nostro testo dalla stringa “Figura X:”) e la posizione della didascalia rispetto alla figura (wdCaptionPositionBelow, cioé al di sotto). Specifichiamo ancora che vogliamo allineare la didascalia al centro (Alignment = wdAlignParagraphCenter). Infine, eliminiamo il paragrafo contenente il testo vecchio che é ormai presente come didascalia vera e propria.

Bene, é il momento di provare ad eseguire la nostra macro.
Dal nostro documento Word andiamo nel menù “Visualizza” e poi clicchiamo sull’icona “Macro”. Nella finestra di dialogo che si apre indichiamo il nome della macro e premiamo sul pulsante “Crea”. Si aprirà a questo punto la finestra dell’ambiente di sviluppo “Visual Basic, Application Edition” nella quale andiamo ad inserire il codice della macro scritto in precedenza.

Immagine2

A questo punto eseguiamo la macro cliccando sul tasto “Run” (la freccia verde) ed andiamo a vedere cosa è successo nel nostro documento:

Immagine3

Come possiamo vedere nella parte selezionata ed evidenziata in azzurro, quello che prima era un semplice testo con formattazione “Normale” ora è una vera e propria didascalia, posta sotto all’immagine ed allineata centralmente, proprio come avevamo richiesto alla macro attraverso le costanti viste commentando il codice.
C’è però un problema! La dicitura “Figura 1” è ripetuta 2 volte.
Una, la prima, è la vera e propria label della didascalia e comprende anche il numero progressivo della figura rappresentato da un oggetto “campo” (evidenziato in grigio) mentre la seconda è la parte testuale residua del messaggio originale. Dobbiamo quindi rimuovere quest’ultima. Procediamo!
Quello che dobbiamo fare quindi è eliminare dal testo originale presente sotto alla figura la dicitura “Figura X:” che verrà sostituita dalla label effettiva della didascalia. Per fare questo prendiamo semplicemente la parte di testo dal carattere ‘:’ in poi, utilizzando la funzione InStr per trovare la posizione in cui compaiono i ‘:’ e poi utilizziamo la funzione Right che estrae una sottostringa di n caratteri a partire dal fondo destro della stringa. Il numero di caratteri che dobbiamo estrarre è dato dalla lunghezza della stringa, che ricaviamo tramite la funzione Len, meno la posizione del carattere ‘:’ che abbiamo trovato.
Ecco quindi come diventa il nuovo codice della macro, nella quale ho aggiunto anche due Print di debug, per verificare l’efficacia della manipolazione della stringa della didascalia:

Public Sub CreaDidascaliaFigure()

Dim i As InlineShape
Dim p As Paragraph
Dim s As String

    For Each i In ThisDocument.InlineShapes
        Set p = i.Range.Paragraphs(i.Range.Paragraphs.Count).Next
        s = p.Range.Text
        Debug.Print "Prima: " + p.Range.Text
        pos = InStr(p.Range.Text, ":")
        s = Right(p.Range.Text, Len(p.Range.Text) - pos)
        Debug.Print "Dopo: " + s
        i.Range.InsertCaption Label:=wdCaptionFigure, Title:=": " + s, Position:=wdCaptionPositionBelow
        i.Range.Paragraphs.Last.Next.Alignment = wdAlignParagraphCenter  'allinea la label'
        p.Range.Delete
                    
    Next

End Sub

Prima di eseguire la nuova versione della macro, se avete ancora il documento aperto con il risultato della precedente esecuzione, quella che ha prodotto la didascalia con la doppia label, occorre effettuare qualche operazione di undo e riportare il documento allo stato iniziale (quello della prima figura di questa post). In alternativa potete chiuderlo senza salvarlo e riaprirlo.
Una volta ripristinata la situazione di partenza, non ci resta che eseguire nuovamente la macro.


Macro execution output

Avendo inserito le print per il debug, vediamo comparire delle informazioni nella parte bassa dell’ambiente di sviluppo di VBA, denominata “Immediata”. Quello che viene mostrato è, per ogni figura, il testo originale presente sotto di essa (Prima) ed il testo risultante dall’elaborazione per l’estrazione della parte successiva al carattere ‘:’ (Dopo)
Dai risultati mostrati possiamo vedere che la macro ha correttamente rimosso la dicitura “Figura X:” da ciascun testo, mantenendo solo la parte dai ‘:’ in poi.
Andiamo a verificare nel documento.

Macro Output Didascalia

Come possiamo vedere, con l’esecuzione della nuova versione della macro il problema della doppia label è stato risolto ed ora ogni immagine presenta la corretta didascalia con la label contenente il campo per la numerazione delle figure (in grigio).

Come ulteriore prova, selezioniamo il testo della didascalia ed andiamo a vedere il suo stile che, come illustrato dalla figura seguente, è appunto “Didascalia”.

Output Macro Stile Didascalia

Grazie a questa macro ho potuto creare in pochi secondi tutte le didascalie delle circa 300 immagini che conteneva il mio documento!

This entry was posted in $1$s. Bookmark the permalink.

3 thoughts on “VBA: una macro per creare automaticamente le didascalie delle figure di un documento Word

    • Ciao,
      non ti funziona in che senso? Non ti vengono create le didascalie o si verifica qualche errore? Se fornisci qualche dettaglio in più magari possiamo provare a farla funzionare anche per il tuo caso.

  1. Buongiorno Davis. Sarebbe possibile avere il testo “Figura X:”, che viene inserito dalla macro, in grassetto? Il codice funziona perfettamente ma vorrei che quella parte fosse in grassetto mentre il testo che descrive la figura fosse in carattere normale.
    Grazie,
    Francesco.

Leave a Reply to Davis Molinari Cancel reply

Your email address will not be published. Required fields are marked *