Bonjour,
Comment identifier et identifier les diverses instances d'excel en cours sur un poste quand elles n'ont pas été créées en VBA mais manuellement ?
Merci
Bonjour,
Comment identifier et identifier les diverses instances d'excel en cours sur un poste quand elles n'ont pas été créées en VBA mais manuellement ?
Merci
Sur le site de Microsoft, j'ai trouvé le code permettant de dénombrer le nombre d'instances d'Excel http://support.microsoft.com/kb/465135/fr :
mais comment puis-je ensuite accéder aux différentes instances trouvées?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55 La procédure NombreInstancesEXE32Bits affiche le nombre d'instances du nom de l'exécutable passé en paramètre. ######################################################################### ' Code Visual Basic anglais Option Explicit Global Const TH32CS_SNAPPROCESS = &h2 Global Const MAX_PATH = 260 Public Type PROCESSENTRY32 dwSize As Long cntUsage As Long th32ProcessID As Long th32DefaultHeapID As Long th32ModuleID As Long cntThreads As Long th32ParentProcessID As Long pcPriClassBase As Long dwFlags As Long szExeFile As String * MAX_PATH End Type Declare Function CreateToolhelp32Snapshot Lib "kernel32" _ (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long Declare Function CloseHandle Lib "kernel32" _ (ByVal hObject As Long) As Long Declare Function Process32First Lib "kernel32" _ (ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Boolean Declare Function Process32Next Lib "kernel32" _ (ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Boolean Sub NombreInstancesEXE32Bits(fic As String) Dim hThreadSnap As Long Dim bRet As Boolean Dim hProcessSnap As Long Dim pe32 As PROCESSENTRY32 Dim Spinner As Integer Spinner = 0 hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0) If (hProcessSnap = -1) Then Exit Sub pe32.dwSize = Len(pe32) bRet = Process32First(hProcessSnap, pe32) If (bRet = 1) Then While (Process32Next(hProcessSnap, pe32)) If Not (IsError(Application.Search(fic, pe32.szExeFile, 1))) Then _ Spinner = Spinner + 1 End If Wend End If CloseHandle (hProcessSnap) MsgBox Spinner & " instance(s) de " & fic & " chargée(s) en mémoire." End Sub #########################################################################
Set MyXL = GetObject(, "Excel.Application")
par exemple me fait accéder à la 1ère seulement
Merci
La syntaxe que tu utilises peut tout au plus te donner le nom des classeurs ouverts dans une seule instance.
Pour les classeurs des diverses, comme c'est intéressant comme pb, je cherche
Bonne soirée
Ca donnait bien le nombre d'instances d'excel ouvertes. j'en avais ouvert 2 avec 3 classeurs ouverts et ca me donnait bien 2
Je ne dis pas le contraire,je parle de la ligne'La procédure NombreInstancesEXE32Bits affiche le nombre d'instances du
'nom de l'exécutable passé en paramètre.
à laquelle j'ai ajouté "Msgbox MyXl.name" pour voir ce qu'elle donnait, et comme j'avais aussi deux instances... mais le mieux est que je te mette ce que j'ai faitSet MyXL = GetObject(, "Excel.Application")
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 Sub NombreInstancesEXE32Bits(fic As String) Dim hThreadSnap As Long Dim bRet As Boolean Dim hProcessSnap As Long Dim pe32 As PROCESSENTRY32 Dim Spinner As Integer, i As Integer Spinner = 0 hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0) If (hProcessSnap = -1) Then Exit Sub pe32.dwSize = Len(pe32) bRet = Process32First(hProcessSnap, pe32) If (bRet = 1) Then While (Process32Next(hProcessSnap, pe32)) If Not (IsError(Application.Search(fic, pe32.szExeFile, 1))) Then _ Spinner = Spinner + 1 Wend End If CloseHandle (hProcessSnap) MsgBox Spinner & " instance(s) de " & fic & " chargée(s) en mémoire." '************************************** Dim MyXL As Object For i = 1 To Spinner Set MyXL = GetObject(, "Excel.Application") MsgBox MyXL.Workbooks(i).Name Next '************************************** End SubBonne soirée
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Sub testInstances() NombreInstancesEXE32Bits "Excel.exe" End Sub
oui mais ce n'est pas ce que je voudrais.
si 2 instances sont ouvertes
ne liste que les classeurs d'une des deux instances (et encore seulement 2, puisque "spinner" compte le nombre d'instances et non le nombre de classeurs de chaque instance)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Set MyXL = GetObject(, "Excel.Application") MsgBox MyXL.Workbooks(i).Name
Ne peut-on passer en paramètre del'instance dans laquelle on fait la recherche?
Code : Sélectionner tout - Visualiser dans une fenêtre à part GetObject(, "Excel.Application")
Bonsoir,
Ce n'est pas aussi simple ...
Il va à mon avis falloir identifier les pid à partir des handles des fenêtres Excel ouvertes. Où encore identifier l'id de leur fil "appelant" en utilisant les handles (un par un) et la fonction GetWindowThreadProcessId de l'Api de Windows...
Il y a du boulot !...
Boulot que je n'ai personnellement jamais fait (car pas la nécessité) et dont j'entrevoiis qu'il n'est pas du gâteau ... et demande nettement plus une bonne connaissance de Windows (VBA n'intervenant que pour utiliser ces connaissances).
Partager