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

C# Discussion :

Ajouter macro dans document word


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de ac/dc
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2006
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2006
    Messages : 369
    Par défaut Ajouter macro dans document word
    Bonjour,

    J'ai créé une classe C# pour ajouter une macro dans des documents word.
    Or, lorsque je livre cette application au client, il me dit que des processus "winword.exe" restent ouvert une fois le traitement
    sur le répertoire terminé. Il y a autant de processus que de fichiers traités.

    Je ne sais pas quelle version de Word il utilise, mais moi avec Word2003, aucun processus et tous les fichiers se ferment une fois traités.

    Le "MsWord.Quit(ref Missing, ref Missing, ref Missing);" ne ferait-il pas son travail ??

    Merci

    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
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.IO;
     
    using Microsoft.Office.Interop.Word;
    using Microsoft.Vbe.Interop;
     
    namespace WindowsApplication1
    {
    	public partial class FormPrincipal : Form
    	{
    		public FormPrincipal()
    		{
    			InitializeComponent();
    		}
     
    		private void FormPrincipal_Load(object sender, EventArgs e)
    		{
    		}		
     
    		/// <summary>
    		/// Lancement du traitement
    		/// </summary>
    		/// <param name="sender"></param>
    		/// <param name="e"></param>
    		private void btn_Lancement_Click(object sender, EventArgs e)
    		{
    			string RepertoireDeRecherche = tbx_PathDesFichiers.Text;
     
    			if (!Directory.Exists(RepertoireDeRecherche))
    			{
    				MessageBox.Show("Veuillez choisir un répertoire existant", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
    				return;
    			}
     
    			// On rends inactif le bouton de lancement
    			btn_Lancement.Enabled = false;
     
    			// Ajoute la macro dans tous les documents .doc du répertoire
    			foreach (string FichierCourant in Directory.GetFiles(RepertoireDeRecherche, "*.doc", SearchOption.AllDirectories))
    			{
    				try
    				{
    					AjouterMacroDansDocumentWord(FichierCourant);
    				}
    				catch (Exception)
    				{
    					continue;
    				}
    			}
     
    			// Ajoute la macro dans tous les documents .dot du répertoire
    			foreach (string FichierCourant in Directory.GetFiles(RepertoireDeRecherche, "*.dot", SearchOption.AllDirectories))
    			{
    				try
    				{
    					AjouterMacroDansDocumentWord(FichierCourant);
    				}
    				catch (Exception)
    				{
    					continue;
    				}
    			}
     
    			MessageBox.Show("Le traitement sur ce répertoire est terminé", "Traitement terminé", MessageBoxButtons.OK, MessageBoxIcon.Information);
     
    			// On rends actif le bouton de lancement
    			btn_Lancement.Enabled = true;
    		}
     
    		/// <summary>
    		/// Ajoute une macro dans un fichier word fourni en paramètre
    		/// </summary>
    		/// <param name="NomFichierWordComplet">Le nom complet du fichier word (avec son path)</param>
    		public void AjouterMacroDansDocumentWord(string NomFichierWordComplet)
    		{
    			object FileName = NomFichierWordComplet;
     
    			// Connexion à Word
    			Microsoft.Office.Interop.Word.Application MsWord = new Microsoft.Office.Interop.Word.Application();
    			MsWord.Visible = true; // mettez cette variable à true si vous souhaitez visualiser les opérations.
    			object Missing = System.Reflection.Missing.Value;
     
    			if (File.Exists((string)FileName))
    			{
    				// Ouverture du document
    				Document Doc = MsWord.Documents.Open(ref FileName, ref Missing, ref Missing,
    													ref Missing, ref Missing, ref Missing, ref Missing, ref Missing,
    													ref Missing, ref Missing, ref Missing, ref Missing, ref Missing,
    													ref Missing, ref Missing, ref Missing);
     
    				VBComponent Comp = Doc.VBProject.VBComponents.Add(Microsoft.Vbe.Interop.vbext_ComponentType.vbext_ct_StdModule);
    				Comp.Name = "Module";
    				CodeModule Module = Doc.VBProject.VBComponents.Item("Module").CodeModule;
     
    				int NbLignes = Module.CountOfLines;
    				Module.InsertLines(NbLignes + 1, "Sub AutoOpen()");
    				Module.InsertLines(NbLignes + 2, "' AutoOpen Macro");
    				Module.InsertLines(NbLignes + 3, "' Macro created 05/10/2008 by acer");
    				Module.InsertLines(NbLignes + 4, "Dim aStory As Range");
    				Module.InsertLines(NbLignes + 5, "Dim aField As Field");
    				Module.InsertLines(NbLignes + 6, "Dim tableau(1000) As String");
    				Module.InsertLines(NbLignes + 7, "Dim i As Integer");
    				Module.InsertLines(NbLignes + 8, "Dim majOK As Boolean");
    				Module.InsertLines(NbLignes + 9, "Dim cptTableau As Integer");
    				Module.InsertLines(NbLignes + 10, "cptTableau = 0");
    				Module.InsertLines(NbLignes + 11, "For Each aStory In ActiveDocument.StoryRanges");
    				Module.InsertLines(NbLignes + 12, "For Each aField In aStory.Fields");
    				Module.InsertLines(NbLignes + 13, "majOK = True");
    				Module.InsertLines(NbLignes + 14, "For i = 0 To cptTableau");
    				Module.InsertLines(NbLignes + 15, "If UCase(tableau(i)) = UCase(aField.Code.Text) Then");
    				Module.InsertLines(NbLignes + 16, "majOK = False");
    				Module.InsertLines(NbLignes + 17, "End If");
    				Module.InsertLines(NbLignes + 18, "Next i");
    				Module.InsertLines(NbLignes + 19, "If majOK = True Then");
    				Module.InsertLines(NbLignes + 20, "aField.Update");
    				Module.InsertLines(NbLignes + 21, "If InStr(aField.Code.Text, \"ASK\") <> 0 Then");
    				Module.InsertLines(NbLignes + 22, "tableau(cptTableau) = aField.Code.Text");
    				Module.InsertLines(NbLignes + 23, "cptTableau = cptTableau + 1");
    				Module.InsertLines(NbLignes + 24, "End If");
    				Module.InsertLines(NbLignes + 25, "End If");
    				Module.InsertLines(NbLignes + 26, "Next aField");
    				Module.InsertLines(NbLignes + 27, "Next aStory");
    				Module.InsertLines(NbLignes + 28, "ActiveWindow.Activate");
    				Module.InsertLines(NbLignes + 29, "ActiveWindow.WindowState = wdWindowStateMaximize");
    				Module.InsertLines(NbLignes + 30, "If (ActiveWindow.View.ShowFieldCodes) Then");
    				Module.InsertLines(NbLignes + 31, "ActiveWindow.View.ShowFieldCodes = Not ActiveWindow.View.ShowFieldCodes");
    				Module.InsertLines(NbLignes + 32, "End If");
    				Module.InsertLines(NbLignes + 33, "End Sub");
     
    				// Sauver le document
    				Doc.SaveAs(ref Missing, ref Missing, ref Missing, ref Missing, ref Missing,
    							ref Missing, ref Missing, ref Missing, ref Missing, ref Missing,
    							ref Missing, ref Missing, ref Missing, ref Missing, ref Missing,
    							ref Missing);
     
    				Doc.Close(ref Missing, ref Missing, ref Missing);
    			}
     
    			// Fermeture de word
    			MsWord.Quit(ref Missing, ref Missing, ref Missing);
    		}
    	}
    }

  2. #2
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Par défaut
    Ce problème a été abordé (et résolu) avec Excel dans ce post : Problème d'Interop avec MSExcel.
    Il en est de même avec Word.

  3. #3
    Rédacteur
    Avatar de Paul Musso
    Profil pro
    Inscrit en
    Août 2008
    Messages
    368
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2008
    Messages : 368
    Par défaut
    Bonjour,

    Sur la ressource Microsoft suivante, ils font aussi appel à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    System.Runtime.InteropServices.Marshal.ReleaseComObject (MsWord);
    System.Runtime.InteropServices.Marshal.ReleaseComObject (Doc);
    Peut-être que cela résoudra ton problème ...

  4. #4
    Membre éclairé Avatar de ac/dc
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2006
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2006
    Messages : 369
    Par défaut
    Merci, dans le cas de l'erreur sous Excel, il ne faut pas utiliser les 3 versions données mais qu'une seule ?

  5. #5
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Par défaut
    Citation Envoyé par ac/dc Voir le message
    Merci, dans le cas de l'erreur sous Excel, il ne faut pas utiliser les 3 versions données mais qu'une seule ?
    Oui, c'est un peu comme si tu voulais mettre une ceinture et des bretelles

    Une seule solution suffit, encore faut-il qu'elle fonctionne ! Pour ma part, j'utilise le dernière (Process.Kill), la plus efficace car les autres n'ont jamais fonctionné à chaque fois que j'ai du y recourir. Raison de plus si tu ne connais pas a priori la version installée sur le poste de ton client.

Discussions similaires

  1. [WD-2007] Macro insertion PDF dans document word
    Par atlain75 dans le forum VBA Word
    Réponses: 1
    Dernier message: 22/12/2010, 20h36
  2. ajoute photo dans doc word grace au publipostage
    Par popofpopof dans le forum Word
    Réponses: 4
    Dernier message: 11/03/2008, 08h43
  3. pb de marge dans document word
    Par suffixe dans le forum Delphi
    Réponses: 1
    Dernier message: 08/03/2007, 13h02
  4. Recherche dans documents Word et OLE
    Par pinson dans le forum C#
    Réponses: 2
    Dernier message: 20/02/2007, 14h50
  5. Sélection dans document Word et validation
    Par ptilo dans le forum VBA Word
    Réponses: 1
    Dernier message: 15/06/2006, 10h57

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