Utilizzo della Shell di sistema per aprire files. -
dal 04/09/04 pagina vista:
volte
Facendo seguito ad
una parte di quanto contenuto nell'articolo precedente "Usare
l'Hperlinks", relativo all'apertura di files attraverso l'apertura
prima dell'Applicativo associato all'estensione e quindi del file, presento
un'altro modo per aprire files, basato non più sull'Hyperlinks, ma sul
metodo Run associato alla funzione
CreateObject.
-
Il metodo
Run esegue una macro o richiama una funzione.
Può essere utilizzata per eseguire una macro scritta in linguaggio Visual
Basic o nel linguaggio macro di Microsoft Excel oppure per eseguire
una funzione in una DLL o XLL (le .dll sono librerie:
Dinamik Link Library).
-
La funzione
CreateObject crea e restituisce un riferimento a un
oggetto ActiveX . La mia conoscenza di questi argomenti è veramente
minima, ma vorrei comunque provare a spiegarli, sperando non non scrivere
"baggianate", confortato dal fatto che gli esempi che vedremo funzionano
perfettamente, almeno su Excel XP.
L'idea di base non
è mia, ma proviene da un lavoro impostato da un "pellegrino" tedesco, reso
free, e che ho modificato in un linguaggio a noi più comprensibile,
apportando delle modifiche. Vediamo le istruzioni originali:
Private Sub
CommandButton1_Click()
Set MyShell = CreateObject("WScript.Shell")
spalte = ActiveCell.Column
zeile = ActiveCell.Row
If spalte = 1 And zeile > 2 Then
For Each zelle In Selection
spalte = zelle.Column
zeile = zelle.Row
datei = Cells(zeile, spalte).Value
MyShell.Run Chr(34) & datei & Chr(34)
Next
End If
End Sub |
Premetto che sono
stato tratto in inganno, per quanto riguarda la Shell
richiamata nelle istruzioni sopra, (CreateObject("WScript.Shell")
)
dalla Funzione Shell tipica di Excel,
anch'essa usata per l'apertura di applicativi e relativi files, ma poi credo
di aver capito, che l'utilizzo del metodo Run
prevedeva invece l'utilizzo delle librerie Shell.dll
o Shell32.dll che sono librerie di
Sistema, richiamabili appunto in istruzioni VB, tramite la funzione
CreateObject. Sono sicuramente anni luce
indietro rispetto all'autore tedesco, vista la mia ignoranza in materia di
collegamenti od uso di interfacce di automazione, come il
CreateObject consente di fare, ma quello che
vorrei ribadire con gli esempi sotto, che con un pò di buona volontà
possiamo adattare lavori di altri alle nostre esigenze, anche conoscendo
solo in parte la programmazione.
Ad inizio pagina
ho usato la frase "..ad una parte di quanto contenuto..", in quanto le
istruzioni che useremo prevedono che già altre istruzioni abbiano provveduto
a "caricare" in una colonna dei un foglio di lavoro, un elenco formato dai
nomi dei files che vorremo poter aprire, e del percorso completo che "mira"
ad un file. Ma possiamo benissimo scrivere noi, senza alcuna routine a
monte, un elenco di uno o più file completi di percorso. Vediamo quindi un
piccolo esempio, dove nella colonna A di un foglio di lavoro, terremo un
elenco di file di immagini da poter "aprire" (estensione .bmp) completi del
percorso:
e queste le
istruzioni, viste sopra, ma tradotte, e spiegazioni con modifiche:
Sub Aprifile()
'sotto: si imposta la
variabile MyShell con la restituzione dell'oggetto Shell creato con 'CreateObject
Set MyShell = CreateObject("WScript.Shell")
'sotto: si assegna a due
variabili: colonna e riga, il numero della colonna e della cella
attiva 'in quel momento
colonna = ActiveCell.Column
riga = ActiveCell.Row
'sotto: si controlla che la
colonna sia la A (la 1) e la riga sia maggiore della riga 2, per
'limitare l'esecuzione delle istruzioni seguenti solo alla colonna A e
alle righe a partire dalla '2 esclusa, se si verifica questa
condizione, allora:
If colonna = 1 And riga > 2 Then
'si inizia un ciclo che
"riprende" il numero di riga e di colonna della cella attiva, di
questa 'cella si prende il valore e si assegna alla variabile
"percorso"
For Each Cell In Selection
colonna = Cell.Column
riga = Cell.Row
percorso = Cells(riga, colonna).Value
'indi si imposta
l'istruzione per aprire con Run l'applicativo preposto alla
visualizzazione di 'immagini ed il file rappresentato da "percorso":
MyShell.Run Chr(34) & percorso & Chr(34)
Next
End If
End Sub
-----------------------------------------------------------------------------------------
la routine appena vista, contiene, secondo me,
istruzioni superflue. La meccanica dell'esecuzione in definitiva
prevede che si selezioni la cella in cui è presente il file da aprire,
e poi si prema un pulsante a cui abbiamo associato la routine. Quindi,
mantenendo comunque il controllo per rispettare la colonna A e inizio
dopo la seconda riga, otteniamo la stessa cosa con una routine così
impostata (le istruzioni simili a quella sopra non vengono commentate):
Sub apritisesamo()
Set MyShell = CreateObject("WScript.Shell")
colonna = ActiveCell.Column
riga = ActiveCell.Row
If colonna = 1 And riga > 2 Then
'sotto: modifichiamo con
Activecell il valore da assegnare alla variabile "percorso"
percorso = Activecell.Value
MyShell.Run Chr(34) & percorso & Chr(34)
End If
End Sub
-----------------------------------------------------------------------------------------
ma è possibile ridurre ulteriormente le
istruzioni, eliminando il controllo sulle celle "autorizzate", in
questo modo qualunque cella del foglio potrà essere selezionata, e
SOLO se conterrà un percorso completo di un file le istruzioni di
apertura agiranno in maniera adeguata. Useremo solo Activecell per
identificare la cella sezionata, così:
Sub apritisesamo()
Set MyShell = CreateObject("WScript.Shell")
percorso = Activecell.Value
MyShell.Run Chr(34) & percorso & Chr(34)
End Sub
Se la cella attiva sarà vuota, almeno su Excel XP,
si apre la finestra di "Risorse del Computer", se invece la cella
conterrà un valore che non sia un percorso valido, si genererà un
errore di run-time.
|
Ora presento un ulteriore esempio basato sull'attivazione in automatico
dell'istruzione di apertura file, sfruttando l'evento
Workbook_SelectionChange: potremo così aprire un file semplicemente
selezionando una cella che contenga un percorso completo che mira ad un
file. Avremo però in questo caso, bisogno di "controllare" che le celle
selezionate appartengano ad un'area predisposta a contenere l'elenco dei
file da aprire, per questo useremo il metodo "Intersect"
(vedi articolo in questa sezione), ovviamente il tutto per evitare che si
attivino istruzioni anche quando selezioneremo celle che non contengono
percorsi completi.
Un'applicazione
tipica per questo utilizzo potrebbe essere un foglio Magazzino dove, insieme
ai campi che compongono in genere un archivio articoli (codice articolo,
descrizione, ecc.ecc) si voglia inserire un campo "Immagini" associato ad
ogni articolo; si potrebbe con un semplice click sulla cella che contiene il
percorso dell'immagine associata all'articolo, visualizzare l'articolo.
Oppure potrebbe essere un esempio per una Agenzia Immobiliare, per associare
l'immagine di una casa ad un identificativo della casa stessa, insomma,
ognuno mediti sulle proprie esigenze. Vediamo delle immagini per capire
l'esempio, un foglio "Magazzino":
e, dopo aver
selezionato le cella C7, questo è quanto avverrà:
Si apre l'applicativo (programma) predisposto all'apertura dell'estensione .jpg
(in questo caso ACDSee)e vediamo l'immagine che avremo avuto cura di
rinominare come il codice articolo corrispondente. E questa la routine:
Private Sub
Worksheet_SelectionChange(ByVal Target As Range)
Set MyShell = CreateObject("WScript.Shell")
colonna = ActiveCell.Column
riga = ActiveCell.Row
'sotto: si imposta la
colonna 3 (la C) e la riga oltre la quale scatteranno le istruzioni
If colonna = 3 And riga > 4 Then
percorso = Cells(riga, colonna).Value
'sotto: inseriamo un
controllo che verifica che se la cella, nell'area prevista, è vuota,
si 'esce dalla routine
If percorso = "" Then Exit Sub
'sotto: con Intersect
controlliamo che la cella selezionata corrisponda all'area voluta, se
'non corrisponde (tutte le altre celle del foglio), usciamo dalla
routine
If Intersect(Target, Cells(riga, colonna)) Is Nothing Then
Exit Sub
'altrimenti (se la cella
selezionata appartiene all'area voluta), lanciamo l'apertura del file
Else
MyShell.Run Chr(34) & percorso & Chr(34), 2
End If
End If
End Sub |
Buon lavoro.
prelevato sul sito
www.ennius.altervista.org
|