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:
- ALT+F11 per accedere all’editor del VBA
- Inserisci
- 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)