In
questo articolo si vedrà come rendere l'aggiunta sensibile
alle modifiche apportate dall'utente sul foglio di calcolo
e sull'applicazione Excel.
A tale scopo deve essere fatta una piccola modifica al progetto
analizzato nell'articolo precedente: sarà necessario
aggiungere un modulo (denominato per impostazione Module1)
e lì dichiarare come globale la variabile oggetto appOffice.
Global
appOffice As Object |
Questo
perchè adesso si utilizzerà anche Form1 oltre
al modulo Connect: la variabile che indica l'applicazione
Office deve perciò essere valida in entrambi i moduli
di codice.
All'interno del modulo Module1 è inoltre possibile
inserire il codice che permette all'aggiunta di essere sempre
in primo piano rispetto al foglio di calcolo, per evitare
che venga nascosta una volta attivato il foglio. Come mostrato
nel codice presente nell'Archivio quindi:
Sub
AlwaysOnTop(FrmID As Form,
OnTop As Integer)
Const SWP_NOMOVE = 2
Const SWP_NOSIZE = 1
Const FLAGS = SWP_NOMOVE
Or SWP_NOSIZE
Const HWND_TOPMOST = -1
Const HWND_NOTOPMOST = -2
If OnTop = -1 Then
OnTop = SetWindowPos(FrmID.hwnd, HWND_TOPMOST, 0, 0, 0,
0, FLAGS)
Else
OnTop = SetWindowPos(FrmID.hwnd, HWND_NOTOPMOST, 0, 0,
0, 0, FLAGS)
End If
End Sub |
Adesso
si può passare al codice di Form1. Siccome si utilizzeranno
gli oggetti propri di una sessione Excel, è necessario
importare la libreria relativa all'interno dell'applicazione,
come già visto negli articoli della rubrica 'Visual
Basic per Excel'.
Si provi a scrivere una cosa del genere:
Dim
sessioneExcel As Excel.Application
Dim cartExcel As
Excel.Workbook
Dim foglioExcel As
Excel.Worksheet |
E
si controlli nella combobox della finestra di Visual Basic
quali oggetti sono a disposizione. Adesso si modifichi il
codice appena visto in questo modo:
Dim
WithEvents
sessioneExcel As Excel.Application
Dim WithEvents cartExcel
As Excel.Workbook
Dim WithEvents foglioExcel
As Excel.Worksheet |
E
si controlli nuovamente la combobox: sono presenti tre nuovi
oggetti coi relativi eventi: cartExcel, foglioExcel e sessioneExcel.
Questo
perché WithEvents rende l'applicazione sensibile alle
modifiche apportate sugli oggetti caratteristici di Excel.
In questo modo ad esempio si può visualizzare una finestra
di messaggio ogni volta che l'utente seleziona una cella specifica
e più in generale si possono utilizzare tutti gli eventi
di cui si compone la libreria di Excel.
Adesso
si consideri la sottoprocedura Load di Form1:
Private
Sub
Form1_Load()
'
'
'
End Sub |
Il
problema ulteriore è di più difficile comprensione:
nel modulo Connect è stata dichiarata e definita una
variabile oggetto indicante una generica applicazione Office:
appOffice.
Nel modulo di codice di Form1 invece si utilizza una seconda
applicazione, sessioneExcel. Come indicare all'aggiunta che
queste due applicazioni sono in realtà la stessa?
Semplicemente eguagliando le due variabili oggetto, nel seguente
modo:
Set
sessioneExcel = appOffice |
Se
infatti si fosse dichiarata sessioneExcel come in tutti gli
altri articoli in questo modo:
Dim
sessioneExcel As New Excel.application |
si
sarebbe creata una nuova sessione Excel, e ci si sarebbe quindi
trovati con due applicazioni Excel: appOffice e sessioneExcel.
In quel caso non si sarebbe potuto utilizzare né il
foglio di calcolo dell'applicazione Excel in cui è
stata caricata l'aggiunta, né la cartella di lavoro.
Altro
problema: appOffice, nella quale è caricata l'aggiunta,
apre automaticamente un nuovo foglio di calcolo all'interno
di una nuova cartella di lavoro.
Com'è possibile indicare all'aggiunta di operare proprio
su quel foglio e su quella cartella, invece di aprirne di
nuovi? Attraverso gli oggetti ActiveSheet ed ActiveWorkbook:
Set
cartExcel = sessioneExcel.ActiveWorkbook
Set foglioExcel = sessioneExcel.ActiveSheet |
che
rappresentano rispettivamente la cartella di lavoro ed il
foglio di calcolo correntemente utilizzati dall'applicazione
Excel.
Per chiudere la sottoprocedura, si può inserire la
linea di codice che, richiamando la routine di Module1, consenta
di visualizzare la finestra dell'aggiunta in primo piano rispetto
al foglio di calcolo:
Adesso
il più del lavoro è terminato. Quello che rimane
consiste solamente nell'applicazione dei concetti visti nel
corso degli articoli della rubrica 'Visual Basic per Excel',
riferiti questa volta ai vari eventi degli oggetti sessione
Excel, cartella di lavoro Excel e foglio di calcolo Excel.
Un
semplice esempio può essere rappresentato proprio da
quello che era già stato anticipato: un controllo TextBox
su Form1 che visualizzi il valore della cella selezionata
dall'utente.
Parlando di celle si fa dunque riferimento all'oggetto foglioExcel
e parlando di selezione ci si riferisce all'evento SelectionChange
dell'oggetto Excel.Workbook:
Private
Sub
foglioExcel_SelectionChange(ByVal
Target As Excel.Range)
'
'
'
End Sub |
dove
al posto dei commenti si può inserire l'assegnazione
del valore della cella alla casella di testo:
On
Error Resume Next
Text1.Text = Target.Value |
E'
però necessario notare due cose, legate tra loro: il
parametro Target dell'evento è (come indica la definizione
Excel.Range) un Range, ossia un insieme di celle.
E' impossibile visualizzare pertanto il valore delle celle
nella casella di testo se queste sono più di una.
Ecco la ragione della linea di codice precedente (On Error
Resume Next) che serve proprio ad evitare l'errore in questi
casi.
Naturalmente l'aggiunta può essere ben più complessa
rispetto a questo semplice esempio ma il suo scopo è
quello di rendere l'idea di come adesso sia possibile utilizzare
non soltanto gli oggetti e le relative proprietà della
libreria di Office, ma anche tutti gli eventi da essi supportati.
Ed
il risultato di un'applicazione di questo genere può
essere rappresentato graficamente dall'immagine sottostante:
Il
progetto completo che costituisce l'aggiunta può essere
scaricato da qui.
|