title: Powershell Replace values in a word doc but not in one chapter
body: <p>I have a script which gets two files :</p>
  
  <ul>
  <li>one .doc with a big text (around 175 pages)</li>
  <li>one .xls with some values in it.</li>
  </ul>
  
  <p>The doc file has some "variable" which I must replace.
  One sample could be :</p>
  
  <pre><code>Lorem [IPSUM] ec nor ... 
  </code></pre>
  
  <p>The xls file has the same var with values on the next column :</p>
  
  <pre><code>  Var  | val1 | val2 | val3
  ---------------------------- 
  [IPSUM]| toto | tata | titi
  [NIL]  | poue | lama | omg
   ...
  </code></pre>
  
  <p>The script is about to replace all the values from the column Var in the .doc by other values in an other column.</p>
  
  <p>This is what the following script does.</p>
  
  <p>I have to change this by excluding one chapter (the 4) which contain a table with the list of all the values of the var column of the .xls file.</p>
  
  <pre><code>Chapter 4 :
    Var  | conf file | comment
  ---------------------------- 
  [IPSUM]| toto.txt  | useless
  [NIL]  | titi.conf | very usefull
  ...
  </code></pre>
  
  <p>I have tried to read the text word by word, but it is too slow.
  I have tried paragraph by paragraph but it won't work.</p>
  
  <p>If you have any idea It will be great !</p>
  
  <p>My script is the folowing :
  (and yes I am french sorry)</p>
  
  <pre><code># Définition du contexte culturel
  ##########################################################################################################
  [System.Threading.Thread]::CurrentThread.CurrentCulture = [System.Globalization.CultureInfo] "en-US"
  [void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
  [void][Reflection.Assembly]::LoadWithPartialName("System.Drawings")
  [void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms.DataVisualization")
  ##########################################################################################################
  
  # vérifications des prérequis :
  if ($PSVersionTable.PSVersion.Major -lt 4)
  {
      echo "Votre version de Powershell est inadaptée, merci d'installer la KB2819745"
      break
  }
  
  
  # Fonctions
  ##########################################################################################################
  # fonction pour Remplacer des valeurs dans un fichier word
  # Arguments :
  # - $Excel : un onglet Excel contenant avec des titres de colones
  # - $Word : un document word avec des fichiers
  # - $IVar : numéro de la colonne avec les variables à Remplacer dans le word
  # - $IVal : numéro de la colonne avec les valeurs qui remplacent les précédentes
  # - $Nom : inutilisé : future nom du document Word
  function Remplacer($Excel, $Word , $IVar , $Ival, $Nom)
  {
      # initialisation du numéro de ligne (1 = ligne avec les entêtes)
      $ligne = 2
      do {
          # Réccupération des variables et valeur
          $Val = $Excel.Cells.Item($ligne,$IVal).Value() 
          $Var = $Excel.Cells.Item($ligne,$IVar).Value()    
  
          # Déclaration pour la fonction de remplacement
          $FindReplace=$Word.ActiveWindow.Selection.Find
          # Remplacement des variables dans le fichier word
          $matchCase = $false;
          $matchWholeWord = $true;
          $matchWildCards = $false;
          $matchSoundsLike = $false;
          $matchAllWordForms = $false;
          $forward = $true;
          $format = $false;
          $matchKashida = $false;
          $matchDiacritics = $false;
          $matchAlefHamza = $false;
          $matchControl = $false;
          $read_only = $false;
          $visible = $true;
          $replace = 2;
          $wrap = 1;
  
          # Remplacement (si pas de varaibles trouvées dans word, alors)
          if ($FindReplace.Execute($Var, $matchCase, $matchWholeWord, $matchWildCards, $matchSoundsLike, $matchAllWordForms, $forward, $wrap, $format, $Val, $replace, $matchKashida ,$matchDiacritics, $matchAlefHamza, $matchControl) -eq $False)
          {
              # Ecriture dans un fichier des variables non trouvées
               $Var + " non trouvée" &gt;&gt; $Global:chemin"\rejets.txt"
          }
          #affichage du nombre de variables traitées
          $texte = $ligne -2
  
          $label_av.Text = $texte.ToString() + " variables traitées"
          $form.Controls.Add($label_av)
  
          # Réccupération de la ligne suivante
          $ligne++
          $Val2 = $Excel.Cells.Item($ligne,$IVar).value()
  
  
      }
      while ($Val2 -ne $null)
  
      $label_av.Text = "Traitement terminé"
      $form.Controls.Add($label_av)
  
      $nbvar = $ligne - 3
      # Sortie du nombre de variables traitées
      #Write-Host $nbvar "variables traitées"
  
      # Sauvegarde du fichier Word
  
      $nom = $Global:CheminW.replace(".doc","_"+$nom +".doc")    
      $Word.SaveAs([REF]$nom)
  }
  
  # Fonction de recherche des titres des colonnes
  # Argument : $Excel un fichier Excel
  function ColTitres ($Excel)
  {
      # Initialisation du tableau de retour
      $titres = @()
      $col=0
      do {
          #réccupération de la ligne suivante
          $col++
  
          $valeur = $Excel.Cells.Item(1,$Col).value()
          if ($valeur -ne $null) {$titres+=$valeur}
      }
      while ($valeur -ne $null)
      # Retour du tableau
      return $titres
  }
  
  # fonction d'ouverture de fichier
  # Argument : $chemin un chemin vers un fichier doc ou Excel
  function Ouvrir( $chemin )
  {
      # Si le chemin contient doc
      if ($chemin -match "doc")
      {
          $global:Word = New-Object -Com Word.Application
          $global:Word.Visible = $false
          $OpenDoc = $global:Word.documents.Open($Chemin)
      }
      # Si le chemin contient xls
      if ($chemin -match "xls")
      {
          $Excel = New-Object -ComObject "Excel.Application"
          $Excel.Visible = $false
          $OpenDoc = $Excel.WorkBooks.Open($Chemin) 
      }
      # Retour du document
      return $OpenDoc
  }
  
  #fontion de fermeture d'objets offce
  function Fermer( $variable )
  {
      $variable.save()
      $variable.close()
  }
  
  
  #Interface Graphique
  #################################################
  # AJOUT DE LA FORME PRINCIPALE
  #################################################
  $form = New-Object Windows.Forms.Form
  # Pour bloquer le resize du form et supprimer les icones Minimize and Maximize
  $form.FormBorderStyle = [System.Windows.Forms.FormBorderStyle]::FixedDialog
  $form.MaximizeBox = $False
  $form.MinimizeBox = $False
  $form.Text = "DIOZator V1.0.1"                                                     # Choix du titre
  $form.Size = New-Object System.Drawing.Size(400,370)                           # Choix de la taille
  
  #######################################################################
  # Bouton OK
  $button_ok = New-Object System.Windows.Forms.Button
  $button_ok.Text = "OK"
  $button_ok.Size = New-Object System.Drawing.Size(355,40)
  $button_ok.Location = New-Object System.Drawing.Size(20,245)
  
  # Bouton Quitter
  $button_quit = New-Object System.Windows.Forms.Button
  $button_quit.Text = "Fermer"
  $button_quit.Size = New-Object System.Drawing.Size(355,40)
  $button_quit.Location = New-Object System.Drawing.Size(20,290)
  
  ####################################################################
  #Pour la selection du fichier Excel
  # Label word
  $label_Word = New-Object System.Windows.Forms.Label
  $label_Word.AutoSize = $true
  $label_Word.Size = New-Object System.Drawing.Size(50,20)
  $label_Word.Location = New-Object System.Drawing.Point(10,10)
  $label_Word.Text = "Dio : "
  # Champs texte
  $TextBoxW = New-Object System.Windows.Forms.TextBox
  $TextBoxW.Text = $Global:CheminW
  $TextBoxW.Size = New-Object System.Drawing.Size(280,20)
  $TextBoxW.Location = New-Object System.Drawing.Size(20,30)
  # Bouton Excel
  $button_Word = New-Object System.Windows.Forms.Button
  $button_Word.Text = "..."
  $button_Word.Size = New-Object System.Drawing.Size(30,20)
  $button_Word.Location = New-Object System.Drawing.Size(300,30)
  
  
  # Label Excel
  $label_Excel = New-Object System.Windows.Forms.Label
  $label_Excel.AutoSize = $True
  $label_Excel.Size = New-Object System.Drawing.Size(50,20)
  $label_Excel.Location = New-Object System.Drawing.Point(10,60)
  $label_Excel.Text = "Dictionaire : "
  # Champs texte
  $TextBoxE = New-Object System.Windows.Forms.TextBox
  $TextBoxE.Text = $Global:CheminE
  $TextBoxE.Size = New-Object System.Drawing.Size(280,20)
  $TextBoxE.Location = New-Object System.Drawing.Size(20,80)
  # Bouton Excel
  $button_Excel = New-Object System.Windows.Forms.Button
  $button_Excel.Text = "..."
  $button_Excel.Size = New-Object System.Drawing.Size(30,20)
  $button_Excel.Location = New-Object System.Drawing.Size(300,80)
  # Label variables
  $label_var = New-Object System.Windows.Forms.Label
  $label_var.AutoSize = $True
  $label_var.Size = New-Object System.Drawing.Size(50,20)
  $label_var.Location = New-Object System.Drawing.Point(20,110)
  $label_var.Text = "Variables : "
  # combobox source
  $comboVar = New-Object System.Windows.Forms.ComboBox
  $comboVar.Size = New-Object System.Drawing.Size(350, 310)
  $comboVar.Location = New-Object System.Drawing.Point(20, 130)
  # Label valeurs
  $label_val = New-Object System.Windows.Forms.Label
  $label_val.AutoSize = $true
  $label_val.Size = New-Object System.Drawing.Size(50,20)
  $label_val.Location = New-Object System.Drawing.Point(20,150)
  $label_val.Text = "Valeurs : "
  # combobox source
  $comboVal = New-Object System.Windows.Forms.ComboBox
  $comboVal.Size = New-Object System.Drawing.Size(350, 310)
  $comboVal.Location = New-Object System.Drawing.Point(20, 170)
  
  
  # Label avancement
  $label_av = New-Object System.Windows.Forms.Label
  $label_av.AutoSize = $true
  $label_av.Size = New-Object System.Drawing.Size(50,20)
  $label_av.Location = New-Object System.Drawing.Point(110,210)
  $label_av.Text = "variables traitées : "
  
  
  # Explorateur de fichiers 
  $Fichier = New-Object System.Windows.Forms.OpenFileDialog
  $Fichier.InitialDirectory = Get-Location
  $Fichier.Title = "Selectionner un fichier :"
  $Fichier.FilterIndex = 3
  #Add-Type -AssemblyName System.Windows.Forms
  #$Fichier = New-Object System.Windows.Forms.OpenFileDialog -Property @{
  #    InitialDirectory = [Environment]::GetFolderPath('Desktop')
  #}
  
  # Explorateur de dossiers 
  $Dossier = New-Object System.Windows.Forms.FolderBrowserDialog
  $Dossier.Description = "Destination du fichier variabilisé"
  $Dossier.SelectedPath = Get-Location
  
  
  
  # Bloc boutons
  $form.Controls.Add($button_ok)
  $form.Controls.Add($button_quit)
  # Bloc Excel
  $form.Controls.Add($Label_Excel)               # Texte Excel
  $form.Controls.Add($TextBoxE)                  # TextBox Excel
  $form.Controls.Add($button_Excel)              # Bouton Excel
  $form.Controls.Add($Label_Word)                # Texte Word
  $form.Controls.Add($TextBoxW)                  # TextBox Word
  $form.Controls.Add($button_Word)               # Bouton Word
  #######################################################################
  
  # Gestion event quand on clique sur le bouton Fermer
  $button_quit.Add_Click({
      $form.Close();    
  })
  
  # Gestion event quand on clique sur le bouton Excel
  $button_Excel.Add_Click({ 
      $Show = $Fichier.ShowDialog()
      If ($Show -eq "Cancel") { "Annulé par l'utilisateur"}
      Else 
          { 
              $CheminE = $Fichier.FileName 
              $TextBoxE.Text = $CheminE
  
              # ouverture du fichier excel
              $global:FExcel = ouvrir($CheminE)
              $global:Onglet = $global:FExcel.Worksheets.Item(1) 
              $global:Onglet.activate()
  
              #chargement des titres
              $titres = ColTitres($global:Onglet)
              foreach($valeur in $titres) {
                  $comboVal.Items.add($valeur)
                  $comboVar.Items.add($valeur)
              }
              #affichage des combo box
              $form.Controls.Add($Label_var)
              $form.Controls.Add($comboVar)
              $form.Controls.Add($Label_val)
              $form.Controls.Add($comboVal)
          }
  })
  
  # Gestion event quand on clique sur le bouton Word
  $button_Word.Add_Click({
      $Show = $Fichier.ShowDialog()
      If ($Show -eq "Cancel") { "Annulé par l'utilisateur"}
      Else 
          { 
              $Global:CheminW = $Fichier.FileName 
              $TextBoxW.Text = $Global:CheminW
  
              # ouverture du fichier word
              $global:FWord = ouvrir($Global:CheminW)
          }
  })
  
  # bouton Ok
  $button_ok.Add_Click({
      # réccupération des index des colonnes excel
      $Col_Var = $comboVar.SelectedIndex + 1
      $Col_Val = $comboVal.SelectedIndex + 1
      $Env = $comboVal.SelectedItem
  
      Remplacer $global:onglet $global:FWord $Col_Var $Col_Val $Env 
  
  })
  
  
  # Affichage de la Windows
  $form.ShowDialog()
  
  
  
  #
  #echo $E_Titres
  #
  
  Fermer($FWord)
  Fermer($FExcel)
  $global:Word.Quit()
  # kill des processus restants.
  while([System.Runtime.Interopservices.Marshal]::ReleaseComObject($global:Onglet)){}
  while([System.Runtime.Interopservices.Marshal]::ReleaseComObject($global:FExcel)){}
  while([System.Runtime.Interopservices.Marshal]::ReleaseComObject($global:FWord)){}
  while([System.Runtime.Interopservices.Marshal]::ReleaseComObject($global:Word)){}
  [System.GC]::Collect()
  </code></pre>