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 :

Processus ne se fermant pas !


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur en Automatisme
    Inscrit en
    Février 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur en Automatisme
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2014
    Messages : 21
    Points : 16
    Points
    16
    Par défaut Processus ne se fermant pas !
    Bonjour, je reviens vers vous car j'ai le problème suivant avec mon code :

    Le processus EXCEL.EXE reste ouvert après l’exécution du code, des idé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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    Imports System.Data.SqlClient
    Imports xls = Microsoft.Office.Interop.Excel
     
    Module Module1
     
        Sub Main()
     
            Dim xlApp As New xls.Application
            Dim xlBook As xls.Workbook
            Dim xlSheet As xls.Worksheet
     
            'Configuration de la connection SQL + Requete   
            Dim Connexion As New SqlConnection("Data Source=localhost;Initial Catalog=bdd_name;User Id=sa;Password=159753;")
            Dim Requete As String = "SELECT * FROM Table_test"
     
            'Configuration du fichier Excel ainsi que de la Worksheet à modifier
            xlBook = xlApp.Workbooks.Open("C:\Users\toto\Desktop\Classeur1.xlsx")
            xlSheet = xlBook.Worksheets("test")
     
            'Connexion à la BDD
            Connexion.Open()
     
            Dim Commande As New SqlCommand(Requete, Connexion)
            Dim Adaptateur As New SqlDataAdapter(Commande)
            Dim MonDataSet As New DataSet
     
            Try
                'Récupération des données dans un DataSet
                Adaptateur.Fill(MonDataSet, "test")
            Catch ex As Exception
                'Fermeture de la connection en cas d'erreur           
                Console.WriteLine(ex.Message)
                Commande.Dispose()
                Connexion.Close()
            End Try
     
            'Fermeture de la connection
            Commande.Dispose()
            Connexion.Close()
     
            'Ajout du dataset dans le fichier Excel
            Dim RowInd As Int16 = 1
            Dim ColInd As Int16 = 1
     
            xlSheet.Range("A1", "Z5000").Value = ""
     
            For ColInd = 0 To 4
                For Each Ligne As DataRow In MonDataSet.Tables("Alarms").Rows()
                    xlSheet.Cells(RowInd, ColInd + 1).Value = Ligne(ColInd).ToString
                    RowInd += 1
                Next
                RowInd = 1
            Next
            'Sauvegarde du fichier Excel et fermeture de la connection
            xlApp.DisplayAlerts = False
            xlSheet.SaveAs("C:\Users\toto\Desktop\Classeur1.xlsx")
            xlBook.Close(False)
            xlApp.Quit()
            xlApp.DisplayAlerts = True
     
            ReleaseObject(xlApp)
            ReleaseObject(xlBook)
            ReleaseObject(xlSheet)
     
            xlApp = Nothing
            xlBook = Nothing
            xlSheet = Nothing
        End Sub
     
     
        Private Sub ReleaseObject(ByVal obj As Object)
            Try
                System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
                obj = Nothing
            Catch ex As Exception
                obj = Nothing
            Finally
                GC.Collect()
            End Try
        End Sub
    End Module

  2. #2
    Membre averti
    Homme Profil pro
    Responsable Maintenance
    Inscrit en
    Août 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Responsable Maintenance

    Informations forums :
    Inscription : Août 2012
    Messages : 478
    Points : 442
    Points
    442
    Par défaut
    Bonjour essaye pour fermer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xlApp.ActiveWorkbook.Close()
    ou enlève False dans ta Ligne comme suit


  3. #3
    Membre à l'essai
    Homme Profil pro
    Ingénieur en Automatisme
    Inscrit en
    Février 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur en Automatisme
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2014
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    Merci pour ta réponse, mais même résultat dans les deux cas, le processus reste actif.

  4. #4
    Membre averti
    Homme Profil pro
    Responsable Maintenance
    Inscrit en
    Août 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Responsable Maintenance

    Informations forums :
    Inscription : Août 2012
    Messages : 478
    Points : 442
    Points
    442
    Par défaut
    Ce que je demande va être bête mais je prefere demander car cela m'est deja arrivé par le passé.
    As tu bien killer tous tes processus avant de refaire un essai. En faisant de multiples essais il arrive d'oublier de les tuer avec CTRL ALT SUPP.
    BOn vous etes pas tous des alcoolos comme moi mais bon sais t on jamais.

    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
     
            xlApp.DisplayAlerts = False
            xlSheet.SaveAs("C:\Users\toto\Desktop\Classeur1.xlsx")
     
            xlApp.DisplayAlerts = True
     
            ReleaseObject(xlApp)
            ReleaseObject(xlBook)
            ReleaseObject(xlSheet)
     
            xlApp = Nothing
            xlBook = Nothing
            xlSheet = Nothing
            xlBook.Close()
            xlApp.Quit()
    Je mets toujours la fermeture à la fin sinon ca sous entends qu'il rouvre une instance d'application. Si tu n'as qu'un Workbook ouvert et que tu as fais un savesAS le fait de fermer le workbook tue egalement l'APPlication en tout cas c'est le cas avec excel 2010.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Ingénieur en Automatisme
    Inscrit en
    Février 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur en Automatisme
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2014
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    Effectivement ça aurait pu mais non, j'ai bien vérifié. J'ai même tenté de voir si sur un autre PC ça faisait pareil, et même résultat.

    J'ai tenté de les mettre à la fin mais en faisant ça, j'ai des erreurs lors de l’exécution si je ne met pas les lignes suivantes en commentaire, et en faisant ça le résultat est toujours le même.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     ReleaseObject(xlApp)
    ReleaseObject(xlBook)
    ReleaseObject(xlSheet)
     
    xlApp = Nothing
    xlBook = Nothing
    xlSheet = Nothing

  6. #6
    Membre averti
    Homme Profil pro
    Responsable Maintenance
    Inscrit en
    Août 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Responsable Maintenance

    Informations forums :
    Inscription : Août 2012
    Messages : 478
    Points : 442
    Points
    442
    Par défaut
    Pour ma part pour fermer une appli excel

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     ' sauvegarde des fichiers sous un autre nom et ferme les instances excel
            RichTextBox1.Text = RichTextBox1.Text & vbCrLf & "Sauvegarde des fichiers"
            APPxls.DisplayAlerts = False
            Appxls2.DisplayAlerts = False
            APPxls.ActiveWorkbook.SaveAs("Zodiacmodifié" & DTE & ".xls", FileFormat:=56)
            Appxls2.ActiveWorkbook.SaveAs("Clippermodifié" & DTE & ".xls", FileFormat:=56)
            RichTextBox1.Text = RichTextBox1.Text & vbCrLf & " Fermeture des fichiers"
            APPxls.ActiveWorkbook.Close()
            Appxls2.ActiveWorkbook.Close()
            RichTextBox1.Text = RichTextBox1.Text & vbCrLf & " Travail terminé"
    Bon je suis peut être et voir certainement un peu bourrin mais ca fonctionne dans ce cas il y avait 2 classeurs et donc 2 apps excel qui tournaient.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Ingénieur en Automatisme
    Inscrit en
    Février 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur en Automatisme
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2014
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    J'ai tenté, même résultat avec ton code :s

  8. #8
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 233
    Points : 336
    Points
    336
    Par défaut
    Essaye de mettre ton xlApp .Visible = True avant d'appeler le .Close() pour voir s'il n'y a pas un message d'erreur qui empêcherait la fermeture du processus.

    Edit : J'ai vu dans certaines discussions l'utilisation de GC.Collect (dans le finally du Try/Catch englobant l'utilisation du fichier Excel) pour supprimer le processus.
    "Hope for the best, but prepare for the worst."

  9. #9
    Membre à l'essai
    Homme Profil pro
    Ingénieur en Automatisme
    Inscrit en
    Février 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur en Automatisme
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2014
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    Aucune erreur à signaler avec xlApp .Visible = True
    Et aucun changement en ajoutant le GC.Collect à cet endroit là :/

  10. #10
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 233
    Points : 336
    Points
    336
    Par défaut
    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
            Try
                'Ajout du dataset dans le fichier Excel
                Dim RowInd As Int16 = 1
                Dim ColInd As Int16 = 1
     
                xlSheet.Range("A1", "Z5000").Value = ""
     
                For ColInd = 0 To 4
                    For Each Ligne As DataRow In MonDataSet.Tables("Alarms").Rows()
                        xlSheet.Cells(RowInd, ColInd + 1).Value = Ligne(ColInd).ToString
                        RowInd += 1
                    Next
                    RowInd = 1
                Next
                'Sauvegarde du fichier Excel et fermeture de la connection
                xlApp.DisplayAlerts = False
                xlSheet.SaveAs("C:\Users\toto\Desktop\Classeur1.xlsx")
                xlBook.Close(False)
                xlApp.Quit()
                xlApp.DisplayAlerts = True
     
                ReleaseObject(xlApp)
                ReleaseObject(xlBook)
                ReleaseObject(xlSheet)
     
                xlApp = Nothing
                xlBook = Nothing
                xlSheet = Nothing
            Catch ex As Exception
                'Gestion de l'exception à implémenter !
            Finally
                GC.Collect()
            End Try
    Comme ça ?
    "Hope for the best, but prepare for the worst."

  11. #11
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Excel est une vraie tête de cochon quand il s'agit de le fermer après une opération de pilotage par automation, que ce soit avec VB.net, Word, PowerPoint et le reste.

    Avec VB.net, une fois que j'ai "libéré" les objets Excel et je l'ai en principe quitté et fermé, j'utilise la classe Process pour vérifier s'il est toujours ouvert et le fermer au besoin.

    Tu peux aussi jeter un œil là-dessus:

    http://devcity.net/PrintArticle.aspx?ArticleID=239
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  12. #12
    Membre à l'essai
    Homme Profil pro
    Ingénieur en Automatisme
    Inscrit en
    Février 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur en Automatisme
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2014
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    Merci pour vos réponses, malgré ton code casiii, rien n'y fait, je vais devoir passé par le kill du process, pas le choix. Merci pour le lien, il va beaucoup m'aider, je passe la conversation en résolu.

  13. #13
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Hello,

    C'est déjà marqué comme résolu mais je lis des trucs qui me font peur.

    Il ne faut surtout passer par la classe process pour voir si Excel est toujours ouvert (à moins d'avoir le handle du process qu'on a ouvert nous-même) car si l'utilisateur à ouvert excel de lui-même et qu'il bosse dedans pour autre chose, cela va lui fermer son travail aussi.

    Voici comment je ferme Excel et tout se passe toujours très bien de mon côté.

    N.B. : Ce code vient bien sûr après avoir fermé (et sauvegardé) le workbook.

    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
    Imports Excel = Microsoft.Office.Interop.Excel
     
            Dim excelApp As Excel.Application = Nothing
            Dim wkbk As Excel.Workbook
            Dim sheet As Excel.Worksheet
     
            Try
                excelApp = New Excel.Application
                wkbk = excelApp.Workbooks.Open(path)
                sheet = wkbk.Sheets("le nom qui va bien")
     
                'effectuer ici le travail d'automation
     
                sheet = Nothing
                wkbk.Close(False)
                wkbk = Nothing
                ' Close Excel.
                excelApp.Quit()
                excelApp = Nothing
                Return True
            Catch ex As Exception
     
                sheet = Nothing
                If wkbk IsNot Nothing Then
                    wkbk.Close(False)
                    wkbk = Nothing
                End If
                ' Close Excel.
                excelApp.Quit()
                excelApp = Nothing
     
            End Try
    EDIT : Postage d'un code plus complet et explicite.
    Kropernic

  14. #14
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    vérifies que tu passe bien dans ReleaseObject!, en tous les cas ta méthode ReleaseObject fonctionne bien et rend la main au système!
    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
     
    Imports System.Data.SqlClient
    Imports xls = Microsoft.Office.Interop.Excel
     
    Module Module1
     
        Sub Main()
     
            Dim xlApp As New xls.Application
            xlApp .visible=true
            xlApp.Quit()
            ReleaseObject(xlApp)
          '  ReleaseObject(xlBook) ça ça ne sert à rien dans la mesure ou tu dispose de la classe maître le  reste s'effectue en cascade!
           ' ReleaseObject(xlSheet)
     
            xlApp = Nothing
            'xlBook = Nothing
           ' xlSheet = Nothing
        End Sub
     
     
        Private Sub ReleaseObject(ByVal obj As Object)
            Try
                System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
                obj = Nothing
            Catch ex As Exception
                obj = Nothing
            Finally
                GC.Collect()
            End Try
        End Sub
    End Module

  15. #15
    Membre à l'essai
    Homme Profil pro
    Ingénieur en Automatisme
    Inscrit en
    Février 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur en Automatisme
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2014
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    J'ai plus trop le temps de chercher d'avantage malheureusement,
    Mon programme s’exécutera la nuit donc aucun excel ne s’ouvrira pendant son exécution.

    Pour éviter de fermer un fichier non désiré j'ai trouvé le code suivant sur un autre forum et qui ne me ferme que le processus Excel ouvert lors de l’exécution.

    à l'init :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private mExcelProcesses() As Process
     
        Private Sub ExcelProcessInit()
            Try
                'Get all currently running process Ids for Excel applications
                mExcelProcesses = Process.GetProcessesByName("Excel")
            Catch ex As Exception
            End Try
        End Sub
    à la fin :

    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
    Private Sub ExcelProcessKill()
            Dim oProcesses() As Process
            Dim bFound As Boolean
     
            Try
                'Get all currently running process Ids for Excel applications
                oProcesses = Process.GetProcessesByName("Excel")
     
                If oProcesses.Length > 0 Then
                    For i As Integer = 0 To oProcesses.Length - 1
                        bFound = False
     
                        For j As Integer = 0 To mExcelProcesses.Length - 1
                            If oProcesses(i).Id = mExcelProcesses(j).Id Then
                                bFound = True
                                Exit For
                            End If
                        Next
     
                        If Not bFound Then
                            oProcesses(i).Kill()
                        End If
                    Next
                End If
            Catch ex As Exception
            End Try
        End Sub

  16. #16
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Citation Envoyé par Kropernic Voir le message
    Hello,

    C'est déjà marqué comme résolu mais je lis des trucs qui me font peur.

    si l'utilisateur à ouvert excel de lui-même et qu'il bosse dedans pour autre chose, cela va lui fermer son travail aussi.
    Ça c'est vrai.

    Chez-moi, ce n'est pas trop énervant, parce que ferme habituellement Excel avant de lancer mes programmes, mais, dans un environnement de travail, cela peut vraiment être un gros poblème.
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

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

Discussions similaires

  1. Cerveau : Le nombre de processus paralléles ne dépasserait pas 60
    Par Amine Horseman dans le forum Actualités
    Réponses: 9
    Dernier message: 13/11/2014, 13h51
  2. [PowerShell] stopper un processus qui ne répend pas
    Par cesar333 dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 19/09/2011, 20h17
  3. Un processus qui se ferme pas ?
    Par real_achilles dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 24/11/2009, 14h15
  4. Tuer un processus (Excel pour ne pas le citer)
    Par PsykotropyK dans le forum Access
    Réponses: 11
    Dernier message: 11/10/2006, 10h05

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