Thread avec application Word [Résolu]

cs_JMO 1855 Messages postés jeudi 23 mai 2002Date d'inscription 24 juin 2018 Dernière intervention - 21 janv. 2016 à 20:05 - Dernière réponse : Whismeril 11955 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 20 août 2018 Dernière intervention
- 23 janv. 2016 à 13:38
Bonsoir le forum,

Avec VB 2010 Express, je créé des fichiers de consignes (word docx) à partir de plusieurs templates.
         ' Création des fichiers de Consignes
        Call CreateMOP(customer)

   '#####################################################################################
    '# Consignes : création des fichiers de Consignes
    '#####################################################################################
    Private Sub CreateMOP(ByVal customer As String)
        richtextboxlogscript.AppendText(dt(currentdate) & "Création des fichiers de Consignes")
        Call UpdateDataGridViewPDP(1, 2, Color.Cyan, New String(" "c, 2) & "En cours ( " & "1" & " / " & fileword.Count & " )", False)

        ' Déclaration des variables
        Dim pathinfile As String = pathroot & customer & pathconsigne
        Dim pathoutfile As String = pathroot & customer & pathsaveconsigne
        Dim countwordfile As Integer = 0

        For Each item In fileword ' fileword As New List(Of ListFileWord)
            ' Déclaration des variables
            Dim WordApp As Word.Application = New Word.Application()
            Dim WordDoc As New Word.Document
            Dim infile As String = item.FileWord
            Dim file As String = infile.Substring(infile.LastIndexOf("\") + 1)
            Dim filetrame As String = item.FileTrame
            Dim trame As String = filetrame.Substring(filetrame.LastIndexOf("\") + 1)
            Dim startparam As Integer = 14

            ' Ouverture Application Word
            WordApp.Visible = False
            WordApp.DisplayAlerts = CType(False, Microsoft.Office.Interop.Word.WdAlertLevel)
            WordApp.ScreenUpdating = False

            ' Ouverture du Template Trame de Consignes
            WordDoc = WordApp.Documents.Open(CType(item.FileTrame, Object), , True, , , , , , , , , False)
            System.Windows.Forms.Application.DoEvents()

            ' Mise à jour des champs CustomDocumentProperties du document Word 
            WordDoc.CustomDocumentProperties.Item(11) = item.Contract
            WordDoc.CustomDocumentProperties.Item(12) = item.Codebien
            WordDoc.CustomDocumentProperties.Item(13) = item.Category

            For w As Integer = 0 To item.Parameters.Count - 1
                WordDoc.CustomDocumentProperties.Item(startparam) = item.Parameters.Item(w)
                On Error Resume Next
                startparam += 1
            Next

            System.Windows.Forms.Application.DoEvents()
            ' Mise à jour des propriétés du document Word
            WordDoc.Fields.Update()
            System.Windows.Forms.Application.DoEvents()
            WordDoc.Application.DisplayAlerts = Word.WdAlertLevel.wdAlertsNone
            ' Sauvegarde de la Consigne
            WordDoc.SaveAs(FileName:=CType(item.FileWord, Object))
            System.Windows.Forms.Application.DoEvents()
            WordDoc.Close(SaveChanges:=False)
            System.Windows.Forms.Application.DoEvents()

            ' Fermeture Word
            WordApp.Application.DisplayAlerts = CType(True, Microsoft.Office.Interop.Word.WdAlertLevel)
            WordApp.Application.ScreenUpdating = True
            WordApp.Quit()
            WordApp = Nothing

            datagridviewfilescgn.Rows(countwordfile).Cells(3).Value = New String(" "c, 3) & "Consigne créée"
            datagridviewfilescgn.Item(3, countwordfile).Style.BackColor = Color.Lime
            Me.Refresh()
            System.Windows.Forms.Application.DoEvents()

            Thread.Sleep(3000) ' attente pour fermeture de Word

            countwordfile += 1
        Next
        Call UpdateDataGridViewPDP(1, 2, Color.Lime, New String(" "c, 2) & "Terminé", False)
    End Sub
L'appli est publiée sur un serveur distant (Londres), et de part plusieurs proxy, l'ouverture de Word prend environ 2-3' !!!
Dans un statustrip, j'ai plusieurs labels indiquant l'heure (HH:mm:ss) actuelle, la durée du script ...
Ces labels freezent à chaque création d'un fichier de consigne.

Question :
Est-il possible d'exécuter la sub "CreateMOP" dans un thread ?

Merci pour vos réponses.
Afficher la suite 

Votre réponse

4 réponses

Whismeril 11955 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 20 août 2018 Dernière intervention - 21 janv. 2016 à 20:25
0
Merci
Bonsoir,

il est possible de faire "n'importe quoi" dans un Thread.
Tu peux regarder le backgroundworker.

Tu peux aussi générer le docx sans ouvrir word, voir
https://docx.codeplex.com par exemple.

Vb.Net n'est pas ma spé, mais je ne pense pas que le call soit encore utile.
cs_JMO 1855 Messages postés jeudi 23 mai 2002Date d'inscription 24 juin 2018 Dernière intervention - 21 janv. 2016 à 20:47
Bonsoir Whismeril,

Merci pour tes liens indiqués.
Je vais potasser le composant BackgroundWorker.

Pour le call, oui il n'est pas indispensable, mais c'est ma nostalgie du vbs.
Cela permet de "voir" qu'on appelle une sub ou function.

Bonne soirée,
jean-marc
Commenter la réponse de Whismeril
cs_JMO 1855 Messages postés jeudi 23 mai 2002Date d'inscription 24 juin 2018 Dernière intervention - 23 janv. 2016 à 10:33
0
Merci
Bonjour le forum,

Bonjour Whismeril,

J'ai donc utilisé le composant backgroundworker.
Cela m'a contraint d'utiliser, pour la 1ère fois, les délégués pour mes autres contrôles.

Pour ton lien sur le docx, j'ouvrirai un nouveau post car je n'ai pas trouvé de correspondance en .Net

Merci Whismeril de tes précieux conseils, et bon week-end.

jean-marc
Whismeril 11955 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 20 août 2018 Dernière intervention - 23 janv. 2016 à 13:38
Bonjour,

Pour ton lien sur le docx, j'ouvrirai un nouveau post car je n'ai pas trouvé de correspondance en .Net
heu... c'est une librairie open sources, écrite en C# donc en .Net, que tu peux utiliser compilée (ce que j'ai fait) ou reprendre le code pour toi.

Il existe de bons traducteurs en ligne vers VB.Net.

Par contre il y a peu de docs et de tuto et ils sont en anglais.

Un jour si j'ai du temps, je ferai un petit tuto dessus.
Commenter la réponse de cs_JMO

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.