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 :

Problème fermeture Word [Toutes versions]


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2019
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2019
    Messages : 12
    Par défaut Problème fermeture Word
    Bonjour,

    J'ai une macro qui ouvre un fichier word, copie son contenu et le colle dans une feuil sur mon fichier excel.
    Après avoir collé mon fichier, je souhaite fermer mon fichier word. Le problème c'est que ça prend très longtemps (+ ou - 10 secondes) en testant en faisant pas à pas chaque ligne de mon code.
    Avez vous une idée de pourquoi ?
    La ligne en question (ligne 43):

    Le code de 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
    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
    Sub general()
     
        Dim shA As Worksheet
        Dim wB As Workbook
        Set shA = Sheets("x")
        Set wB = Workbooks.Open(Filename:="blabla.xlsx")
        Dim lastline, lastline2, number, index, diff, produit, nbproduit, index2, boucle As Integer
        Dim test As String
     
     
        'Update les produits du fichier de shipping UPS
        lastline = shA.UsedRange.Rows.Count
        lastline2 = wB.Sheets(1).UsedRange.Rows.Count
        index = lastline2
        number = shA.Cells(lastline, 2)
        While wB.Sheets(1).Cells(index, 2) <> number
            index = index - 1
        Wend
        wB.Sheets(1).Range("B" & index + 1 & ":F" & lastline2).Copy Destination:=shA.Range("B" & lastline + 1)
        wB.Close False
        Set wB = Nothing
     
        'On va chercher les produits dans les factures
        diff = lastline2 - index
        boucle = 1
        Dim WordDoc As Word.Document
        Dim WordApp As Word.Application
     
        While boucle <> diff
            produit = shA.Cells(lastline + 1, 2)
            Set WordApp = New Word.Application
            WordApp.Visible = False
            Set WordDoc = WordApp.Documents.Open("blabla.docx", ReadOnly:=True)
            With WordApp
                .Selection.WholeStory
                .Selection.Copy
            End With
     
            Sheets.Add.Name = "tmp"
            Set shA2 = Sheets("tmp")
            shA2.Range("A1").Select
            shA2.Paste
            WordApp.Quit
            Application.CutCopyMode = False
     
     
            nbproduit = 1
            index2 = 21
            shA.Cells(lastline + 1, 9) = shA2.Cells(20, 1)
            shA.Cells(lastline + 1, 10) = shA2.Cells(20, 2)
            lastline = lastline + 1
            While shA2.Cells(index2, 1) <> ""
                shA.Cells(lastline + 1, 1).EntireRow.Insert Shift:=xlDown
                shA.Cells(lastline + 1, 2) = shA.Cells(lastline + 1 - nbproduit, 2)
                shA.Cells(lastline + 1, 2).Interior.Pattern = xlNone
                shA.Cells(lastline + 1, 3) = shA.Cells(lastline + 1 - nbproduit, 3)
                shA.Cells(lastline + 1, 3).Interior.Pattern = xlNone
                shA.Cells(lastline + 1, 4) = shA.Cells(lastline + 1 - nbproduit, 4)
                shA.Cells(lastline + 1, 4).Interior.Pattern = xlNone
                shA.Cells(lastline + 1, 5).Interior.Pattern = xlNone
                shA.Cells(lastline + 1, 9) = shA2.Cells(index2, 1)
                shA.Cells(lastline + 1, 10) = shA2.Cells(index2, 2)
                lastline = lastline + 1
                index2 = index2 + 1
                nbproduit = nbproduit + 1
            Wend
     
        Set WordDoc = Nothing
        Set WordApp = Nothing
        Application.DisplayAlerts = False
        Sheets("tmp").Delete
        Set shA2 = Nothing
        boucle = boucle + 1
        Wend
     
        Set shA = Nothing
     
    End Sub
    Merci d'avance !

    Marty

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par MartySalade2 Voir le message
    Bonjour,

    Que vient faire votre ligne 6 ? Je n'ai pas peut-être pas bien compris et je ne connais pas tout, mais vous ouvrez un document Word en tant que classeur, est-ce normal ?
    Dans votre boucle While Wend, quelle est la nécessité d'instancier N fois l'application Word et d'ouvrir le même fichier Word alors que vous copiez la même chose ? En instanciant et en ouvrant 1 seule fois en dehors de la boucle, vous devriez gagner pas mal de temps. Accessoirement, avant de supprimer l'instance Word, il faudrait fermer proprement le fichier Word sans sauvegarder.

    Nb : En phase de développement, il serait plus sage de rendre Word visible...

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2019
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2019
    Messages : 12
    Par défaut
    Bonjour,

    Autant pour moi à la ligne 6 j'ouvre bien un classeur excel je me suis planté en voulant retirer le chemin pour ce post mais vous avez raison c'est bien un fichier excel.
    Pour le reste j'ai besoin de boucler sur différents fichiers. En effet, à chaque fois je dois ouvrir différent document word. J'ai mis "blabla.docx" pour la forme mais le nom du fichier change à chaque tour de boucle, j'en ouvre donc un nouveau à chaque tour.
    Pourriez vous m'indiquer comment fermer proprement le fichier word ?

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par MartySalade2 Voir le message
    OK, pour autant il n'est pas nécessaire d'ouvrir une instance Word chaque fois.

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 194
    Par défaut
    Bonjour le file,

    d'accord avec Eric KERGRESS, pourquoi ne pas boucler sur vos fichiers dans la session word que vous avez initiée ?

    et oui effectivement fermer word sans avoir au préalable fermé le fichier peu ralentir la fermeture de word.
    De plus j'ai déjà remarqué que les fichiers ouverts en lecture seule on tendance à être plus long à fermer. Dans votre cas je pense que c'est inutile et sans risque de l'ouvrir normalement(pas en lecture seule) vu que tout se fait par code et que l'on peu de toute façon forcer la fermeture du fichier sans enregistrement.

    Pour fermer vos fichiers :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WordDoc.Close False 'le false permet de fermet sans enregistrer autrement dit les éventuelles modifications sont ignorées.

  6. #6
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    D'accord avec ce qui a été dit : ces ouverture de fichier à l'intérieur de la boucle, c'est une horreur.

    Tout comme le WordApp.Quit.
    Qu'est-ce qui se passe si la personne qui utilise ton code avait un document Word déjà ouvert avant de lancer l'appli ? Le document serait fermé sans enregistrement !!!
    Rappelle-moi de ne jamais ouvrir une de tes pièces jointes.

    Selon moi, toute la partie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            Set WordApp = New Word.Application
            WordApp.Visible = False
            Set WordDoc = WordApp.Documents.Open("blabla.docx", ReadOnly:=True)
    devrait se trouver en dehors de la boucle et devrait être remplacée par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            Set WordDoc = GetObject("blabla.docx", ReadOnly:=True)
    Et tu devrais travailler sur WordDoc et non sur WordApp.

  7. #7
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2019
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2019
    Messages : 12
    Par défaut
    Bonjour et merci pour vos réponses. J'ai finalement sorti
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set WordApp = New Word.Application
            WordApp.Visible = False
    de ma boucle principale puisque en effet comme vous me l'avez fait remarqué il est inutile de réouvrir une application word à chaque fois. De ce fait c'est beaucoup plus rapide, c'est super !
    En revanche je n'ai pas remarqué de différence de temps en fonction de si je mets le fichier word en lecture seulement ou pas.

    Merci encore pour vos réponses

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

Discussions similaires

  1. Problème fermeture fichier .doc et appli word VBA
    Par thomas93 dans le forum Excel
    Réponses: 1
    Dernier message: 26/02/2014, 10h45
  2. [COM] Problème lié word
    Par mosca_coroneja dans le forum Bibliothèques et frameworks
    Réponses: 10
    Dernier message: 23/03/2006, 11h35
  3. Problème fermeture popup
    Par nicolb dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 25/02/2006, 08h53
  4. Probléme VBA Word et SQL server
    Par andrau dans le forum VBA Word
    Réponses: 2
    Dernier message: 12/10/2005, 11h52

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