Nel
corso di questo articolo si studierà la struttura di
un'aggiunta ad un'applicazione Office, mentre nel prossimo
(l'ultimo) verrà visto come far diventare la generica
sessione Office, una vera e propria applicazione Excel in
modo da poter sfruttare pienamente tutti gli articoli dell'area
"Visual Basic per Excel" e permettere all'aggiunta
di reagire agli eventi provocati dall'utente sul foglio di
calcolo, di lavoro e sull'applicazione Excel.
Fatta la premessa riguardante la differenza tra l'utilizzo
della libreria di Office e quella di una qualsiasi applicazione
del pacchetto Microsoft, si può ritornare al codice.
Nelle dichiarazioni generali del modulo Connect si andrà
quindi a dichiarare un oggetto generico (lo si può
denominare appOffice).
Che senso ha tale operazione? Come già visto nell'articolo
precedente, una volta collegata l'aggiunta ad Excel, il sistema
passa all'evento OnConnection il parametro (Application) che
indica quale applicazione è stata integrata.
Per tale motivo se all'interno del codice dell'evento OnConnection
si può scrivere:
una
finestra di messaggio mostrerà che l'aggiunta è
integrata ad Excel ossia che il parametro Application corrisponde
a MS Excel.
Ma siccome il parametro è strettamente legato all'evento
connessione, risulta pressoché impossibile utilizzarlo
in qualsiasi altra sottoprocedura del modulo Connect.
Se esempio nella routine dell'evento OnDisconnection si ripete
la stessa linea di codice:
il
risultato mostrato dalla finestra di messaggio sarà
una stringa vuota "" proprio perché all'interno
della routine Application non è definito.
Dichiarando l'oggetto generico appOffice e definendolo (ossia
dandogli un valore) all'interno della sottoprocedura OnConnection
ci si può riferire all'applicazione Excel in qualunque
punto del modulo Connect.
Dunque, il codice finora visto si modifica in questo modo:
Dim
appOffice As Object
Private Sub AddinInstance_OnConnection(ByVal
Application As Object, _
ByVal ConnectMode As
AddInDesignerObjects.ext_ConnectMode, _
ByVal AddInInst As
Object, custom() As Variant)
On Error Resume Next
Set appOffice = Application
'applicazione passata dal sistema
alla routine 'attraverso il parametro Application
End Sub |
Per
dimostrare ulteriormente come i parametri vengano passati
alla sottoprocedura OnConnection, si può dare un'occhiata
anche al parametro AddInInst che indica il riferimento all'aggiunta.
Combinando l'oggetto AddInInst e l'oggetto Application, si
può programmare l'apertura di una finestra di messaggio
alla connessione dell'aggiunta:
MsgBox
"Caricamento di " & AddInInst & "
integrata in " & Application & " _ effettuato." |
Il
risultato sarà del tipo:
Siccome
questo è il primo risultato effettivamente visibile,
conviene fare una parentesi: non è sufficiente salvare
il progetto perché questo si aggiunga ad Excel.
E' necessario creare un file .dll e salvarlo in una cartella
qualsiasi. Il procedimento non necessita di registrazione
manuale dell'aggiunta: alla creazione della .dll l'applicazione
sviluppata si aggiungerà automaticamente alla lista
degli add-in di Excel.
Per ricapitolare, salvare l'intero progetto e successivamente
selezionare la voce Crea MyAddIn.dll dalla lista File del
menu principale di Visual Basic. Aprendo Excel si potrà
quindi visualizzare la finestra di messaggio a cui si accennava
poco sopra.
Nota: in alcuni casi può capitare una chiusura non
corretta di Excel. In tale eventualità l'aggiunta non
verrà scollegata correttamente e pertanto, al momento
di un successivo salvataggio della dll si visualizzerà
il seguente messaggio di errore:
L'aggiunta
infatti risulta ancora connessa ed attiva e pertanto non è
possibile modificarla.
Per ovviare al problema chiudere l'applicazione Excel residente
in memoria (utilizzando il Task Manager o qualsiasi altro
mezzo a disposizione) e salvare nuovamente la dll.
Dopo aver visto le funzioni della variabile oggetto Application
è necessario ritornare all'effetto principale dell'aggiunta:
l'inserimento di un pulsante nella toolbar di Excel.
Per fare riferimento all'oggetto toolbar di Office è
necessario estrarlo dalla libreria di Office, nella quale
prende il nome di CommandBar.
Ed un suo singolo elemento, un pulsante generico della toolbar
prende il nome di CommandBarButton.
Per questo motivo si può inserire nelle dichiarazioni
generali del modulo Connect la dichiarazione di un generico
pulsante di una generica toolbar di una generica applicazione
Office:
Dim
WithEvents Pulsante As Office.CommandBarButton |
dove
WithEvents è una parola chiave che indica alla
variabile oggetto Pulsante che dovrà reagire agli eventi
generati da un oggetto esterno (in questo caso di CommandBarButton
che è esterno in quanto facente parte di della libreria
Office, esterna rispetto a Visual Basic).
Una volta dichiarata la variabile oggetto Pulsante, è
necessario definirla.
Set
Pulsante = Application.CommandBars("Standard").Controls.Add(1) |
Ulteriore
parentesi: l'oggetto CommandBar è composto da più
elementi quante sono le barre degli strumenti dell'applicazione
Office.
Per rendersi conto di questa affermazione basta semplicemente
dare una scorsa alla lista tramite la voce "Barre degli
strumenti" dal menu "Visualizza":
Indicando
la dicitura Standard nella linea di codice appena vista, si
indica che variabile oggetto Pulsante sarà un elemento
della barra degli strumenti Standard (vedere la figura del
pulsante inserito nella barra, pubblicato nell'articolo precedente).
Una volta che è stato definito l'oggetto Pulsante,
è possibile assegnargli le proprietà tipiche
di un pulsante di una toolbar: il nome, il testo visualizzato
al passaggio del mouse e così via.
Iniziando dal nome si può scrivere:
With
Pulsante
.Caption = "Visual Basic Italia"
|
in
secondo luogo si può definire lo stile del pulsante
stesso in base ad alcuni valori:
msoButtonAutomatic:
adatta il proprio stile a quello del resto dei pulsanti della
toolbar;
msoButtonIcon imposta il pulsante come icona;
msoButtonCaption: imposta il pulsante come solo testo;
msoButtonWrapCaption: imposta il pulsante come solo
testo adattando le dimensioni alla lunghezza del testo;
msoButtonIconAndCaption: imposta il pulsante come testo
ed icona affiancati;
msoButtonIconAndCaptionBelow: imposta il pulsante come
icona con testo allineato in basso;
msoButtonIconAndWrapCaption: imposta il pulsante come
icona e testo adattando le dimensioni alla lunghezza del testo;
msoButtonIconAndWrapCaptionBelow: imposta il pulsante
come icona con testo allineato in basso adattando le dimensioni
alla lunghezza del testo;
.Style
= msoButtonCaption |
In
aggiunta si può determinare se il pulsante è
abilitato o meno:
Nel
caso in cui il pulsante sia disabilitato si otterrà
un risultato del tipo:
e
così via. Le proprietà dell'oggetto CommandBarButton
sono così tante che vanno al di là dello scopo
di questo singolo articolo.
L'ultima caratteristica che si analizzerà è
l'associazione tra pulsante ed aggiunta. Attraverso la proprietà
OnAction si determina quale aggiunta (o macro) chiamare in
causa nel caso di pressione del pulsante:
.OnAction
= "!<" & AddInInst.ProgId & ">"
End With
|
Adesso
scorrere la combobox degli oggetti nella finestra di progettazione
di Visual Basic. Si vedrà che all'oggetto Pulsante
è associata nella ComboBox accanto l'evento Click.
Questo rappresenta chiaramente l'eventualità in cui
l'utente clicchi sul pulsante. In tal caso non si farà
altro che visualizzare la form di cui si compone il progetto:
Private
Sub
Pulsante_Click(ByVal Ctrl As Office.CommandBarButton,
_
CancelDefault As Boolean)
frmAddIn.Show
End Sub |
L'ultima
considerazione dev'essere fatta riguardo alla rimozione dell'aggiunta.
In tale eventualità il pulsante dovrà essere
eliminato dalla toolbar, mentre l'aggiunta verrà rimossa
in modo automatico:
Private
Sub
AddinInstance_OnDisconnection(ByVal
RemoveMode As _
AddInDesignerObjects.ext_DisconnectMode, custom()
As Variant)
On Error Resume Next
Pulsante.Delete
Set Pulsante = Nothing
Set appOffice = Nothing
End Sub |
Col
metodo Delete si impone al pulsante di lasciare la propria
posizione nella toolbar. Con le due righe di codice successive
si svuota la memoria utilizzata fino ad allora per memorizzare
la variabile oggetto pulsante e l'applicazione Office.
|