2015-04-28 8 views
8

Ich möchte den überarbeiteten und ursprünglichen Text aus einem Dokument erhalten. Ich mache es so:VBA für jede Schleife gesperrt, wenn ich Revisionen

Set wrdDoc = wrdApp.Documents.Open(fileName) 

For each sent in wrdDoc.Sentences 

    if sent.Revisions.Count >=0 then 
     after=sent.text 
     sent.Revisions.RejectAll 
     before=sent.text 
     SaveRev(before,after) 
    End if 

next 

Nun wäre das in Ordnung, außer dass fehlerhafte Sätze wie

Dies ist eine sentence.This andere.

Wird auf seltsame Weise geparst werden. Erstens wird es diese sein: „Dies ist ein Satz“, dann diese mit beiden „Dies ist ein sentence.This andere ist.“

Was passiert, wenn es Änderungen gibt? Die erste Iteration wird Revisionen des ersten Satzes rückgängig machen, dann wird die zweite Iteration diesen revidierten Teil nicht "sehen".

Die untere Zeile ist, die erste Iteration wird beide Versionen des ersten Satzes erhalten, und die zweite Iteration wird nur die ursprüngliche Version des ersten Satzes erhalten (beim Abrufen beider Versionen aus dem zweiten Satz).

Lassen Sie mich klarstellen:

Lasst uns sagen, dass ich das Original

hatte

Wir begannen mit diesem Satz sentence.And.

Und es wurde

überarbeitet

Wir sind mit dieser endete sentence.And diesen anderen Satz.

erste Iteration wird in

Ergebnis vor: Wir sind mit diesem Satz begann.

Nachher: ​​Wir haben mit diesem Satz geendet.

Aber zweite Iteration wird

haben Sie vor: Wir sind am Ende mit diesem Satz sentence.And.

Nach: Wir endete mit diesem Satz.Und dieser andere Satz.

Nun, was ich tat, war die Logik verändern, die Revision Reversion zum Verhängnis:

Set wrdDoc = wrdApp.Documents.Open(fileName) 

For each sent in wrdDoc.Sentences 

    if sent.Revisions.Count >=0 then 
     wrdDoc.Undo 
     after=sent.text 
     sent.Revisions.RejectAll 
     before=sent.text 
     SaveRev(before,after) 
    End if 

next 

ich das, weil ich mit einem unveränderten Dokument (mit Ausnahme des letzten Satz) enden.

Die Sache ist, macht dies das Makro in eine Endlosschleife bei einem bestimmten Satz.

Ich habe keine Ahnung von der Mechanik der für jeden, ich habe keine Ahnung, was es verursacht zu hängen.Offensichtlich verändert die Änderung der Sammlung die Schleife, aber ich verstehe nicht warum.

Ich könnte für i = 0 auf wrdDoc.Sentences.Count loopen, aber ich denke, das wird mich Sätze aus den gleichen Gründen überspringen lassen Ich wiederhole jetzt, und ich kann es nicht riskieren (auch wenn ich OK teste, Ich muss sicher sein, dass es nie passieren wird).

Die Frage ist also (sind):

  1. Kann jemand mir helfen, herauszufinden, warum es auf einem Satz ist blockiert,
  2. Gibt es einen besseren Weg, dies zu tun?
  3. Wie kann ich es lösen, während Sie sicherstellen, Sätze nicht zu überspringen.

Vielen Dank!

PS: Ich kann Beispieldokumente zur Verfügung stellen, lassen Sie mich wissen, wenn es benötigt wird (vielleicht ist das, was ich falsch mache, bereits jemandem klar, und ich würde die Proben machen müssen, da ich die Dokumente nicht teilen kann arbeiten an).

--EDIT--

Ok, so ist dies, wo es hängt, nur auf der 32. Datei.

Es hängt nicht an einem Satz, es tut tatsächlich ein paar am Anfang des Dokuments, dann geht es zurück zum Anfang.

Ich zuvor den gleichen Fehler, aber es geloopt in einem einzigen Satz, und ging nicht an den Anfang zurück. Ich denke, es ist das gleiche Problem. Ich werde versuchen, hier Original und überarbeitete Versionen zu reproduzieren.

Originalversion

MAIN TITLE 

Measurement of some variable 

1 REQUIRED TOOLS 

1.1 Special tools 

NOTe: 

Some note about the procedure (unaltered by revision) 

Equipment name (carrier returned line) 
(english) assemply with Equipment PN 
Kit 

Equipment name (carrier returned line) 
(english) assemply with (Another) Equipment PN 
Kit 

Document continues... 

Es gibt zwei Geräte Einträge, bevor sie die Schleife neu gestartet.

Revision bestand aus dem Einfügen der Dokumentennummer, einigen ersten Buchstaben der Word Caps und Ändern der Reihenfolge zwischen Equipment PN und "Kit".

Überarbeitete Version

ducument number 
MAIN TITLE 

Measurement of Some Variable 

1 REQUIRED TOOLS 

1.1 Special Tools 

NOTe: 

Some note about the procedure (unaltered by revision) 

Equipment name (carrier returned line) 
(english) assemply with kit 
Equipment PN 


Equipment name (carrier returned line) 
(english) assemply with kit 
(Another) Equipment PN 


Document continues... 

Aufgenommen Original/Revison Paare waren:

Original-......................... ......... Überarbeitet

{Leer} ................................. ..Dokumentennummer

Messung einiger Variablen .............. Messung einiger Variablen

Spezialwerkzeuge ............................ Spezialwerkzeuge

(englisch) assemply with ....... ........... (Englisch) Montage mit Kit

(deutsch) Montage mit .................. (englisch) Montage mit Bausatz

Dann fängt es wieder an, die gleichen Einträge aufzunehmen, bis ich breche. Ich sehe nicht die Sätze, über die ich sprach, aber es gab einen Zeilenumbruch in die Revision.

Danke!

+0

Hängt es immer am selben Satz? Wenn ja, welcher Satz ist das? – nhee

+0

Ich muss meine Arbeitsstation erreichen, da die Dateien den Client nicht verlassen. Ich werde andere Dateien versuchen, um zu sehen, ob ich es reproduzieren kann. – RSinohara

+0

"Ich mag das, weil ich mit einem unveränderten Dokument (außer für den letzten Satz).": FYI, um es den letzten Satz rückgängig zu machen einfach 'wrdDoc.Undo' verschieben, um unter' before = sent.text' zu sein –

Antwort

1

Enumerierbare Objekte sollten während der Enumeration nicht verändert werden oder es können schlimme Dinge passieren (was vom Typ der Sammlung abhängt).

Meine Vermutung ist, dass der Revision/Undo-Prozess, kombiniert mit dem Wonky-Satz, bewirkt, dass sich die aufzählbaren Sentences ändern.

Sie sollten zuerst Ihre eigene Sammlung vorbereiten, um zu sehen, ob das einen Unterschied macht. Versuchen Sie einfach Set sents = New Collection: For Each sent in wrdDoc.Sentences: sents.Add sent: Next und verwenden Sie dann sent für Ihre Hauptschleife For Each.