Windows Media Player - usarlo con una applicazione .xls - terza parte - dal 24/09/04 pagina vista: volte

In questo articolo vedremo come usare il Windows Media Player come applicazione (programma) esterna a Excel. Sfrutteremo delle procedure in parte gia presenti (vedi articoli " Apertura Applicativi da Excel" sull'altro sito, oppure " Usare Shell + Run " e " Chiusura Applicativi da Excel" su questo sito) .

Queste procedure ci consentono quindi di evitare l'inserimento di "oggetti" (ActiveX) nella cartella di Excel, rendendo indipendenti i due programmi (Excel e Window Media Player), i quali "gireranno" in due finestre separate. Useremo in sostanza delle chiamate alla Shell di sistema, per comandare l'apertura e/o la chiusura dell'applicazione satellite.

La sintassi della funzione Shell richiede due argomenti :

  • il percorso completo che mira al file che vogliamo "aprire", scritto come si scrive una stringa di testo, quindi tra doppi apici (es: "C:\Musica\miacanzone.mp3").

  • la modalità (windowstyle) con cui vogliamo venga aperto l'applicativo (in questo caso Windows Media Player) per l'esecuzione del brano contenuto in "percorso".

Per indicare la modalità possiamo usare dei valori numerici predefiniti, oppure delle costanti di visual basic relative all'argomento ; vediamo uno specchietto:

Costante Valore Descrizione
vbHide 0 La finestra è nascosta e lo stato attivo viene passato alla finestra nascosta. La costante vbHide non è valida per le piattaforme Macintosh.
vbNormalFocus 1 La finestra è attivata e vengono ripristinate la dimensione e la posizione originali.
vbMinimizedFocus 2 La finestra è ridotta a icona e attivata.
vbMaximizedFocus 3 La finestra è ingrandita e attivata.
vbNormalNoFocus 4 Vengono ripristinate le dimensioni e posizione precedenti della finestra. La finestra attiva resta attiva.
vbMinimizedNoFocus 6 La finestra è ridotta a icona. La finestra attiva resta attiva.

 

Per quanto riguarda i brani da far eseguire, e loro percorsi, possiamo impostare una colonna di un foglio di lavoro, come suggerito nelle prima e seconda parte di questo gruppo di articoli; potremo quindi trovarci in una situazione simile a questa:

Lo scopo sarà quello di disporre di un'elenco, comunque ottenuto, (con i percorsi dei file che ci piacerà ascoltare) in modo da assegnarli ad una variabile che rappresenterà di volta in volta il percorso del file che vogliamo ascoltare.

Dividiamo ora le istruzioni in due diverse procedure:

  1. Apertura del Windows Media Player con riduzione a icona (nella barra delle applicazioni del desktop) del programma; operazione che ci consente poi di riaprire la finestra del wmplayer con un clik sull'icona, e di stoppare la musica e chiudere l'applicativo tramite i suoi menù, agendo quindi direttamente sui comandi del Windows Media Player.

  2. Apertura del Windows Media Player in modalità Hide (nascosta, invisibile) e in questo caso avremo bisogno di istruzioni che ci permettano di chiudere, se vogliamo, il wmplayer; non altrimenti (è invisibile) accessibile (a parte dal Task Manager).

Per entrambe le procedure non potremo avvalerci della proprietà URL dell'oggetto wmplayer, visto che di questo "oggetto" non ne facciamo uso.

Le istruzioni per l'utilizzo della funzione Shell cambiano in funzione del Sistema Operativo installato. Gli esempi che seguono sono specifici per funzionare su Windows XP, chi possiede Win98xxx dovrà modificare le istruzioni di chiamata alla Shell come spiegato nell'articolo "Apertura Applicativi da Excel" .

E comunque, per identificare il brano da mandare in esecuzione, seguiremo l'esempio contenuto nella parte prima di questi articoli: ci affideremo ad una variabile da rendere Pubblica, MiaMu, con una variante nel posizionamento della dichiarazione variabile: anzichè usare la sezione "Generale - Dichiarazioni" del modulo del foglio che conterrà l'elenco delle canzoni, inseriremo la dichiarazione nella stessa sezione ma di un modulo nuovo che inseriremo nel progetto, modulo che conterrà la macro per la chiamata alla Shell. Sfrutteremo comunque l'evento Worksheet_SelectionChange con il metodo Intersect per "catturare" nella variabile MiaMu il brano da riprodurre.

Procedura A :  avvio del WMP ridotto a icona. Possiamo istruire due diverse istruzioni per chiamare la Shell, valide entrambi, ognuno scelga quella che preferisce: usiamo il valore 4 per indicare il windowstyle (la modalità)

  • Sub Suona1()
    Shell ("C:\Programmi\Windows Media Player\wmplayer.exe " & MiaMu & ""), 4
    End Sub

  • Sub Suona2()
    Set myshell = CreateObject("WScript.Shell")
    percorso = MiaMu
    myshell.Run Chr(34) & percorso & Chr(34), 4
    Set myshell = Nothing
    End Sub

la differenza tra le due macro e che nella Suona1() dobbiamo indicare necessariamente il percorso completo dove si trova l'eseguibile da aprire (il wmplayer.exe), seguito dal percorso che mira al file da far eseguire (in questo caso la variabile MiaMu), nella macro Suona2() invece è il metodo Run che si occupa di trovare l'eseguibile reperito tramite il CreateObject ed assegnato alla variabile myshell, adatto a riprodurre il file la cui estensione è contenuta nella variabile MiaMu. In parole povere se il file da aprire (MiaMu) fosse un documento di Word (con estensione .doc) la macro Suona2() non avrebbe cercato il wmplayer.exe necessario a riprodurre un file con estensione musicale, ma avrebbe cercato e aperto WinWord.exe per poterci aprire il file .doc. Credo non sia necessario considerare le implicazioni.......

Ripetiamo comunque l'insieme delle procedure necessarie: questa la routine che avremo predisposto sul modulo del Foglio1 (se l'elenco sarà sul foglio1) e che serve ad assegnare alla variabile MiaMu il percorso del file da riprodurre, ad ogni cambio di selezione di una cella dell'intervallo previsto nel Target:

  • Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Intersect(Target, Range("F1:F4")) Is Nothing Then 
    'inserirete il vostro intervallo
    Exit Sub
    Else
    MiaMu = ActiveCell.Text
    End If
    End Sub

e queste le istruzioni che inseriremo in un modulo nuovo:

nella sezione Generale  -  Dichiarazioni, scriveremo:

  • Public myshell, MiaMu

e poi, nello stesso modulo, la macro:

  • Sub Suona2()
    Set myshell = CreateObject("WScript.Shell")
    percorso = MiaMu
    myshell.Run Chr(34) & percorso & Chr(34), 4
    Set myshell = Nothing
    End Sub

oppure, ma non sarà necessario dichiarare Public myshell, ma solo MiaMu:

  • Sub Suona1()
    Shell ("C:\Programmi\Windows Media Player\wmplayer.exe " & MiaMu & ""), 4
    End Sub

Procedura B :  avvio del WMP in modalità Hide, cioè nascosta, invisibile. In questo caso è sufficiente ripetere una delle due macro viste sopra (Suona1() oppure Suona2()) ma con il valore che indica la modalità di esecuzione impostato a 0 (zero) anzichè 4.

Avremo però necessità di un qualcosa che ci consenta di chiudere il Windows Media Player dato che il programma è inaccessibile in quanto non visibile. Useremo quindi un nuovo pulsante posto sullo stesso foglio sul quale abbiamo posto un pulsante per l'avvio del WMP, pulsante associato a queste istruzioni (vedi articolo "Chiusura Applicativi da Excel ") che ripetiamo sotto. Inseriremo nel progetto un nuovo modulo (giusto per "non affollare" la zona Generale - Dichiarazioni del primo modulo) e nella zona Generale - Dichiarazioni scriveremo:

  • Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
    (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Declare Function PostMessage Lib "user32" Alias "PostMessageA" _
    (ByVal hwnd As Long, ByVal wMsg As Long, _
    ByVal wParam As Long, lParam As Any) As Long
    Public Const WM_CLOSE = &H10

quindi, nello stesso modulo inseriremo una Funzione Utente (CloseApplication) dichiarandola come Pubblica, che ha lo scopo, se chiamata, di chiudere un applicativo aperto, riconosciuto dal nome dell'applicativo che appare nella sua finestra di esecuzione. Poichè anche se nascosta la finestra del WMP porta scritto "Windows Media Player", assegnando questo nome alla variabile su cui agisce la Funzione, otterremo la chiusura del programma:

  • Public Function CloseApplication(ByVal sAppCaption As String) As Boolean
    Dim lHwnd As Long
    Dim lRetVal As Long
    lHwnd = FindWindow(vbNullString, sAppCaption)
    If lHwnd <> 0 Then
    lRetVal = PostMessage(lHwnd, WM_CLOSE, 0&, 0&)
    End If
    End Function

per ultimo, scriveremo la macro che chiama la Funzione vista sopra, tramite il metodo Run:

  • Sub Chiudi()
    sAppCaption = "Windows Media Player"
     
    'assegniamo alla variabile sAppCaption il nome del programma 'che vogliamo chiudere e che appare nella sua caption, scritto tra doppi apici essendo una stringa di testo.
    Run CloseApplication(sAppCaption)
     
    'si lancia la funzione che chiuderà l'applicativo ora letto in sAppCaption
    End Sub

La sub Chiudi() sarà la macro che assoceremo al secondo pulsante sul foglio. Non sarebbe male, per evitare di lasciare in esecuzione il wmplayer alla chiusura di Excel, di prevedere una chiamata alla funzione anche nell'evento BeforeClose del Workbook, così:

  • Private Sub Workbook_BeforeClose(Cancel As Boolean)
    sAppCaption = "Windows Media Player"
    Run CloseApplication(sAppCaption)
    End Sub

Ringrazio Roberto Lancetti (Rob@tiscalinet.it ), autore della procedura per la chiusura di un applicativo. Io non sono in grado di realizzare procedure che sfruttino chiamate alle librerie di Windows, ma con un minimo sforzo, si possono capire, modificare ed utilizzare.

 

Buon lavoro.

prelevato sul sito www.ennius.altervista.org