2016-12-14 1 views
0

J'ai un code VBA qui parcourt un document pour supprimer des tables d'un document. Le code suivant fonctionne très bien en VBA:Parcourir un document Microsoft Word pour rechercher et remplacer des tables

Set wrdDoc = ThisDocument 
With wrdDoc 
    For Each tbl In wrdDoc.Tables 
     tbl.Select 
     Selection.Delete 
    Next tbl 
End With 

Malheureusement, je ne peux pas traduis facilement ce code C#, sans doute parce qu'il ya une méthode Range.Find plus récente. Voici trois choses que j'ai essayées, chacune échouant.

Première tentative (re-écriture du code VBA):

foreach (var item in doc.Tables) 
{ 
    item.Delete; //NOPE! No "Delete" function. 
} 

J'ai essayé ceci:

doc = app.Documents.Open(sourceFolderAndFile); //sourceFolderAndFile opens a standard word document. 
var rng = doc.Tables; 
foreach(var item in rng) 
{ 
    item.Delete; //NOPE! No "Delete" function. 
} 

J'ai aussi essayé ceci:

doc = app.Documents.Open(sourceFolderAndFile); //sourceFolderAndFile opens a standard word document. 
var rng = doc.Tables; 
Range.Find.Execute(... //NOPE! No Range.Find available for the table collection. 
... 

Quelqu'un pourrait-il s'il vous plaît aider je comprends comment je peux utiliser C# et Word Interop (Word 2013 et 2016) pour parcourir un document, trouver une table, puis former une fonction, comme la sélectionner, la supprimer ou la remplacer?

Merci!

Répondre

0

Il m'a fallu du temps pour comprendre cette réponse. Avec tous les exemples de code en ligne, j'ai manqué le besoin de créer une application. Pour la postérité, voici comment j'ai résolu le problème.

  1. Assurez-vous que vous avez une déclaration utilisant, comme ceci:

    utilisant MsWord = Microsoft.Office.Interop.Word;

  2. Ouvrez le document, puis utilisez la nouvelle référence MSWord, la plage et la table. Je donne un exemple de base ci-dessous:

     //open the document. 
         doc = app.Documents.Open(sourceFolderAndFile, ReadOnly: true, ConfirmConversions: false); 
    
         //iterate through the tables and delete them. 
         foreach (MsWord.Table table in doc.Tables) 
         { 
          //select the area where the table is located and delete it. 
          MsWord.Range rng = table.Range; 
          rng.SetRange(table.Range.End, table.Range.End); 
          table.Delete(); 
         } 
    
         //don't forget doc.close and app.quit to clean up memory. 
    

Vous pouvez utiliser la gamme (RNG) pour remplacer la table avec d'autres éléments, comme le texte, les images, etc.

+0

Peut-être que vous devriez utiliser un arrière pour boucle? C'est ce que vous faites normalement lorsque vous voulez supprimer des éléments d'une collection. Pourquoi utilisez-vous SetRange? – Jbjstam

+0

Pour autant que je sache, il n'est pas nécessaire de faire une boucle arrière puisque toutes les tables sont trouvées du début à la fin. En ce qui concerne le SetRange, c'est la meilleure façon (pour autant que je sache) de sélectionner la table puis de la supprimer. Si vous avez une meilleure option, je suis tout ouïe :) – Bill