Articolo wiki
  • Questo articolo wiki è bloccato
Applicabile a 732 visualizzazioni

Excel - Aprire/chiudere un programma tramite la Funzione Shell (32/64 bit) - VBA

Riepilogo

Livello tecnico: Conoscenza di base di Visual Basic for Applications Si applica a: Excel Word Access (97/2000/2002/2003/2007/2010/2013)

Dettagli

NOTA. L’esempio ed il codice sono forniti *così come sono* e l’autore declina ogni responsabilità per un loro uso scorretto. Utilizzate l’esempio fornito o un file di prova per i vostri test. La correzione delle eccezioni (errori) e il controllo del tipo di dati inserito è solo parziale. Il file vuole essere un semplice esempio che illustra come sia possibile automatizzare Excel ed è fornito solo a scopo dimostrativo.

Il codice (commentato) che va inserito in un modulo standard:

  1. ALT+F11 per accedere all’editor del VBA
  2. Inserisci
  3. Modulo

permette di aprire e chiudere un determinato programma, in questo caso il Notepad, in ambiente 32 o 64 bit:

Option Explicit

 

'Dichiarazione di costante a livello di modulo

Private Const PROCESS_ALL_ACCESS = &H1F0FFF

 

'Dichiarazione di variabile a livello di modulo

Public v As Variant

 

'Chiamata alle API.

'#If condizionale che cdetermina se l'ambiente in uso

'è a 32 o 64 bit. Una delle due parti (quella non valida)

'sarà di colore rosso; non è un errore, ma solo la condizione

'non valutata in quello specifico ambiente.

#If Win64 Then

 

    Private Declare PtrSafe Function OpenProcess Lib "kernel32" _

      (ByVal dwDesiredAccess As LongLong, ByVal bInheritHandle As LongLong, _

       ByVal dwProcessId As LongLong) As LongLong

   

    Private Declare PtrSafe Function GetExitCodeProcess Lib "kernel32" _

       (ByVal hProcess As LongLong, lpExitCode As LongLong) As LongLong

   

    Private Declare PtrSafe Function TerminateProcess Lib "kernel32" _

       (ByVal hProcess As LongLong, ByVal uExitCode As LongLong) As LongLong

      

#Else

 

    Private Declare Function OpenProcess Lib "kernel32" _

      (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _

       ByVal dwProcessId As Long) As Long

   

    Private Declare Function GetExitCodeProcess Lib "kernel32" _

       (ByVal hProcess As Long, lpExitCode As Long) As Long

   

    Private Declare Function TerminateProcess Lib "kernel32" _

       (ByVal hProcess As Long, ByVal uExitCode As Long) As Long

      

#End If

 

'Metodo (Sub) che lancia il Notepad

Public Sub mApriProgramma()

    'Assegno alla variabile v il riferimento alla sessione di Notepad lanciata

    v = Shell("Notepad.exe", vbNormalFocus)

End Sub

 

'Metodo (Sub) che chiude la sessione di Notepad lanciata

Public Sub mChiudiProgramma()

   

    '#If condizionale che determina se l'ambiente in uso

    'è a 32 o 64 bit.

    #If Win64 Then

        Dim lng1 As LongLong

        Dim lng2 As LongLong

    #Else

        Dim lng1 As Long

        Dim lng2 As Long

    #End If

 

    lng1 = OpenProcess(PROCESS_ALL_ACCESS, 0&, v)

   

    'Chiusura del processo Notepad lanciato

    If lng1 Then

        GetExitCodeProcess lng1, lng2

        If lng2 Then TerminateProcess lng1, lng2

    End If

   

End Sub

 

Nel caso si voglia aprire un determinato file, in questo caso il file C:\Prova\test.txt, modificare in questo modo il Metodo (Sub) mApriProgramma:

 

Public Sub mApriProgramma()

    v = Shell("Notepad.exe C:\Prova\test.txt", vbNormalFocus)

End Sub

 

Dal sito maurogsc.eu potete scaricare due esempi:

NOTA. Excel non dispone nativamente di procedure assolutamente sicure per impedire la visualizzazione e la modifica del codice vb e/o per la protezione dei fogli. E’ una cosa da tenere sempre presente quando si distribuiscono file con contenuti ritenuti delicati. Ricordate anche che è possibile lanciare il file di Excel senza che vengano eseguite le macro.


Risorse.

 


 Avvio Pulito di Windows
(courtesy of Microsoft MVP Franco Leuzzi)


Computer infettato da malware (courtesy of Microsoft MVP Vincenzo Di Russo)



Commenti (0)

avanzamento