Tutorial Come sfruttare le immagini di MS Office

Stato
Chiusa ad ulteriori risposte.

giulianovac

Access/VBA Expert
Expert
9 Giugno 2018
1.709
83
Italy
2013 2019
126
Browse Images MSO




Ciao a tutti!

Questo piccolo tutorial in realtà è un visualizzatore di immagini (da qui il nome Browse Images MSO) che mostra semplicemente come sfruttare le immagini già presenti in MS Office per abbellire e rendere più gradevoli i nostri userform.

Iniziamo con il dire che un'immagine puo' essere caricata in tre modi:

1. In fase di progettazione, detta anche design-time, selezionando prima il controllo (CommandButton, Image, ecc.) e nella finestra delle Proprietà [F4] fare clic sul pulsantino [...] che è a destra della proprietà Picture, che ci permetterà di selezionare l'immagine desiderata. Una volta caricata questa verrà inglobata nel progetto.

2. In fase di esecuzione, detta anche run-time, tramite l'apposita funzione LoadPicture() che si usa nel modo seguente:
Image1.Picture = LoadPicture(percorso_file_immagine)[/code]
In questo caso l'immagine non è inglobata e deve perciò essere distribuita insieme al file Excel. Cosa assai scomoda.

C'è da dire che nei primi due modi possiamo caricare una qualsiasi immagine dal nostro computer, senza alcun limite di dimensione mentre per quanto riguarda i tipi di immagini siamo limitati ai seguenti formati:
  • Bitmap (*.bmp; *.dib)
    Immagini raster, che se allrgate o ridotte perdono molto in qualità
  • Immagini GIF (*.gif)
    Immagini che supportano la trasparenza e le animazioni (ma servono controlli speciali)
  • Immagini JPEG (*.jpg)
    Immagine compresse con una perdità di qualità che può essere fino al 90%
  • Metafile (*.wmf;*.emf)
    Immagini vettoriali che mantengono una buona qualità anche se allargate o ridotte (al contrario di quelle raster)
  • Icone (*.ico)
    Immagini che supportano la trasparenza, un file può contenere diverse immagini di varie dimensioni e profondità di colore.
  • Cursori (*.cur)
    Immagini speciali che oltre a supportare la trasparenza, contengono una sola immagine. Hanno la particolarità di avere un pixel definito come hot-spot che è quello che indica il puntamento del cursore.

    N.B. Per creare e modificare le icone ed i cursori occorrono programmi appositi (proprio per le loro caratteristiche particolari).
3. Il terzo modo, meno conosciuto, consiste nell'utilizzare le immagini già presenti nella suite di Office, la quale mette a disposizione diverse migliaia di immagini, a seconda della versione dell suite in uso; nel mio Office 2019 ne conto ben 3244.
L'elenco completo lo trovate nel Foglio1.

Questo visualizzatore di immagini MSO (così vengono definite) vi permette di caricare un immagine qualsiasi e visualizzarla su diversi controlli tramite un'apposita funzione: GetImageMso() la cui sintassi è questa:

Function GetImageMso(idMso As String, Width As Long, Height As Long) As IPictureDisp

In cui:
  • idMso è la stringa che identifica il nome dell'immagine (ad es. "FileOpen", "FileClose", e così via...)
  • Width è la larghezza che vogliamo dare all'immagine
  • Height è l'altezza che vogliamo dare all'immagine
Nota importante
Queste immagini sono di tipo raster quindi se le allarghiamo o riduciamo troppo perdono qualità, ma per un utilizzo normale vanno più che bene. Ad esempio, per visualizzare un'immagine nel CommandButton1 useremo questo codice:

CommandButton1.Picture = Application.CommandBars.GetImageMso("FileOpen", 16, 16)

Come dicevo prima, il Foglio1 contiene l'elenco completo delle immagini (trovate nel mio Office 2019) che verranno caricate nel ListBox del form, vi basta scorrere il listbox per visualizzare l'immagine relativa.


LoadPicture
Nel riquadro LoadPicture ho inserito la possibilità di caricare un'immagine EURO.GIF a run-time (inclusa nel progetto) che una volta caricata verrà applicata a tutti controlli del form.
Ricordo che chiamare la funzione senza parametri equivale ad azzerare l'immagine nel controllo, esattamente come avviene nella routine ListBox1_Change in cui azzero l'immagine nel controllo Image2 precedentemente caricata con LoadPicture
Image2.Picture = LoadPicture()


CONCLUSIONE
Abbiamo visto quanto possa essere semplice abbellire i nostri form con immagini standard senza complicarci troppo la vita.
Come si dice in questi casi: Un'immagine vale più di mille parole!

N.B.
Nel file zip allegato troverete, oltre al progetto, i file usati nel progetto stesso (euro.gif e hadd01.ico)
 

Allegati

Marius44

VBA Expert
Moderatore
Expert
9 Settembre 2015
5.396
63
75
Catania
Excel2010
116
Ciao Giuliano
Complimenti :applausi::StrettaDiMano:my_Drinks

Assolutamente eccezionale. Grazie per la condivisione.
Ciao,
Mario
 

giulianovac

Access/VBA Expert
Expert
9 Giugno 2018
1.709
83
Italy
2013 2019
126
Un utente mi ha segnalato che potrebbe verificarsi un errore nel caso l'immagine non sia presente tra quelle elencate.
Si può agevolmente prevenire tale errore sostituendo la routine ListBox1_Change() con la seguente in cui ho aggiunto la gestione dell'errore:

Visual Basic:
Private Sub ListBox1_Change()
    Rem ------------------------------------------------------------
    Rem Senza caricare più volte la stessa immagine, possiamo immagazzinare l'immagine stessa in una variabile oggetto di tipo StdPicture
    Rem che poi potremo usare in un secondo tempo su qualsiasi controllo
    Dim picture16 As StdPicture
    Rem Intercetto eventuali errori:
    On Error Resume Next
    Set picture16 = Application.CommandBars.GetImageMso(ListBox1.Text, 16, 16)
    If Err.Number <> 0 Then
        MsgBox "Si è verificato un errore nel caricamento dell'immagine"
        Err.Clear
        Exit Sub
    End If
    Rem ------------------------------------------------------------
  
    cmdImage16.Picture = picture16
    cmdImage32.Picture = Application.CommandBars.GetImageMso(ListBox1.Text, 32, 32)
    cmdImage48.Picture = Application.CommandBars.GetImageMso(ListBox1.Text, 48, 48)
  
    Label1.Picture = picture16
    Label1.Caption = ListBox1.Text
  
    Frame1.Picture = picture16
    Image1.Picture = picture16
    OptionButton1.Picture = Application.CommandBars.GetImageMso(ListBox1.Text, 48, 48)
End Sub
In allegato il progetto corretto.
 

Allegati

Ultima modifica:
  • Like
Reactions: ges

ges

Excel/VBA Expert
Amministratore
Expert
21 Giugno 2015
18.208
113
Como
2011MAC 2016WIN
324
Grazie giulianovac @giulianovac
Eccellente :applausi:
 

alfrimpa

VBA Expert
Supermoderatore
Expert
18 Dicembre 2015
17.645
113
65
Napoli
2013
300
Come suol dirsi: “la classe non è acqua” :applausi:

Complimenti Giuliano.
 

giulianovac

Access/VBA Expert
Expert
9 Giugno 2018
1.709
83
Italy
2013 2019
126
ges @ges e alfrimpa @alfrimpa cappello_saluta

Troppo buoni!!!
MiInchino
 
Stato
Chiusa ad ulteriori risposte.

Sostieni ForumExcel

Aiutaci a sostenere le spese e a mantenere online la community attraverso una libera donazione!