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 :

liaison avec Excel


Sujet :

VB.NET

  1. #1
    Membre averti
    Inscrit en
    Octobre 2004
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 57
    Par défaut liaison avec Excel
    j'ai cree une liaison avec Excel, j'arrive a recuperer les donnees mais le procesu continu de tourner meme apres ca destruction
    voila mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    'declaration
    Dim xlApp As Microsoft.Office.Interop.Excel.Application
     
    'instanciation
    xlApp = CType(CreateObject("Excel.Application"), _ Microsoft.Office.Interop.Excel.Application)
     
    'destruction?
    xlApp.Quit()
    xlApp = Nothing
    Excel n'apparait plus mais le processus reste actif...

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mars 2008
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mars 2008
    Messages : 161
    Par défaut
    Je ne comprend pas trop bien ton problème. Détail un peu plus. Et si possible donne ton code complet pour qu'on puisse y voir clair

  3. #3
    Membre Expert Avatar de Danyel
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2005
    Messages
    1 699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 699
    Par défaut
    Peut etre

  4. #4
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Par défaut
    Plusieurs solutions à ton problème dans ce post : [VB.NET][C#] Automatisation Excel : Fermer le processus Excel récalcitrant

  5. #5
    Membre averti
    Inscrit en
    Octobre 2004
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 57
    Par défaut
    skalp: je n'arrive pas a voir ton liens un pb de permission?

    j'ai mis tout le code. je ne fais rien d'autre entre les lignes(pour le test bien sur), Excel ce ferme bien.
    If IsNothing(xlApp) revoie bien true. mais le processus EXCEL reste dans la liste des processus windows.

  6. #6
    Membre Expert Avatar de Danyel
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2005
    Messages
    1 699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 699
    Par défaut
    Citation Envoyé par fernier Voir le message
    skalp: je n'arrive pas a voir ton liens un pb de permission?
    Normal c'est une section private et skalp à dû l'oublier
    Voici le code qui doit t'interesser :
    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
    Private Sub CreateExcelProcess()
     
                ' Liste des processus avant le mien
                Dim Process1() As Process = Process.GetProcesses()
                _xlApp = New Microsoft.Office.Interop.Excel.Application()
     
                ' Liste des processus après le mien : la différence me donnera l'Id du mien
                Dim Process2() As Process = Process.GetProcesses()
     
     
                Dim i, j As Integer
                Dim bMonProcessXL As Boolean
                For j = 0 To Process2.GetUpperBound(0)
                    If Process2(j).ProcessName = "EXCEL" Then
                        bMonProcessXL = True
                        ' Parcours des processus avant le mien
                        For i = 0 To Process1.GetUpperBound(0)
                            If Process1(i).ProcessName = "EXCEL" Then
                                If Process2(j).Id = Process1(i).Id Then
                                    ' S'il existait avant, ce n'�tait pas le mien
                                    bMonProcessXL = False
                                    Exit For
                                End If
                            End If
                        Next i
                        If bMonProcessXL = True Then
                            ' Maintenant que j'ai son Id, je pourrai le tuer
                            '  xlApp.Hinstance ne fonctionne pas avec Excel 2000
                            '  alors que cette méthode marche toujours !
                            ProcId = Process2(j).Id
                            Exit For
                        End If
                    End If
                Next j
            End Sub
    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
     
    Public Sub Close()
                Try
                    If Not _xlSheet Is Nothing Then
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(_xlSheet)
                        _xlSheet = Nothing
                    End If
     
                    If Not _xlBook Is Nothing Then
                        _xlBook.Close()
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(_xlBook)
                        _xlBook = Nothing
                    End If
     
                    If Not _xlApp Is Nothing Then
                        _xlApp.Quit()
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(_xlApp)
                        _xlApp = Nothing
                        Quitter()
                    End If
                Catch ex As Exception
                    TraceNLog(ex)
                End Try
            End Sub
     
            Public Sub Quitter()
                Try
                    If ProcId = 0 Then
                        Exit Sub
                    End If
                    Process.GetProcessById(ProcId).Kill()
                Catch ex As Exception
                    TraceNLog(ex)
                End Try
            End Sub

  7. #7
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Par défaut
    Citation Envoyé par Danyel Voir le message
    Normal c'est une section private et skalp à dû l'oublier
    Ben figure-toi que je ne savais même pas qu'il était dans une section privée
    Le post a été déplacé depuis que je l'ai rédigé car je l'avais mis dans la section publique de "Contribuez"

    J'apporte quelques précisions sur le bloc de code récupéré par Danyel en copiant la fin de mon message d'origine :

    La solution la plus valable pour associer le processus Excel à l'objet d'automation est de récupérer l'identifiant du processus Excel. Il n'existe pas ma connaissance de méthode permettant de récupérer cet identifiant à partir de l'objet application Excel.

    L'astuce proposée par dietrich (voir le code VB.NET dans le post de Danyel) consiste à lister les processus avant et après l'instanciation et de récupérer l'identifiant du processus supplémentaire en recherchant la différence entre ces deux listes.
    Je l'ai adapté ici en C#. Je liste directement les processus de type EXCEL avant et après l'instanciation de mon objet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Process[] mesProcExcelBefore = Process.GetProcessesByName("EXCEL");
    monExcel = new Application();
    Process[] mesProcExcelAfter = Process.GetProcessesByName("EXCEL");
    // Voir plus bas pour l'explication de cette ligne ci-dessous :
    monExcelId = GetProcessID(mesProcExcelBefore, mesProcExcelAfter);
    La procédure suivante renvoie l'identifiant de mon processus nouvellement créé (indépendamment du type de processus recherché) :
    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
     
    /// <param name="mesProcBefore">Tableau des processus avant</param>
    /// <param name="mesProcAfter">Tableau des processus après</param>
    /// <returns>L'identifiant du processus supplémentaire</returns>
    private int GetProcessID(Process[] mesProcBefore, Process[] mesProcAfter)
    {
        int result = -1;
        bool isMyProc = false;
     
        // Si mon processus est le seul à être instancié
        // inutile de parcourir le tableau, il n'y a qu'une instance :
        if (mesProcBefore.Length == 0 && mesProcAfter.Length == 1)
        {
            result = mesProcAfter[0].Id;
        }
        else
        {
            // Parcours des processus après instanciation de l'objet :
            foreach (Process procAfter in mesProcAfter)
            {
                // Parcours des processus avant instanciation de l'objet :
                isMyProc = true;
                foreach (Process procBefore in mesProcBefore)
                {
                    // Si je le retrouve, ce n'est pas celui que je cherche :
                    if (procAfter.Id == procBefore.Id)
                    {
                        isMyProc = false;
                        break;
                    }
                }
                // J'ai retrouvé mon processus :
                if (isMyProc)
                {
                    result = procAfter.Id;
                    break;
                }
            }
        }
     
        return result;
    }
    De cette façon, je peut tuer uniquement le processus Excel que j'ai lancé par automation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Process.GetProcessesById(monExcelID).Kill();

  8. #8
    Membre averti
    Inscrit en
    Octobre 2004
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 57
    Par défaut
    merci beaucoup,
    j'ai simplement rajouter la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)
    merci

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

Discussions similaires

  1. [AC-2013] Liaison avec Excel - requête invisible
    Par amrod93 dans le forum Access
    Réponses: 0
    Dernier message: 03/10/2013, 18h04
  2. [PPT-2010] Modification d'une liaison avec Excel 2010
    Par Daejung dans le forum VBA PowerPoint
    Réponses: 1
    Dernier message: 28/03/2012, 11h08
  3. Liaison avec Excel
    Par Ledaf dans le forum VBA Access
    Réponses: 4
    Dernier message: 07/03/2009, 01h08
  4. Réponses: 2
    Dernier message: 13/12/2006, 14h33
  5. Comment créer un lien hypertexte avec une liaison OLE Excel ?
    Par vieuxsinge dans le forum API, COM et SDKs
    Réponses: 1
    Dernier message: 08/12/2005, 18h16

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