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

VB.NET Discussion :

Probleme Excel Multi instances


Sujet :

VB.NET

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 82
    Points : 47
    Points
    47
    Par défaut Probleme Excel Multi instances
    Bonjour,
    Voilà mon problème : ouvrir, écrire dans une feuille, et fermer un fichier excel pas de soucis.
    Seulement là dans une application, je dois écrire dans un fichier déjà ouvert et je bloque complètement.

    - Si je fais un GetObject des applications ouvertes, je récupère seulement la première instance Excel. Si l'utilisateur a lancé excel plusieurs fois pour d'autres choses du coup ça ne marche pas.
    - Si je fais un GetObject en précisant mon fichier, ça me créé une autre instance de mon fichier...
    - J'ai essayé de parcourir les instances Excel mais pas moyen de trouver sur internet. Je peux compter le nombre d'instances mais pas les utiliser. En tout cas je ne sais pas le faire.

    Test avec GetObject sur mon fichier

    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
                ' Variables
                Dim oXL As Excel.Application = Nothing
                Dim oWB As Excel.Workbook = Nothing
                Dim oSheet As Excel.Worksheet = Nothing
                Dim Workbook_GSP_export_open As Boolean = False
     
                ' Test si fichier d'export déjà ouvert
                Try
                    oXL = GetObject(Application.StartupPath + "\GSP_Export_Excel.xlsx").Application()
                    For Each Wb In oXL.Workbooks
                        If Wb.Name = "GSP_Export_Excel.xlsx" Then
                            oWB = Wb
                            Exit For
                        End If
                    Next
                    Workbook_GSP_export_open = True
                Catch ex As Exception
     
                End Try
    Test de parcours des instances... Mais ça plante sur instance.Workbooks car ce n'est pas des types excel.application donc pas de workbook... logique

    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
     
                Dim strComputer As String
                Dim objWMIService As Object
                Dim objList As Object
     
                strComputer = "."
     
                objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
                objList = objWMIService.execquery("select * from win32_process where name='EXCEL.EXE'")
     
                Dim espion As Integer = objList.Count
     
                For Each instance In objList
                    For Each Wb In instance.Workbooks
                        If Wb.Name = "GSP_Export_Excel.xlsx" Then
                            oWB = Wb
                            Exit For
                        End If
                    Next
                Next
    Si vous avez une combine.

    Merci

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 82
    Points : 47
    Points
    47
    Par défaut
    J'ai essayé aussi ça mais pas mieux, le "AppActivate(pp.Id)" donne le focus un à un aux instances d'excel mais le "oXL = Marshal.GetActiveObject" ne prend pas l'instance "focusée"
    C'est donc l'ordre dans la table ROT qu'il faut donner le focus. Mais comment ?


    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
     
           Try
                ' Variables
                Dim oXL As Excel.Application = Nothing
                Dim oWB As Excel.Workbook = Nothing
                Dim oSheet As Excel.Worksheet = Nothing
                Dim Workbook_GSP_export_open As Boolean = False
                Dim Process_Excel(4) As System.Diagnostics.Process
                Dim i As Integer = 0
     
                For Each p As System.Diagnostics.Process In System.Diagnostics.Process.GetProcesses()
                    If p.ProcessName = "EXCEL" Then
                        Process_Excel(i) = p
                        i = i + 1
                    End If
                Next
     
                For Each pp In Process_Excel
                    AppActivate(pp.Id)
                    oXL = Marshal.GetActiveObject("Excel.Application")
                    For Each Wb In oXL.Workbooks
                        Dim a As String = Wb.name
                        If Wb.Name = "Toto.xlsx" Then
                            oWB = Wb
                            Exit For
                        End If
                    Next
                Next
            Catch ex As Exception
     
            End Try

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 82
    Points : 47
    Points
    47
    Par défaut
    Bon après de nombreuses heures sur le net pas moyen de récupérer les instances d'excel ouvertes sous forme d'application. Donc j'ai contourné le problème en checkant les processus ouvert ayant le nom de mon classeur. Si ouvert alors Get sinon Create.

    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
     
            Try
     
                ' Variables
                Dim oXL As Excel.Application = Nothing
                Dim oWB As Excel.Workbook = Nothing
                Dim oSheet As Excel.Worksheet = Nothing
                Dim Workbook_GSP_export_open As Boolean = False
                Dim myProcesses() As Process
                Dim myProcess As Process
                Dim FichierExport As String = Application.StartupPath + "\GSP_Export_Excel.xlsx"
                myProcesses = Process.GetProcesses
     
                ' Recherche si le fichier est déjà ouvert
                For Each myProcess In myProcesses
                    Dim processName As String = myProcess.MainWindowTitle
                    If processName.Contains("GSP_Export_Excel.xlsx") Then
                        Workbook_GSP_export_open = True
                    End If
                Next
     
                ' Récupération de l'instance du fichier excel si ouvert
                If Workbook_GSP_export_open Then
                    oXL = GetObject(FichierExport).Application()
                    For Each Wb In oXL.Workbooks
                        If Wb.Name = "GSP_Export_Excel.xlsx" Then
                            oWB = Wb
                            Exit For
                        End If
                    Next
                End If
     
                ' Suppression et recreation du fichier excel si pas ouvert
                If Not Workbook_GSP_export_open Then
     
                    ' Suppression
                    Try
                        My.Computer.FileSystem.DeleteFile(FichierExport)
                    Catch ex As Exception
     
                    End Try
     
                    ' Creation
                    oXL = CreateObject("Excel.Application")
                    oWB = oXL.Workbooks.Add
                    Try
                        For Each sheet In oWB.Worksheets
                            oWB.Worksheets(sheet.name).Delete()
                        Next
                    Catch ex As Exception
     
                    End Try
     
                End If

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 11/03/2015, 07h53
  2. [XL-2010] probleme avec 2 instances excel
    Par Pierre67 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 19/09/2012, 12h53
  3. [TOMCAT]Multi-instances
    Par Nikko95 dans le forum Apache
    Réponses: 5
    Dernier message: 10/08/2005, 14h16
  4. Multi-instance
    Par blackstreet dans le forum Informix
    Réponses: 3
    Dernier message: 06/06/2005, 09h41
  5. FireBird - Multi instances
    Par Thomad dans le forum Débuter
    Réponses: 9
    Dernier message: 07/05/2004, 11h39

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