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