Vb.net - Erreur sur Visual Studio objet Com - Word

duge12 Messages postés 6 Date d'inscription vendredi 5 février 2010 Statut Membre Dernière intervention 7 février 2022 - 7 févr. 2022 à 11:37
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 - 8 févr. 2022 à 07:50
Bonjour,
Je pense que je vais avoir besoin d'un spécialiste.
Merci d'avance de vos réponses

Mon petit problème dans Visual Studio Community 2019 :

Assistant Débogage managé 'DisconnectedContext'  : 'Échec de la transition vers le contexte COM 0x788a88 pour ce RuntimeCallableWrapper avec l'erreur suivante : Échec d’un appel système. (Exception de HRESULT : 0x80010100 (RPC_E_SYS_CALL_FAILED)). Cela se produit habituellement car le contexte COM 0x788a88 dans lequel ce RuntimeCallableWrapper a été créé a été déconnecté ou est occupé à autre chose. Libération des interfaces du contexte COM actuel (contexte COM 0x788b40). Cela peut entraîner des dysfonctionnements ou des pertes de données. Pour éviter ce problème, assurez-vous que tous les contextes/cloisonnements/threads COM restent actifs et sont disponibles pour la transition des contextes, tant que l'application n'en a pas terminé avec les RuntimeCallableWrappers qui représentent les composants COM qui s'y trouvent.'

Mon code permet :
- Récupère des infos dans plusieurs fichiers Excel => les envois dans un fichier "Doc 1" (model word)
- modifier des photos qui sont dans des tableaux d'un document Word "ressource" avec plus ou moins de photos les copies => les envois dans le fichier "Doc 1
- et bien d'autre chose

Mon erreur se produis (ce n'est pas systématique) quand le document Word ressource comporte beaucoup d'images l'erreur finie par arriver plus ou moins vite (envions 50 photos), mais avant le "Doc 1" ralenti.

J'ai l'impression qu’à chaque fois que je demande une modification à Word cela engendre un "threads" dans Word, mais une fois la tache finie le "threads" ne libère pas les ressources et fini par surcharger Word, si c'est le cas comment libéré les ressource ?

Merci beaucoup de votre aide

5 réponses

Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
8 févr. 2022 à 07:50
Il existe pas mal de librairies pour écrire un docx directement.
Perso j'utilises Docx, parce que c'est une des plus anciennes, j'ai posté ici https://codes-sources.commentcamarche.net/source/101341-exemple-d-utilisation-de-la-librairie-docx un exemple d'utilisation.
Cet exemple ne montre évidement pas toutes les capacités de cette librairie.
Je ne me prononce pas pour le pdf, je n'ai jamais essayé.

De même pour extraire des datas d'Excel, il y a de multiples façons de procéder directement sur le fichier. Mais y'a tes macros.
Et tu ne pourrais pas faire les "calculs" de ces macros dans vb.net?
1
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
7 févr. 2022 à 12:59
Bonjour
Dans ma boule de cristal je vois qu’il manque une pinte à ligne 1664.

Si tu veux une réponse sérieuse, faut donner des éléments tangibles. Ton code par exemple, voir ce tuto https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code pour le poster lisiblement

0
duge12 Messages postés 6 Date d'inscription vendredi 5 février 2010 Statut Membre Dernière intervention 7 février 2022
7 févr. 2022 à 14:22
Bonjour Whismeril,

Je n'ais pas mis de code car je ne voyer pas quel partie vous mettre.

du coup je pense que je vais mettre des partie du code
=> définition dans la Form1
Public Path_Liste_fichier_bld() As String
Public Fichier_Word_Rapport As New Class_Word_rapport
Public Fichier_Word_Fuite As New Class_Word_Fuite
Public Path_wordFuite As String = ""


=> appel de la "Sub" depuis la Form1 qui se trouve dans la Class_Word_rapport

Private Sub Button_Rapport_Click(sender As Object, e As EventArgs) Handles Button_Rapport.Click
       

            Fichier_Word_Rapport.rapport_Word(Label_chemin_rapport_Word_choisi.Text, Path_Liste_fichier_bld.Count - 1, Path_wordFuite)
        

    End Sub



=> Class_Word_rapport

Imports Word = Microsoft.Office.Interop.Word
Imports System.IO

Public Class Class_Word_rapport
    Dim appWord As Word.Application
    Dim DocWord As Word.Document
    Dim DocRang As Word.Range
    Public Selection As Word.Selection
    Dim oPara1 As Word.Paragraph
    Dim oTabl As Word.Table
    Dim oPara2 As Word.Paragraph
    Dim oPara3 As Word.Paragraph
    Dim oImage As Word.InlineShape
    Dim Donnée_mesure As Class_Excel.Structure_mesure
    Dim GB_mesure As UserControl_FichierExcel
    Dim GB_EtatOuverture As UserControl_etat_ouverture_mesure
    Dim Pesse_papier_mémoire As Object

    Public Sub rapport_Word(Path_Trame_Word As String, nb_mesure As Integer, Path_Word_fuite As String)


        appWord = New Word.Application
        appWord.Visible = True
        'DocWord = New Word.Document
        DocWord = appWord.Documents.Add(Path_Trame_Word)
        System.Threading.Thread.Sleep(500)
        Selection = appWord.Selection


        Insertion_Photo_1er_page()

        Info_Bâtiment()
        PartieAdmin(nb_mesure)
        If VérificationSélection_Bookmarks("Essai_debut") Then
            For index As Integer = 0 To nb_mesure
                info_mesure(index)
            Next
        Else
            Debug.Print("Il n'y a pas de signer Essai_début")
        End If


        tableau_synthese_resultats(nb_mesure)
        If nb_mesure > 0 Then
            tableau_calcul_valeurs_pondérés(nb_mesure)
        End If


        If VérificationSélection_Bookmarks("Recherche_de_fuite") And Path_Word_fuite <> "" Then
            Form1.Fichier_Word_Fuite.Word_fuite(Path_Word_fuite, DocWord)
        Else
            Debug.Print("Il n'y a pas de signer Recherche de fuite ou le chemin pour le fichier word des fuites n'est pas enregistré")
        End If

        DocWord.Activate()

        insertion_certifica_étalonnage()

        MessageBox.Show("Rapport fini")


    End Sub



=> l'erreur se passe dans la partie Form1.Fichier_Word_Fuite.Word_fuite(Path_Word_fuite, DocWord)

donc voici la class Word Fuite

Imports Word = Microsoft.Office.Interop.Word
Public Class Class_Word_Fuite
    Dim appWord_fuite As Word.Application
    Dim DocWord_fuite As Word.Document
    Dim DocRang_fuite As Word.Range
    Dim Selection_rapport As Word.Selection


    'Dim DocWord2 As Word.Document
    Dim DocRang2 As Word.Range
    Dim Selection2 As Word.Selection



    Public Structure Structure_fuite
        Dim photo As Image
        Dim localisation As String
        Dim Description As String
        Dim vignette As String
        Dim Propostion_amélioration As String
        Dim Type_Fuite_Registre_Chapitre As String
        Dim Type_Fuite_Registre_Sous_Chapitre As String

    End Structure

    Public Sub Word_fuite(Path_Word_fuite As String, DocWord2 As Word.Document)

        Selection_rapport = Form1.Fichier_Word_Rapport.Selection ' On récuper la sélection faite dans le fichier word rapport au niveau du Bookmarks


        appWord_fuite = New Word.Application
        appWord_fuite.Visible = True
        'DocWord = New Word.Document
        DocWord_fuite = appWord_fuite.Documents.Add(Path_Word_fuite) ' Ouverture du document avec les fuites
        System.Threading.Thread.Sleep(500)
        Selection2 = appWord_fuite.Selection

        'DocWord = New Word.Document
        ' DocWord2 = appWord.Documents.Add()
        ' System.Threading.Thread.Sleep(500)


        Dim compteur As Integer = 0
        ' Dim tableau_temp As Word.Table




        For Each IndexTableau As Word.Table In DocWord_fuite.Content.Tables
            'IndexTableau.Range.Shading.BackgroundPatternColorIndex = Word.WdColorIndex.wdRed


            If Hex(Asc(IndexTableau.Cell(1, 1).Range.Text.ToString)) = "4E" Then
                Debug.Print("il s'agie du 1er type de tableau")
                Debug.Print("Tableau n°" & compteur & " nb ligne " & IndexTableau.Rows.Count)




            ElseIf IndexTableau.Cell(1, 1).Range.Text.ToString.IndexOf("Plan") <> -1 Then

                If IndexTableau.Cell(1, 1).Range.Text.ToString.IndexOf("Extrait") = -1 Then ' plans générale
                    Dim page_paysage As Boolean = True ' il faut testé l'orientation du plans dans le rapport d'origine et si en paysage on fais cela :
                    insertion_ligne()
                    déplacement_Selection(1)
                    If page_paysage Then
                        insertion_saute_section()
                        déplacement_Selection(1)

                        With Selection_rapport.PageSetup
                            .LineNumbering.Active = False
                            .Orientation = Word.WdOrientation.wdOrientLandscape
                            .TopMargin = appWord_fuite.CentimetersToPoints(3.75)
                            .LeftMargin = appWord_fuite.CentimetersToPoints(1.27)
                            .RightMargin = appWord_fuite.CentimetersToPoints(1.27)
                            .DifferentFirstPageHeaderFooter = False
                        End With
                    End If


                    'Selection_rapport.Range.Sections.Add(Selection_rapport.Range)
                    ' Selection_rapport.MoveDown(Word.WdUnits.wdParagraph, 1)
                    'Selection_rapport.Range.InsertParagraphAfter()
                    'Selection_rapport.Range.PageSetup.Orientation = Word.WdOrientation.wdOrientLandscape

                    Debug.Print("il s'agie d'un plans générale")
                    Debug.Print("Tableau n°" & compteur & " nb ligne " & IndexTableau.Rows.Count)

                    IndexTableau.Range.Copy()
                    coller_tableau()
                    System.Threading.Thread.Sleep(150)
                    Dim insertion As Boolean = False
                    compteur = 0
                    Do Until insertion
                        Try
                            Selection_rapport.Tables(1).Cell(2, 1).Select() ' on se met à la fin du tableau
                            Exit Do

                        Catch ex As Exception
                            Debug.Print("erreur pour sélection tableau du plans général " & "tentative n°" & compteur)
                            Debug.Print(ex.Message)
                            System.Threading.Thread.Sleep(200)
                        End Try
                        compteur = compteur + 1

                        If compteur = 5 Then
                            insertion = True 'Echec de l'insertion on quitte le DO
                            Debug.Print("Echec de la sélection du tableau")
                        End If
                    Loop


                    Do While Selection_rapport.Information(Word.WdInformation.wdWithInTable)

                        déplacement_Selection(1)
                    Loop


                    insertion_ligne()
                    déplacement_Selection(1)

                    If page_paysage Then
                        insertion_saute_section()
                        déplacement_Selection(1)

                        With Selection_rapport.PageSetup
                            .LineNumbering.Active = False
                            .Orientation = Word.WdOrientation.wdOrientPortrait
                            .TopMargin = appWord_fuite.CentimetersToPoints(3.75)
                            .LeftMargin = appWord_fuite.CentimetersToPoints(1.27)
                            .RightMargin = appWord_fuite.CentimetersToPoints(1.27)
                            .BottomMargin = appWord_fuite.CentimetersToPoints(1.27)
                            .DifferentFirstPageHeaderFooter = False
                        End With
                    End If




                Else ' extrais de plans
                    insertion_ligne()
                    déplacement_Selection(1)

                    Debug.Print("il s'agie d'un tableau pour un extrais de plans")
                    Debug.Print("Tableau n°" & compteur & " nb ligne " & IndexTableau.Rows.Count)

                    IndexTableau.Range.Copy()
                    coller_tableau()
                    System.Threading.Thread.Sleep(150)

                    Dim insertion As Boolean = False
                    compteur = 0
                    Do Until insertion
                        Try
                            Selection_rapport.Tables(1).Cell(2, 1).Select() ' on se met à la fin du tableau
                            Exit Do

                        Catch ex As Exception
                            Debug.Print("erreur pour sélection tableau extrais de plans " & "tentative n°" & compteur)
                            Debug.Print(ex.Message)
                            System.Threading.Thread.Sleep(200)
                        End Try
                        compteur = compteur + 1

                        If compteur = 5 Then
                            insertion = True 'Echec de l'insertion on quitte le DO
                            Debug.Print("Echec de la sélection du tableau")
                        End If
                    Loop

                    Do While Selection_rapport.Information(Word.WdInformation.wdWithInTable)

                        déplacement_Selection(1)
                        Debug.Print("Déplacement dans le tableau plans")
                    Loop

                    insertion_ligne()
                    déplacement_Selection(1)
                End If


            ElseIf IndexTableau.Cell(1, 1).Tables.Count > 0 Then  ' tableau avec les photos et les remarques
                Debug.Print("il s'agie du tableau photos")
                ' IndexTableau.Cell(1, 1).
                Debug.Print("Tableau n°" & compteur & " nb ligne " & IndexTableau.Rows.Count)
                'on va le modifir avant de le copier
                Dim compteur_ligne As Integer = 0



                For Each Row_in_tab As Word.Row In IndexTableau.Rows

                    For Each colums_in_tab As Word.Cell In Row_in_tab.Cells

                        For Each Tableau_in_tableau In colums_in_tab.Tables
                            Debug.Print("Modification du Tableau n° " & compteur_ligne & " dans le tableau")

                            ' Selection_rapport.Range.InsertParagraphAfter()
                            'System.Threading.Thread.Sleep(10)

                            If True Then


                                Tableau_in_tableau.Select()


                                Selection2.Font.Name = "Calibri"
                                Selection2.Font.Size = 11
                                Selection2.ParagraphFormat.SpaceBefore = 2
                                Selection2.ParagraphFormat.SpaceAfter = 2

                                Tableau_in_tableau.Rows.HeightRule = Word.WdRowHeightRule.wdRowHeightAuto ' On fait en sort que le tableau s'ajuste automatiquement au écriture
                                Tableau_in_tableau.PreferredWidthType = Word.WdPreferredWidthType.wdPreferredWidthPoints
                                Tableau_in_tableau.PreferredWidth = appWord_fuite.CentimetersToPoints(16)

                                'Selection_rapport.InlineShapes(1).Select()
                                For Each photo_shapes As Word.InlineShape In Selection2.InlineShapes

                                    photo_shapes.Height = appWord_fuite.CentimetersToPoints(My.Settings.Taille_photos) ' on réduit la photo avec la valeur enregistré dans les paramètre

                                    photo_shapes.Line.Visible = Microsoft.Office.Core.MsoTriState.msoTrue


                                Next
                                ' System.Threading.Thread.Sleep(20)
                                'Debug.Print("NB ligne : " & Selection_rapport.Tables(1).Rows.Count & " nb celule " & Selection_rapport.Tables(1).Rows(3).Cells.Count)

                                'DocWord2.Tables(DocWord2.Tables.Count).Rows(DocWord2.Tables(DocWord2.Tables.Count).Rows.Count).Cells(DocWord2.Tables(DocWord2.Tables.Count).Rows(DocWord2.Tables(DocWord2.Tables.Count).Rows.Count).Cells.Count).Select()
                                Tableau_in_tableau.Cell(1, 1).Shading.BackgroundPatternColorIndex = Word.WdColorIndex.wdAuto
                                If Form1.CheckBox_listeFuites_PropositionAmélioration.Checked = True Then
                                    Tableau_in_tableau.Cell(4, 2).Range.Text = "Proposition d'amélioration :" ' On éfface la date qui sert à rien
                                    Tableau_in_tableau.Cell(4, 2).Range.Font.Underline = Word.WdUnderline.wdUnderlineSingle
                                Else
                                    Tableau_in_tableau.Cell(4, 2).Range.Text = "" ' On éfface la date qui sert à rien
                                    Tableau_in_tableau.Cell(4, 2).Range.Font.Underline = Word.WdUnderline.wdUnderlineSingle
                                End If
                            End If


                        Next


                        compteur_ligne = compteur_ligne + 1

                        'Row_in_tab.Cells(1).Range.Select()
                        'Selection = appWord.Selection
                        'Selection.Shading.BackgroundPatternColorIndex = Word.WdColorIndex.wdDarkYellow
                        'Debug.Print("linge n° " & compteur_ligne & " tableau avec nb ligne " & Selection.Tables.Count)
                    Next
                Next
                compteur_ligne = 0



                For Each Row_in_tab As Word.Row In IndexTableau.Rows

                    For Each colums_in_tab As Word.Cell In Row_in_tab.Cells

                        For Each Tableau_in_tableau In colums_in_tab.Tables
                            Debug.Print("Colle Tableu n° " & compteur_ligne & " dans le tableau")
                            insertion_ligne() ' dans le word rapport
                            déplacement_Selection(1) ' dans le word rapport

                            Tableau_in_tableau.Range.Copy()
                            coller_tableau()
                            System.Threading.Thread.Sleep(150)
                            Dim insertion As Boolean = False
                            compteur = 0
                            Do Until insertion
                                Try
                                    Selection_rapport.Tables(1).Select()

                                    Selection_rapport.Tables(1).Cell(4, 2).Select() ' on se met à la fin du tableau
                                    Exit Do

                                Catch ex As Exception
                                    Debug.Print("erreur pour sélection tableau " & "tentative n°" & compteur)
                                    Debug.Print(ex.Message)
                                    System.Threading.Thread.Sleep(200)
                                End Try
                                compteur = compteur + 1

                                If compteur = 5 Then
                                    insertion = True 'Echec de l'insertion on quitte le DO
                                    Debug.Print("Echec de la sélection du tableau")
                                End If
                            Loop


                            compteur = 0
                            Do While Selection_rapport.Information(Word.WdInformation.wdWithInTable)

                                déplacement_Selection(1)
                                System.Threading.Thread.Sleep(150)
                                compteur = compteur + 1
                                If compteur = 5 Then
                                    Debug.Print("On fait une pose de 3 s")
                                    System.Threading.Thread.Sleep(3000)

                                ElseIf compteur = 10 Then
                                    Debug.Print("On fait une pose de 10 s")
                                    System.Threading.Thread.Sleep(10000)

                                ElseIf compteur = 15 Then
                                    Debug.Print("On fait une pose de 3 s")
                                    System.Threading.Thread.Sleep(3000)

                                ElseIf compteur = 20 Then
                                    Debug.Print("On fait une pose de 10 s et on remet le compteur à 0")
                                    System.Threading.Thread.Sleep(10000)

                                    compteur = 0
                                End If

                                Debug.Print("Déplacement dans le tableau photos n° " & compteur_ligne & " Déplacement n° " & compteur)
                            Loop
                            'Selection_rapport.Range.InsertParagraphAfter()
                            ' Selection_rapport.MoveDown(Word.WdUnits.wdParagraph, 1)

                            'Tableau_in_tableau.Range.Shading.BackgroundPatternColorIndex = Word.WdColorIndex.wdDarkYellow
                        Next


                        compteur_ligne = compteur_ligne + 1

                        'Row_in_tab.Cells(1).Range.Select()
                        'Selection = appWord.Selection
                        'Selection.Shading.BackgroundPatternColorIndex = Word.WdColorIndex.wdDarkYellow
                        'Debug.Print("linge n° " & compteur_ligne & " tableau avec nb ligne " & Selection.Tables.Count)
                    Next
                Next

            Else
                Debug.Print("Autre tableau")
                Debug.Print("Tableau n°" & compteur & " nb ligne " & Hex(Asc(IndexTableau.Cell(1, 1).Range.Text.ToString)))
                Debug.Print("Tableau n°" & compteur & " nb ligne " & IndexTableau.Cell(1, 1).Range.Text.ToString)
            End If


            compteur = compteur + 1
            ' Tableau de donner avec description et localisation
            ' Tableau avec toutes les photos
            ' Tableau avec le plan
            ' Plusieurs tableau avec les extrais de plans


        Next

        ' compteur = 0
        ' For Each IndexTitre As Word.Paragraph In DocWord.Content.Paragraphs

        'Debug.Print("paragraphe n°" & compteur & " " & IndexTitre.Range.Text.ToString)
        'compteur = compteur + 1
        'Next

        ' compteur = 0
        ' For Each photo_shapes As Word.Shape In DocWord_fuite.Shapes
        ' vignette, plans, extrais de plans
        'photo_shapes.Height = 100
        'photo_shapes.Width = 100
        ' Debug.Print("Immage n°" & compteur & " " & photo_shapes.Height)
        'compteur = compteur + 1

        ' Next
        'compteur = 0
        'For Each photo_inshapes As Word.InlineShape In DocWord_fuite.InlineShapes
        'photos + localisation de l'extrais de plans


        'photo_inshapes.Height = 50
        'photo_inshapes.Width = 50

        'Debug.Print("Immage type 2 n°" & compteur & " " & photo_inshapes.Height)
        ' compteur = compteur + 1

        'Next

        appWord_fuite.Visible = True
    End Sub

    Private Sub insertion_ligne()
        Dim insertion As Boolean = False
        Dim compteur As Integer = 0
        Do Until insertion
            Try
                Selection_rapport.Range.InsertParagraphAfter() ' on insert un ligne
                insertion = True 'insertion réussite on quitte le DO
                Exit Sub

            Catch ex As Exception
                Debug.Print("erreur d'insertion d'une ligne " & "tentative n°" & compteur)
                Debug.Print(ex.Message)
                System.Threading.Thread.Sleep(50)
            End Try
            compteur = compteur + 1

            If compteur = 5 Then
                insertion = True 'Echec de l'insertion on quitte le DO
                Debug.Print("Echec de l'insertion de la ligne")
            End If
        Loop
    End Sub

    Private Sub déplacement_Selection(nb_linge As Integer)
        Dim insertion As Boolean = False
        Dim compteur As Integer = 0
        Do Until insertion
            Try
                Selection_rapport.MoveDown(Word.WdUnits.wdParagraph, nb_linge) ' on descendre de nb ligne
                insertion = True 'insertion réussi on quitte le DO
                Exit Sub

            Catch ex As Exception
                Debug.Print("erreur de mouvement de nb ligne " & "tentative n°" & compteur)
                Debug.Print(ex.Message)
                System.Threading.Thread.Sleep(50)
            End Try
            compteur = compteur + 1

            If compteur = 5 Then
                insertion = True 'Echec de l'insertion on quite le DO
                Debug.Print("Echec de du mouvement")
            End If
        Loop
    End Sub

    Private Sub insertion_saute_section()
        Dim insertion As Boolean = False
        Dim compteur As Integer = 0
        Do Until insertion
            Try
                Selection_rapport.Range.InsertBreak(Word.WdBreakType.wdSectionBreakNextPage) ' on déssant de nb ligne
                insertion = True 'insertion réussi on quitte le DO
                Exit Sub

            Catch ex As Exception
                Debug.Print("erreur saut de section " & "tentative n°" & compteur)
                Debug.Print(ex.Message)
                System.Threading.Thread.Sleep(50)
            End Try
            compteur = compteur + 1

            If compteur = 5 Then
                insertion = True 'Echec de l'insertion on quitte le DO
                Debug.Print("Echec de de l'insertion de saute de section")
            End If
        Loop
    End Sub
    Private Sub coller_tableau()
        Dim insertion As Boolean = False
        Dim compteur As Integer = 0
        Do Until insertion
            Try
                'Selection_rapport.Range.PasteAndFormat(Word.WdRecoveryType.wdFormatOriginalFormatting) ' on colle le tableau
                Selection_rapport.Range.PasteSpecial(DataType:=Word.WdPasteDataType.wdPasteRTF)
                insertion = True 'insertion réussie on quitte le DO
                Exit Sub

            Catch ex As Exception
                Debug.Print("erreur pour le collage " & "tentative n°" & compteur)
                Debug.Print(ex.Message)
                System.Threading.Thread.Sleep(50)
            End Try
            compteur = compteur + 1

            If compteur = 5 Then
                insertion = True 'Echec de l'insertion on quitte le DO
                Debug.Print("Echec du collage")
            End If
        Loop
    End Sub

    Private Sub modification_oriantation_page() ' Non utilisé
        Dim insertion As Boolean = False
        Dim compteur As Integer = 0
        Do Until insertion
            Try
                With Selection_rapport.PageSetup
                    .LineNumbering.Active = False
                    .Orientation = Word.WdOrientation.wdOrientPortrait
                    '.TopMargin = appWord_fuite.CentimetersToPoints(2.5)
                    .DifferentFirstPageHeaderFooter = False
                End With
                Exit Sub

            Catch ex As Exception
                Debug.Print("erreur pour le collage " & "tentative n°" & compteur)
                Debug.Print(ex.Message)
                System.Threading.Thread.Sleep(50)
            End Try
            compteur = compteur + 1

            If compteur = 5 Then
                insertion = True 'Echec de l'insertion on quitte le DO
                Debug.Print("Echec du collage")
            End If
        Loop
    End Sub
End Class


a savoir que le code fonctionne mais il n'est pas optimiser :-)
0
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
7 févr. 2022 à 16:00
Ok, donc tu utilises l’API.
De base c’est lent, car ton programme parle à l’API qui parle à Word ou à Excel et l’application en question fait une action.
En plus selon ton premier message il doit y a avoir une instance d’excel et 2 de word.

Vue qu’à priori ton besoin est d’extraire des données de documents pour en créer un autre, travailler directement sur les fichiers serait bien plus rapide.
Enfin si ces documents sont des xlsx et et docx, car si ce sont des .xls et des .doc, c’est pas possible.

Ensuite, ce qui ralentit aussi le processus c’est que word soit visible.
OK, on voit la progression et si ça plante, on s’en rends compte, mais tu fais travailler les threads d’affichage de Word et d’Excel sans forcément que ce soit nécessaire. Il y a fort à parier que les 3 instances se lancent sur le même écran et plus ou moins les unes sur les autres. Avec cette méthode l’affichage du logiciel du dessous et mis à jour quand tu te déplaces dedans pour lire des données

Si on travaille directement sur les fichiers les 2 fichiers sources ne sont pas ouverts par word et excel et le fichier résultat ne l’est qu’à la fin pour voir le résultat.


Tu imagines bien que pour l’instant je n’ai pas lu tout le code, mais en le survolant je m’étonne du nombre de thread.sleep.
Ça non plus ce n’est pas top en terme de vitesse de travail. Si tu demandes une « pause » de 500ms, ça ne veut pas dire qu’à la ms 501, ton programme va repartir.
Mais qu’à partir de ce moment la prochaine ligne à exécuter va pouvoir rentrer à nouveau dans la file d’attente du processeur.
Supposons qu’un thread prioritaire qui dure 3 secondes est lancé pendant les 500ms ou pendant que tu es dans la file d’attente, tu auras en réalité 3500ms d’attente avant que la file d’attente avance.
Note que si un thread devient prioritaire, même sans thread.sleep, tu peux te retrouver en file d’attente
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
duge12 Messages postés 6 Date d'inscription vendredi 5 février 2010 Statut Membre Dernière intervention 7 février 2022
7 févr. 2022 à 22:01
Déjà merci pour ton analyse.
Pour info le programme va ouvrir entre 1 et 7 fichiers Excel, qui sont tous affichés, car après leur ouverture chaque fichier Excel va exécuter une macro.

Si les thread.sleep sont là c'est qu'il me permet d'évité des bugs. En gros je préfère que mon code soit moins rapide mais qui ne plante pas.... lol

Du coup comment puits-je travailler directement sur les fichiers docx avec Vb.net et ou trouver des exemples de code ?

Petite question complémentaire j'aurais également besoins d'intégré des pages d'un fichier PDF dans le word (sous un format image ou autre) ?
0
Rejoignez-nous