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 :

Recherche sur plusieurs instances EXCEL


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Recherche sur plusieurs instances EXCEL
    Bonjour,

    Après avoir parcouru votre Forum plein d'astuces et de bons conseils, je n'ai pu résoudre mon exercice:

    Créer une macro de recherche de caracteres sur plusieurs instances Excel dont je ne connais pas d'avance le nom (ceux-ci changent au bon vouloir des utilisateurs).

    Pourquoi plusieurs instances ?? les Fichiers Excel sont sur réseau interne et lors de leur activation (manuelle) ceux-ci s'ouvrent dans des instances distinctes .

    D'après ce que j'ai pu réaliser grace à votre Forum , il est possible de connaitre la quantité d'instances Excel ouvertes mais pas les noms des fichiers (workbooks) associés ?

    Merci à tous ceux qui plancheront.

  2. #2
    Membre averti
    Inscrit en
    Juillet 2007
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 239
    Points : 307
    Points
    307
    Par défaut Instances Excels
    Bonjour,

    C'est une anomalie de fonctionnement ; Si pour chaque fichier Excel , on relance une nouvelle instance ?
    Quand je clique plusieurs fois sur l'icône Excel , j'ouvre plusieurs instances. Lorsque je clique sur un fichier .xls , c'est la même instance...

    A mon avis, c'est un paramètre windows , lequel ?

  3. #3
    Membre chevronné Avatar de aalex_38
    Inscrit en
    Septembre 2007
    Messages
    1 631
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 631
    Points : 1 999
    Points
    1 999
    Par défaut
    Bonjour le forum, bonjour Hourko,

    il est possible de connaitre la quantité d'instances Excel ouvertes mais pas les noms des fichiers (workbooks) associés ?
    Je me suis intéressé à ton post et j'en suis au même point, as-tu déjà commencé quelque chose au quel cas tu pourrai mettre le code pour nous aider à avancer. Par exemple la mêthode que tu as choisi pour compter les instances.

    Une question, peux-tu fermer les instances excel une fois ton traitement sur les chaînes de caractère efféctuées ?

    Si c'est le cas je verrai peut être une solution pas des plus simple:
    Faire un GETOBJET, travailler sur tous les classeurs actifs
    Fermer cette instance ...

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut On avance à l'instance
    Pour le code, aucun mérite. Je l’ai «chipé» dans le forum (un grand merci au façonneur ).
    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
     
    Sub nb_instances()
     
    Dim strComputer As String
    Dim objWMIService As Object
    Dim objList As Object
     
    strComputer = "."
     
    Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
    Set objList = objWMIService.execquery("select * from win32_process where name='EXCEL.EXE'")
     
    MsgBox "Nombre d'instances : " & objList.Count
     
    Set objWMIService = Nothing
    Set objList = Nothing
     
    End Sub
    La première idée concernant le paramétrage Windows, Excel ou même le réseau j’ai lancé l’idée au boulot. Je pense également à chercher un forum spécial Windows. Si je trouve je vous en ferais part.

    La deuxième idée, même si elle ne s’applique pas à mon mini projet, est intéressante.
    Créer une instance Excel, traiter le fichier associé puis fermer le fichier et l’instance.

    Et donc voilà (avec en plus le nb d'instances qui s'affiche):
    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
     
    Sub traitement_instance_Excel()
    Dim strComputer As String
    Dim objWMIService As Object
    Dim objList As Object
    strComputer = "."
    Set xlApp = CreateObject("excel.application") ‘la nouvelle instance
    xlApp.Visible = True    'affiche l'application.
    Workbooks.Open Filename:="C:\......\Toto.xls" ‘le nouveau fichier dans la nouvelle instance
    Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
    Set objList = objWMIService.execquery("select * from win32_process where name='EXCEL.EXE'")
     
    MsgBox "Nombre d'instances : " & objList.Count 'il y a effectivement une instance de plus
     
    Range("A1").Select          'le traitement ici...
    ActiveCell.FormulaR1C1 = "Bonjour le traitement"
    ActiveWorkbook.Save
    ActiveWorkbook.Close
     
    xlApp.Quit
    Set objWMIService = Nothing
    Set objList = Nothing
    Set xlApp = Nothing     
     
    End Sub
    nota: un truc rigolo, le fichier ne s'affiche pas dans l'instance tant que le message du nb d'instances n'est pas activé. Je pense à un rafraichissement de l'écran à rajouter éventuellement.

    Si cella vous inspire ?

    Je n'ai tj pas trouvé comment me ballader d'une instance à une autre sans connaitre le nom du fichier à l'avance. A vos compiles Messieurs et merci pour vos futurs comments...

  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 546
    Points
    15 546
    Par défaut
    forum spécial Windows
    Ça existe sur DVP
    Pour se balader d'une instance d'Excel sur l'autre, je ne vois pas le pb.
    Quand tu crées une instance, tu as son nom. Si tu utilises le nom de l'instance dans une ligne de commande, c'est bien dans l'instance que tu te "balades"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim xlApp As Object 'on déclare l'objet application
    Dim wkb As Object 'on déclare un objet Workbook (non encore affecté)
    Dim sht As Object 'et on déclare un objet feuille (non encore affecté)
        Set xlApp = New Excel.Application 'On crée l'objet application
    'c'est ici que ça se passe : On se "balade" dans l'application pour créer l'objet Classeur
        Set wkb = xlApp.Workbooks.Add
    Et c'est bien dans xlApp qu'est créé l'objet wkb, et non dans l'application en cours.
    A moins que tu ne parles d'autre chose
    Tu dis
    A+

    Edit
    Pour le nom d'un classeur ouvert dans une instance, as-tu essayé de lister les classeurs et de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For each classeur in xlApp.workbooks
        Nom = Classeur.name
    Next
    NB - Une recommandation : Evite d'utiliser la sélection dans ton code. A de très rares exceptions près, l'utilisation de select ne fait que ralentir le code et créer des mouvements de fenêtres. Je parle de ces deux lignes que tu peux facilement simplifier :
    Range("A1").Select 'le traitement ici...
    ActiveCell.FormulaR1C1 = "Bonjour le traitement"
    à remplacer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A1") = "Bonjour le traitement"
    Enfin, FormulaR1C1 est utilisé pour écrire dans des adresses relatives et est donc totalement inutile ici.
    Bonne journée

  6. #6
    Membre chevronné Avatar de aalex_38
    Inscrit en
    Septembre 2007
    Messages
    1 631
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 631
    Points : 1 999
    Points
    1 999
    Par défaut
    Bonjour,
    Quand tu crées une instance, tu as son nom.
    Oui, mais si j'ai bien compris, comment faire pour parcourir toutes les instances, quand on ne crée pas l'instance par macro ?

  7. #7
    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 546
    Points
    15 546
    Par défaut
    Je viens de relire le post. Tu mets...
    Citation Envoyé par Hourko
    Nota: un truc rigolo, le fichier ne s'affiche pas dans l'instance tant que le message du nb d'instances n'est pas activé. Je pense à un rafraichissement de l'écran à rajouter éventuellement.
    Non, tu n'as pas besoin d'afficher le nombre d'instances pour voir une instance que tu as crée, l'un n'a rien à voir avec le second, il suffit que tu rendes visible l'application juste après la création du classeur. Fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim xlApp As Excel.Application
    Dim CL1 As Workbook
    Dim FL1 As Worksheet
        Set xlApp = New Excel.Application
        Set CL1 = xlApp.Workbooks.Add
        xlApp.Visible = True
        Set FL1 = CL1.ActiveSheet
    Si tu ne crées pas de classeur, alors l'appli n'est pas visible.

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut L'instance d'avant
    Bonjour à vous tous, j'ai pris un peu de retard....

    Si pour chaque fichier Excel , on relance une nouvelle instance. C'est un paramètre Windows , lequel ?
    Je cherche mais je ne trouve pas... je persévère.
    Un forum spécial Windows: ça existe sur DVP
    Oui ben là je ne vous dit pas le niveau du personnage. Pas de commentaire Svp et pas de réponse non plus de ce coté là.
    Pour le nom d'un classeur ouvert dans une instance:
    Tant que la macro reste dans l'instance active il est possible d'énumérer chaque feuille pour chacun des classeurs et d'effectuer une recherche.
    C'est ce qui fonctionne actuellement : une macro de recherche dans chaque classeur (et donc dans chacune des instances) ce qui revient à activer la fonction Excel de recherche dans chaque classeur et de cocher l'option Rechercher dans tout le classeur. Si je ne trouve pas dans le premier classeur, je bascule sur un autre au petit bonheur puis je recherche et si je ne trouve pas je re-bascule.......

    Et donc
    «comment faire pour parcourir toutes les instances, quand on ne crée pas l'instance par macro» ?
    Et oui.

    En relisant vos post, vous m'avez donnée une idée:

    Passer par une boite de dialogue d'ouverture de fichiers. Dans ce cas là, l'ouverture est manuelle certes, mais je récupère les noms des Fichiers (bon on s'en contentera dans un premier temp).
    Mais je me heurte à 2 problèmes:

    - la boite de dialogue n'ouvre que des fichiers présents sur le système d'exploitation (pourtant elle était belle ma boite) et non pas en réseau. A contourner en réalisant non pas une boite d'ouverture mais de sélection puis Open. C'est jouable.
    - lorsque j'ouvre un fichier sur réseau celui-ci ne veut pas s'ouvrir en modification mais en lecture seule (et ben voyons)
    Que de bonnes nuits à passer....
    Désolé pour tout ce blabla sans même une ligne de codes j'ai pas mon portable, le prochain coup j'essayerai de faire mieux.

    Merci pour vos idées ainsi que pour vos remarques elles me permettent d'être plus précis dans mes déclarations d'objets et dans leur fonctionnement.

  9. #9
    Expert éminent
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Points : 6 699
    Points
    6 699
    Par défaut
    Bonjour,

    Le but serait de récupérer ce qu'on a dans le gestionnaire de tâches de Windows (je suis sous XP) au niveau de l'onglet Applications plutôt que processus... Si en plus tu as un classeur par instance.. ceci est peut-être applicable... ne me demande pas d'explications sur le code par contre

    mpfe, d'après Benoit Marchand
    http://frederic.sigonneau.free.fr/co...esActives1.txt

    Dans l'image ci-dessous, j'ai 4 instances d'ouvertes dont une qui porte un deuxième classeur => classeur 3

    PS; j'ai trié alpha et caché des lignes pour focaliser / sujet..

    cordialement,

    Didier
    Images attachées Images attachées  

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Récupération de noms des instances ECEL ouvertes
    Bonjour à vous tous,

    Ormonth, c'est exactement ce que je cherchai. D'après je que j'ai pu tester les instances commencent systématiquement par "Microsoft Excel + nom du classeur ayant ouvert l'instance". (plus tous les softs actifs du PC)
    Facile à tester et à isoler !

    Ceci répond exactement à ma demande initiale et représente un grand pas en avant.

    Reste plus qu'à réussir à se balader d'instance en instance.

    Je me permets d’intégrer le code qui pourrait intéresser éventuellement d’autres « Excelleurs » dans le futur.
    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
     
    'Attribute VB_Name = "ListeTachesActives1"
     
    'Liste les tâches actives en mémoire
    'mpfe, d'après Benoit Marchand
    '****************** Début de code *******
    Private Declare Function GetWindow Lib "user32" _
        (ByVal hwnd As Long, ByVal wCmd As Long) As Long
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
        (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Private Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long
    Private Declare Function GetWindowTextLength Lib "user32" _
        Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long
    Private Declare Function GetWindowText Lib "user32" _
        Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, _
        ByVal cch As Long) As Long
    Const GW_HWNDFIRST = 0
    Const GW_HWNDNEXT = 2
     
    Sub LoadTaskList()
    Dim CurrWnd As Long
    Dim Length As Long
    Dim TaskName As String
    Dim Parent As Long
     
      i = 1
      Sheets.Add  'renvoie la liste dans une nouvelle feuille de calcul
      twnd& = FindWindow("Shell_traywnd", vbNullString)
      CurrWnd = GetWindow(twnd, GW_HWNDFIRST)
      While CurrWnd <> 0
        Length = GetWindowTextLength(CurrWnd)
        TaskName = Space$(Length + 1)
        Length = GetWindowText(CurrWnd, TaskName, Length + 1)
        TaskName = Left$(TaskName, Len(TaskName) - 1)
     
        If Length > 0 Then
          Cells(i, 1).Value = TaskName
          i = i + 1
        End If
        CurrWnd = GetWindow(CurrWnd, GW_HWNDNEXT)
        DoEvents
      Wend
     
    End Sub

    Merci à vous tous pour toute l'aide que vous m'avez procurée. Je pense solder la question rapidement sauf si d’autres commentaires ou demandes se feraient connaitre.
    Et encore un grand merci à tous.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2007] Formulaire VBA Excel - recherche sur plusieurs critères et affichage des résultats
    Par kl1ft dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 29/08/2016, 20h44
  2. [XL-MAC 2011] Recherche sur plusieurs fichiers excel
    Par Muzzik dans le forum Excel
    Réponses: 2
    Dernier message: 14/05/2015, 17h50
  3. [MySQL] Recherche sur plusieurs tables
    Par hubidev dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 21/03/2006, 10h42
  4. Réponses: 2
    Dernier message: 30/11/2004, 09h42

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