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

VBA Word Discussion :

Pb de fermeture d'Excel dans une fonction lancée dans Word [WD-2003]


Sujet :

VBA Word

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 13
    Points : 10
    Points
    10
    Par défaut Pb de fermeture d'Excel dans une fonction lancée dans Word
    Bonjour,

    Voici ma problématique (et ce n'est pas faute d'avoir cherché même si novice en développement VBA) :
    J'ai développé un code sous Word faisant devant chercher dans un fichier excel si le nom d'un client figure bien dans la feuille qui a été spécifiée.
    Pour cela, je fais appel à une fonction qui vient ouvrir le fichier excel, recherche l'existence ou non du nom du client dans la feuille Excel puis renvoie à Word le résultat de la recherche.
    Le problème n'est pa d'obtenir le résultat de ma recherche. Le problème est, qu'à la fin de l'exécution de la fonction, l'application Excel qui a été ouverte (même si elle n'apparaît pas à l'affichage) ne se ferme pas, ce qui génère systématiquement une erreur lorsque je fais de nouveau appel à la fonction dans une boucle.
    J'ai peut-être identifié la zone du code qui pose problème parce que lorsque je la supprime, l'application Excel initialement ouverte se ferme systématiquement à la sortie de la fonction.

    Quelqu'un pourrait-il m'aider à recoder pour éviter la génération de l'erreur et permettre la fermeture de l'application Excel à la sortie de la fonction.

    Merci de toute l'aide que je pourrais obtenir sur ce sujet.

    Ci-dessous le code créé.

    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
    Public Function Verif_nom (NomClient As String) As String
     
        Rep_ref = "C:\Repertoire\"
        Fichier_ref= "Liste des clients.xls"
        Feuil = "Candidats"
     
        Set xlAppl = CreateObject("excel.application")
        Set exlFichier =xlAppl.Workbooks.Open (Rep_ref & Fichier_rf, ReadOnly:=True)
     
    'Début du code qui apparemment pose problème
        Set exlRange = exlFichier.Worksheets(Feuil).Range("B5", Range("B5").SpecialCells(xlLastCell))
        If Not (exlRange.Find(What:=NomClient, LookAt:=xlWhole)) Is Nothing Then
            ligne = exlRange.Find(What:=NomClient, LookAt:=xlWhole).Row
            colonne = exlRange.Find(What:=NomClient, LookAt:=xlWhole).Column
            Verif_nom = "Client"
        Else
            Verif_nom  = "Inconnu"
        End If
    'Fin du code qui pose apparemment problème
     
        Set exlRange = Nothing
        exlFichier.Close SaveChanges:=False
        Set exlFichier = Nothing
     
    End Function

  2. #2
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    Salut,

    Pour un objet Application, c'est Quit que tu dois utiliser.

    Dans ton code qui n'est pas faux, tu utilises du LateBinding : on lie la bibliothèque par le code lors de son éxécution.
    On perd de ce fait l'IntelliSense qui est une aide à l'écriture de code fournie par VBE.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set xlAppl = CreateObject("excel.application")
    Si tu ajoutes la bibliothèque Excle à ton projet (Outils => Références => Microsoft Excel), tu peux utiliser une instance d'excel plus simplement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim xlApp As Excel.Application
     
    Set xlApp = New Excel.Application
    dans tous les cas, il est préférable de déclarer tes variables, chose que tu n'as pas faite dans ton code.

    Et pour fermer Excel dans ton code :

    ou
    Dans le mien.
    Et la libération des objets

    J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ?
    Débutez en VBA

    Mes articles


    Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus !

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    Merci Heureux-oli pour ta réponse.
    J'ai pris en compte tes suggestions et recodé en déclarant toutes mes variables.
    Le problème persiste cependant.
    Je pense avoir mieux ciblé le noeud du problème.

    J'ai modifié le code comme suit :
    set exlRange = exlFichier.Worksheets(Feuil).Range("B5", Range("B5").SpecialCells(xlLastCell))
    set Cel=exlRange.Find(What:=NomClient, LookAt:=xlWhole)

    Au premier lancement de la fonction, on trouve bien la valeur NomClient dans la feuille Excel.
    Au second appel de la fonction (via une boucle), on ne trouve pas la 2ème valeur NomClient bien que cette dernière existe et le fichier initialement ouvert ne s'étant pas fermé pas, une erreur est générée.

    Lorsque je suis plus précis sur la plage de recherche (par exemple set exlRange = exlFichier.Worksheets(Feuil).Range("B5:Z1000"), je n'ai plus ce problème (toutes les valeurs sont trouvées si elles existent et aucune erreur dans l'exécution de la fonction).
    J'ai l'impression que la première commande garde le focus sur la plage et refuse de fermer le fichier.

    Quelq'un pourrait-il me dire comment pallier à ce problème ?

    Merci par avance

  4. #4
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    Salut,

    Même avec un .Quit ?

    Si tu ouvres une nouvelle instance d'une application, elle reste ouverte.

    Tu as deux options soit tu rends l'application visible, soit tu quittes l'application.
    J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ?
    Débutez en VBA

    Mes articles


    Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus !

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    Salut,

    Je confirme qu'avec un .quit je ne parviens pas à fermer mon fichier excel. Mais peut-être que le problème vient du code extérieur à la fonction.
    La parade que j'ai trouvée semble fonctionner. Le seul risque est d'avoir à un instant t des valeurs qui ne sont pas prises en compte si d'avenir ces dernières dépassent la plage spécifiée.

    Encore merci pour ton aide.

  6. #6
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    Salut,

    Mets tout le code.
    J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ?
    Débutez en VBA

    Mes articles


    Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus !

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    Désolé, j'étais absent d'où cette réponse tardive.
    Voici le code demandé


    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
    82
    83
    84
    85
    86
    87
    88
    89
    Public Sub Traitement_dossier()
     
        Application.ScreenUpdating = False
     
        ' mémorisation classeur courant
        Set CC = ActiveWorkbook
     
        CC.Sheets(Nom_feuille_OF).Activate
        i = 6
     
        Dossier = Cells(i, 1)
     
        Do While Dossier<> ""
     
            Application.ScreenUpdating = True
            Rows(i).Select
            Application.ScreenUpdating = False
     
            Nom_Client = Cells(i, CNomClient)
            If Verif_nom(Nom_Client) = "Ok" Then
     
    	...
     
            Else
                MsgBox "Client "  & Num_OF & " inexistant"
            End If
     
            i = i + 1
     
            CC.Sheets(Nom_feuille_OF).Activate
            Dossier= Cells(i, 1)
        Loop
     
        Application.ScreenUpdating = True
     
    End Sub
     
     
    Public Function Verif_nom(NomClient As String) As String
     
        Dim xlAppl As Excel.Application
        Dim ligne, colonne As Integer
        Dim Matricule,  Categorie, Desc, Classement, Ville As String
     
        Rep_ref = "C:\Repertoire\"
        Fichier_ref= "Liste des clients.xls"
        Feuil = "Candidats"    
     
        Set xlAppl = New Excel.Application
        Set exlFichier = xlAppl.Workbooks.Open(Rep_rf & Fichier_ref, ReadOnly:=True)
        Set exlRange = exlFichier.Worksheets(Feuil).Range("B6", Range("B6").SpecialCells(xlLastCell))
     
        Set Cel = exlRange.Find(What:=NomClient, LookAt:=xlWhole) '
     
        If Not (Cel) Is Nothing Then ' Cas où le nom du client est trouvée
            ligne = Cel.Row          ' Récupère le numéro de la ligne sur laquelle se trouve le nom du client
            colonne = Cel.Column     ' Récupère le numéro de la colonne sur laquelle se trouve le nom du client
            Ville = exlFichier.Worksheets(Feuil).Cells(ligne, ColVille) 
     
    	If Ville <> "Paris" And Ville <> "Lyon" Then
                Verif_nom = "Nok"
                Cells(i, CMat) = "Client hors Ville"
            Else
     
                Verif_nom = "Ok"
     
                Matricule = exlFichier.Worksheets(Feuil).Cells(ligne, 2) 
                Categorie = exlFichier.Worksheets(Feuil).Cells(ligne, 3)
                Desc = exlFichier.Worksheets(Feuil).Cells(ligne, 4)  
                Classement = exlFichier.Worksheets(Feuil).Cells(ligne, 5)
     
                Cells(i, 2) = Matricule
                Cells(i, 3) = Categorie
                Cells(i, 4) = Desc
                Cells(i, 5) = Classement
     
        	End If
        Else
            Verif_nom = "Nok"
         End If
     
        Set exlRange = Nothing
        Set Cel = Nothing
        exlFichier.Close SaveChanges:=False
        Set exlFichier = Nothing
        xlAppl.Quit
        Set xlApp = Nothing
     
    End Function

  8. #8
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    Salut,

    Dans le code, tu ne fermes pas et ne libère pas tous les objets.

    CC par exemple n'est pas fermé ni libéré, ce qui provoque une erreur lors de la fermeture d'Excel.

    Chaque objet ouvert doit être refermé dans la procédure où il est déclaré.
    Ou lors de sa dernière utilisation lorsqu'il est déclaré hors d'une routine.
    J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ?
    Débutez en VBA

    Mes articles


    Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus !

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

Discussions similaires

  1. erreur dans une requête sql dans une fonction php
    Par frboyer dans le forum Langage
    Réponses: 3
    Dernier message: 07/04/2009, 13h37
  2. Réponses: 10
    Dernier message: 14/03/2009, 13h36
  3. [AJAX] [XAJAX] Lancer une fonction JS dans une fonction AJAX
    Par sixieme-sens dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 26/12/2008, 15h26
  4. Réponses: 1
    Dernier message: 25/10/2007, 21h25
  5. Réponses: 10
    Dernier message: 18/04/2007, 17h17

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