2015-04-28 22 views
8

Desidero ottenere sia il testo revisionato che quello originale da un documento. Lo faccio in questo modo:VBA per ogni ciclo bloccato quando si annullano le revisioni

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 

Ora che sarebbe bene, tranne che le frasi malformati come

Questo è uno frase.Questa è un altro.

Viene analizzato in modo strano. In primo luogo, ci sarà questa: "Questa è una frase", allora questo con entrambe le "questo è uno frase.Questa è un altro."

quello che succede quando ci sono revisioni là? La prima iterazione annullerà le revisioni sulla prima frase, quindi la seconda iterazione non "vedrà" quella parte rivista.

In conclusione, la prima iterazione otterrà entrambe le versioni della prima frase e la seconda iterazione otterrà solo la versione originale della prima frase (ottenendo entrambe le versioni dalla seconda frase).

Vorrei chiarire:

Diciamo che ho avuto l'originale

Abbiamo iniziato con questo sentence.And questa frase.

Ed è stato rivisto per

Abbiamo finito con questo sentence.And quest'altra frase.

prima iterazione si tradurrà in

Prima: Abbiamo iniziato con questa frase.

Dopo: Siamo finiti con questa frase.

Ma nella seconda iterazione avrà

Prima: Abbiamo finito con questo sentence.And questa frase.

Dopo: Siamo finiti con questa frase. E questa altra frase.

Beh, quello che ho fatto è stato cambiare la logica, annullando l'inversione di revisione:

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 

Mi piace questo perché io alla fine con un documento inalterato (tranne che per l'ultima frase).

La cosa è, facendo questo mette la macro in un ciclo infinito in una frase specifica.

Non ho idea della meccanica di ciascuno, non ho idea di cosa lo stia causando.Ovviamente l'alterazione della raccolta sta incasinando il ciclo, ma non capisco perché.

Potrei fare un ciclo per i = 0 a wrdDoc.Sentences.Count, ma penso che mi faranno saltare le frasi per gli stessi motivi per cui ne sto ripetendo uno ora, e non posso rischiare (anche se eseguo il test OK, Devo essere sicuro che non accadrà mai).

Quindi la domanda è (sono):

  1. Può uno aiutarmi a capire il motivo per cui è di chiusura su una frase,
  2. C'è un modo migliore di fare questo?
  3. Come posso risolverlo assicurandoti di non saltare le frasi.

Grazie mille!

PS: Posso fornire documenti di esempio, fammi sapere se è necessario (forse quello che sto facendo di sbagliato è già chiaro a qualcuno, e dovrei fare i campioni in quanto non posso condividere i documenti che sono lavorando su).

--EDIT--

Ok, quindi questo è dove è appeso, solo sul file di 32 °.

Non si blocca su una frase, ne esegue effettivamente alcune all'inizio del documento, quindi torna all'inizio.

Ho già riscontrato lo stesso errore, ma è stato ripetuto in una singola frase e non è tornato all'inizio. Penso che sia lo stesso problema. Proverò a riprodurre qui versioni originali e riviste.

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

Ci sono 2 voci attrezzature prima di riavviare il ciclo.

La revisione consisteva nell'inserimento del numero del documento, dei cappucci della prima lettera della parola e nella modifica dell'ordine tra apparecchiatura PN e "kit".

versione riveduta

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

registrati coppie originale/Revison erano:

originale ......................... ......... Revisionato

{vuoto} ................................. ..Documento numero

Misurazione di alcune variabili .............. Misura di alcune variabili

Attrezzi speciali ............................ Attrezzi speciali

(inglese) riassumere con ....... ........... (inglese) Assemply con il kit

(inglese) Assemply con .................. (inglese) Assemply con kit

Quindi ricomincia, registrando le stesse voci finché non si interrompe. Non vedo le frasi sovrapposte di cui ho parlato, ma c'era una inserzione dell'interruzione di riga sulla revisione.

Grazie!

+0

Appende sempre sulla stessa frase? Se sì, che frase è? – nhee

+0

Devo raggiungere la mia workstation poiché i file non escono dal client. Proverò su altri file per vedere se riesco a riprodurlo. – RSinohara

+0

"Mi piace perché finisco con un documento inalterato (eccetto per l'ultima frase).": FYI per farlo annullare l'ultima frase sposta semplicemente 'wrdDoc.Undo' per essere sotto' before = sent.text' –

risposta

1

Gli oggetti enumerabili non devono essere modificati durante l'enumerazione o possono accadere cose brutte (ciò dipende dal tipo di raccolta).

La mia ipotesi è che il processo di revisione/annullamento, combinato con la frase vistosa, stia causando la variazione delle frasi Enumerable.

Dovresti preparare prima la tua collezione, per vedere se questo fa la differenza. Prova semplicemente a Set sents = New Collection: For Each sent in wrdDoc.Sentences: sents.Add sent: Next quindi usa i sents per il tuo ciclo For Each principale.