IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Identifier plusieurs instances


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    juin 2007
    Messages
    1 836
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2007
    Messages : 1 836
    Points : 581
    Points
    581
    Par défaut Identifier plusieurs instances
    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

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    juin 2007
    Messages
    1 836
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2007
    Messages : 1 836
    Points : 581
    Points
    581
    Par défaut
    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 :

    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
    #########################################################################
    mais comment puis-je ensuite accéder aux différentes instances trouvées?

    Set MyXL = GetObject(, "Excel.Application")

    par exemple me fait accéder à la 1ère seulement

    Merci

  3. #3
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2005
    Messages : 12 464
    Points : 15 273
    Points
    15 273
    Par défaut
    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

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    juin 2007
    Messages
    1 836
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2007
    Messages : 1 836
    Points : 581
    Points
    581
    Par défaut
    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

  5. #5
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2005
    Messages : 12 464
    Points : 15 273
    Points
    15 273
    Par défaut
    Je ne dis pas le contraire,
    'La procédure NombreInstancesEXE32Bits affiche le nombre d'instances du
    'nom de l'exécutable passé en paramètre.
    je parle de la ligne
    Set MyXL = GetObject(, "Excel.Application")
    à 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 fait
    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 Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub testInstances()
    NombreInstancesEXE32Bits "Excel.exe"
    End Sub
    Bonne soirée

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    juin 2007
    Messages
    1 836
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2007
    Messages : 1 836
    Points : 581
    Points
    581
    Par défaut
    oui mais ce n'est pas ce que je voudrais.
    si 2 instances sont ouvertes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            Set MyXL = GetObject(, "Excel.Application")
            MsgBox MyXL.Workbooks(i).Name
    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)

    Ne peut-on passer en paramètre de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GetObject(, "Excel.Application")
    l'instance dans laquelle on fait la recherche?

  7. #7
    Inactif  

    Profil pro
    Inscrit en
    juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juillet 2007
    Messages : 4 555
    Points : 5 535
    Points
    5 535
    Par défaut
    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).

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    août 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2009
    Messages : 16
    Points : 15
    Points
    15
    Par défaut
    Hello !
    Votre sujet est tres interessant ... j'ai la meme problematique actuellement.

    Avez vous finalement trouvé une solution ?
    Tks
    Alex

Discussions similaires

  1. Réponses: 2
    Dernier message: 13/08/2005, 00h43
  2. Partage de code par plusieurs instances
    Par a.tintin dans le forum MFC
    Réponses: 3
    Dernier message: 08/08/2005, 14h03
  3. Réponses: 3
    Dernier message: 16/10/2003, 10h22
  4. Communiquer entre plusieurs instances d'applications
    Par bourinator dans le forum C++Builder
    Réponses: 5
    Dernier message: 28/09/2003, 11h24
  5. [] plusieurs instances de form avec leur contexte ?
    Par Seb-31 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 11/04/2003, 13h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo