lunedì 2 gennaio 2012

[Word VBA] Gestione Automatica Immagini in Document

Descrizione :
Un mio esempio pratico su come automatizzare inserimento e proprietà di immagini in Word.

+ Articolo :

Sebbene Word non sia lo strumento d'elezione per questo genere di operazioni, tuttavia, grazie al supporto VBA, è possibile usarlo per automatizzare l'inserimento e la modifica di immagini a livello di Document, per la creazione dinamica e successiva stampa di documenti.

Ho deciso di inserie questo articolo nel mio Blog, prendendo spunto da una soluzione data da me su un Forum tecnico, anche perchè il materiale disponibile online su Word VBA spesso è molto disordinato e, come sempre, il codice generato dal Macro Recorder non è certo oro colato.

Di seguito faccio due esempi, semplici ma non banali, sull'inserimento di immagini nuove in un Document, e sulla modifica delle propretà di immagini già presenti.

1. Nuova Immagine :

--> Inserisco un'immagine da disco in una posizione definita del documento :

    Dim nuovaShape As Shape
    Set nuovaShape = ThisDocument.Shapes.AddPicture(FileName:="C:\Test.jpg", LinkToFile:=False, _
                     SaveWithDocument:=True, Left:=50, Top:=50)

--> Posso anche forzarne le dimensioni con :
    Set nuovaShape = ThisDocument.Shapes.AddPicture(FileName:="C:\Test.jpg", LinkToFile:=False, _
                     SaveWithDocument:=True, Left:=50, Top:=50, Width:=300, Height:=200)

Ho volutamente omesso la parte riguardante il reperimento dei percorsi di tutte le eventuali immagini da caricare nel Document. Le opzioni in VBA sono molteplici, dall'uso di una semplice FileDialog, alla scansione di percorsi specifici con funzioni built-in come Dir(), o meglio con la libreria Microsoft Scripting Runtime Library ( che in genere raccomando in VB6 e VBA... ).

--> Settaggio della Posizione Dietro / Davanti al testo :
    nuovaShape.ZOrder msoSendBehindText 'Dietro al testo
    nuovaShape.ZOrder msoBringInFrontOfText 'Davanti al testo

--> Bordo linea nero da 1 Pixel :
    With nuovaShape.Line
        .Weight = 1# ' 1 Pixel
        .DashStyle = msoLineSolid ' Stile
        .ForeColor.RGB = RGB(0, 0, 0) 'Nero
        .Visible = msoTrue
    End With

2. Immagini Esistenti :
In questo secondo esempio invece, vado a definire alcune proprietà importanti su tutte le immagini eventualmente già presenti nel Document corrente :
    Dim InS As InlineShape
    For Each InS In ThisDocument.InlineShapes
        If InS.Type = wdInlineShapePicture Then
            With InS.ConvertToShape
                'POSIZIONE
                .ZOrder msoSendBehindText 'Dietro al testo
                
                'LINEA BORDO
                .Line.Weight = 1# ' 1 Pixel
                .Line.DashStyle = msoLineSolid ' Stile
                .Line.ForeColor.RGB = RGB(0, 0, 0) 'Nero
                .Line.Visible = msoTrue
                
                'BLOCCA PROPORZIONI
                .LockAspectRatio = msoFalse 'msoTrue
                
                'DIMENSIONI
                .Width = 300
                .Height = 200
            End With
        End If
    Next InS

Come è facile vedere, anche dal "gioco di parole" tra Shapes, InlineShapes, "With InS.ConvertToShape", ecc., la gestione un po' avanzata di questi oggetti nel Word VBA non è particolarmente intuitiva.
Ciò nonostante, alla fine tutto diventa possibile ( o quasi ).

+ Fine Articolo.

Un Click su "Mi Piace" è il modo migliore per ringraziare l'autore di questo articolo.



1 commenti:

Raffaele ha detto...

da inserire in modello +/- a metà pagina : per la posizione, se volessi usare segnalibro? La posizione è variabile, visto il testo inserito in precedenza in alto.
Il riempimento del modello è gestito da access a pressione di un pulsante alimenta i segnalibri con dati del record corrente dell maschera. in questa maschera è presente un grafico che dovrei riportare sul modello. è possibile farlo se si in che modo?
grazie. Aggiungo che in vba lo mastico da poco.
grazie

Posta un commento

 
Design by Free WordPress Themes Modificato da MarcoGG