2015-04-28 1 views
8

Je souhaite obtenir à la fois le texte révisé et le texte original d'un document. Je le fais de cette façon:VBA pour chaque boucle verrouillée lorsque je rétablis les révisions

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 

Maintenant, ce serait bien, sauf que les peines malformés comme

C'est une sentence.This est une autre.

Sera analysé de façon étrange. Tout d'abord, il y aura celui-ci: «Ce est une phrase », alors celui-ci avec les deux « Ceci est un sentence.This est un autre. »

ce qui arrive quand il y a des révisions là-bas? La première itération annulera les révisions sur la première phrase, puis la seconde itération ne «verra» pas cette partie révisée.

Bottom line est, la première itération obtenir les deux versions de la première phrase, et la deuxième itération ne recevra que la version originale de la première phrase (tout en obtenant les deux versions de la deuxième phrase).

Permettez-moi de préciser:

Disons que je l'avais

Nous avons commencé original avec ce sentence.And cette phrase.

Et il a été révisé pour

Nous avons fini avec ce sentence.And cette autre phrase.

première itération entraînera

Avant: Nous avons commencé par cette phrase.

Après: Nous avons terminé avec cette phrase.

Mais deuxième itération aura

Avant: Nous avons fini avec ce sentence.And cette phrase. Après: Nous avons terminé avec cette phrase.Et cette autre phrase.

Eh bien, ce que je faisais était de modifier la logique, défaisant la réversion de révision:

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 

J'aime cela parce que je me retrouve avec un document non modifié (à l'exception de la dernière phrase). Le fait est que, ce faisant, cela met la macro dans une boucle infinie à une phrase spécifique.

Je n'ai aucune idée de la mécanique de l'pour chacun, je n'ai aucune idée de ce qui le provoque à accrocher.Manifestement, modifier la collection dérange la boucle, mais je ne comprends pas pourquoi.

Je pourrais faire une boucle pour i = 0 à wrdDoc.Sentences.Count, mais je pense que cela me fera sauter des phrases pour les mêmes raisons que je les répète maintenant, et je ne peux pas risquer (même si je vérifie OK, Je dois être sûr que cela n'arrivera jamais).

La question est (sont):

  1. Quelqu'un peut-il me aider à comprendre pourquoi il est verrouillage sur une phrase,
  2. Y at-il une meilleure façon de le faire?
  3. Comment puis-je le résoudre tout en veillant à ne pas sauter de phrases.

Merci beaucoup! PS: Je peux fournir des exemples de documents, laissez-moi savoir si c'est nécessaire (peut-être que ce que je fais mal est déjà clair pour quelqu'un, et je devrais faire les échantillons car je ne peux pas partager les documents que je suis travaille sur).

--EDIT--

Ok, donc c'est là où il est suspendu, que sur le fichier 32e.

Il ne se bloque pas sur une phrase, il en fait quelques-uns au début du document, puis revient au début.

J'ai déjà rencontré la même erreur, mais il a bouclé en une seule phrase, et n'est pas retourné au début. Je pense que c'est le même problème. Je vais essayer de reproduire les versions originales et révisées ici.

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... 

Il y a 2 entrées de l'équipement avant de redémarrer la boucle. La révision consistait à insérer le numéro du document, certaines majuscules de la première lettre du mot et à modifier l'ordre entre le PN de l'équipement et le «kit».

Version révisée

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... 

enregistrés paires d'origine/de Revison étaient:

originale ......................... ......... Révisé

{Vide} ................................. numéro ..Document

mesure d'une variable .............. La mesure de certaines variables

Outils spéciaux ............................ Outils spéciaux

(anglais) assemby avec ....... ........... (anglais) assemby avec kit

(anglais) assemby avec .................. (anglais) assemby avec kit

Puis il recommence, en enregistrant les mêmes entrées jusqu'à ce que je casse. Je ne vois pas les phrases qui se chevauchent dont j'ai parlé, mais il y avait une insertion de saut de ligne sur la révision.

Merci!

+0

Est-ce que ça reste toujours dans la même phrase? Si oui, quelle phrase est-ce? – nhee

+0

Je dois atteindre mon poste de travail car les fichiers ne quittent pas le client. Je vais essayer d'autres fichiers pour voir si je peux le reproduire. – RSinohara

+0

"J'aime ça parce que je me retrouve avec un document non modifié (sauf pour la dernière phrase).": FYI pour faire défaire la dernière phrase il suffit de déplacer 'wrdDoc.Undo' pour être en dessous de' before = send.text' –

Répondre

1

Les objets énumérables ne doivent pas être modifiés pendant l'énumération ou de mauvaises choses peuvent se produire (ce qui dépend du type de collection). Je suppose que le processus de révision/annulation, combiné avec la phrase bancale, provoque le changement des Sentences énumérables.

Vous devriez d'abord préparer votre propre collection, pour voir si cela fait la différence. Il suffit d'essayer Set sents = New Collection: For Each sent in wrdDoc.Sentences: sents.Add sent: Next, puis utiliser des sents pour votre boucle principale For Each.