Nelle vecchie versioni esisteva la funzione AMBIENTE.INFO che aveva come possibili parametri, tra l'altro, "memdispo", "mem_usata" e "mem_tot"; ma da XL2010 (forse anche 2007) sono parametri non più gestiti.
Non ti puo' bastare il dato fornito da TaskManager /Gestione attività (si avvia tramite Contr-Alt-Canc), scheda Processi?
Comunque qualcosa si puo' estrarre lavorando sui processi di sistema.
Ad esempio questa Funzione:
- Codice: Seleziona tutto
Dim isIn As Boolean
Dim objWMIService, objProcess, colProcess
Dim strComputer, strList
'
strComputer = "."
'
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" _
& strComputer & "\root\cimv2")
Set colProcess = objWMIService.ExecQuery _
("Select * from Win32_Process")
For Each objProcess In colProcess
If CBool(InStr(1, objProcess.Name, ProcName, vbTextCompare)) Then
IsProcessRunning = True
Debug.Print ProcName & " Running at " & Format(Now, "mm-ss")
Debug.Print "Size (MB): " & Format(objProcess.WorkingSetsize / 1000000, "0.000")
' Debug.Print objProcess.PercentProcessorTime
isIn = True
End If
DoEvents
Next
If isIn = False Then
Debug.Print ProcName & " not running " & Format(Now, "mm-ss")
End If
Debug.Print
End Function
Va messa in un modulo standard del vba e poi puo' essere richiamata col nome del processo da monitorare; es
- Codice: Seleziona tutto
ProcessInfo ("winword.exe")
Al mommento la funzione scrive il risultato all'interno della "finestra Immediata" del vba; tipo
- Codice: Seleziona tutto
winword.exe Running at 16:31:35
Size (MB): 72,942
winword.exe Running at 16:31:35
Size (MB): 727,724
Qui mi sta dicendo che ci sono in esecuzione due processi Winword che occupano circa 73 e 727 Mbyte
E' opportuno che la function non venga richiamata in rapida successione, perche' consuma abbastanza cpu e tempo per completarsi.
E' utile sapere che il codice puo' essere utilizzato anche all'interno del vba di word; ad esempio, inserire questo codice in un nuovo (vuoto) Modulo standard di un documento word:
- Codice: Seleziona tutto
#If VBA7 Then
Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
#Else
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If
Sub GimmeInfo()
Do
ProcessInfo ("excel.exe")
Sleep 2000
DoEvents
Loop
End Sub
Private Function ProcessInfo(ByVal ProcName As String) As Boolean
Dim isIn As Boolean
Dim objWMIService, objProcess, colProcess
Dim strComputer, strList
'
strComputer = "."
'
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" _
& strComputer & "\root\cimv2")
Set colProcess = objWMIService.ExecQuery _
("Select * from Win32_Process")
For Each objProcess In colProcess
If CBool(InStr(1, objProcess.Name, ProcName, vbTextCompare)) Then
IsProcessRunning = True
Debug.Print ProcName & " Running at " & Format(Now, "hh:mm:ss")
Debug.Print "Size (MB): " & Format(objProcess.WorkingSetsize / 1000000, "0.000")
' Debug.Print objProcess.PercentProcessorTime
isIn = True
End If
DoEvents
Next
If isIn = False Then
Debug.Print ProcName & " not running " & Format(Now, "hh:mm:ss")
End If
Debug.Print
End Function
Eseguendo poi la Sub GimmeInfo ogni 2 sec verrà controllato lo stato del processo excel.exe; ad esempio, caricando il famoso file che non so come si comporta sul tuo pc e lanciando la sua Sub Avvia, ho ottenuto (a distanza di 60 secondi):
- Codice: Seleziona tutto
excel.exe Running at 16:47:53
Size (MB): 587,137
excel.exe Running at 16:47:53
Size (MB): 62,644
excel.exe Running at 16:47:58
Size (MB): 664,150
excel.exe Running at 16:47:58
Size (MB): 62,628
excel.exe Running at 16:48:00
Size (MB): 706,302
[.........]
excel.exe Running at 16:48:54
Size (MB): 1891,354
excel.exe Running at 16:48:54
Size (MB): 61,034
excel.exe Running at 16:48:56
Size (MB): 1907,292
excel.exe Running at 16:48:56
Size (MB): 61,034
Cioe' l'occupazione di Excel e' passata da circa 650 a circa 1960 MB man mano che la macro scriveva altre colonne da 1 Mill di righe con i dati delle combinazioni calcolate
Ricorda che nella finestra vba vengono visualizzate circa 200 righe, poi le righe piu' vecchie vengono scartate per far posto a quelle nuove.
Ciao