2015-04-28 42 views
8

Chcę uzyskać zarówno poprawiony, jak i oryginalny tekst z dokumentu. Ja robię to w ten sposób:VBA dla każdej pętli zablokowanej po przywróceniu wersji

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 

teraz, że będzie w porządku, poza tym, że zdania zniekształconych jak

Jest to jeden sentence.This jest inny.

Zostanie sparsowany w dziwny sposób. Po pierwsze, nie będzie to jedno: „To jedno zdanie”, to jeden z dwóch „To jedna sentence.This jest kolejnym.”

Co się dzieje, gdy nie istnieją wersjami? Pierwsza iteracja spowoduje przywrócenie wersji pierwszego zdania, a druga iteracja nie "zobaczy" tej poprawionej części.

Dolna linia jest, pierwsza iteracja otrzyma obie wersje pierwszego zdania, a druga iteracja otrzyma tylko oryginalną wersję pierwszego zdania (podczas pobierania obu wersji z drugiego zdania).

Pozwól mi wyjaśnić:

Powiedzmy miałem oryginalnego

Zaczęliśmy ten sentence.And to zdanie.

I został zaktualizowany do

Skończyło się to sentence.And to inne zdanie.

Pierwsza iteracja spowoduje

Przed: Zaczęliśmy to zdanie.

Po: Zakończyliśmy to zdanie.

Ale druga iteracja będzie miał

Przed: Skończyło się to sentence.And to zdanie.

Po: Zakończyliśmy to zdanie. I to inne zdanie.

No, co zrobiłem było zmieniać logikę, odkręcając rewersji Weryfikacja:

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 

Lubię to, bo ja skończyć z niezmienionym dokumentu (z wyjątkiem ostatniego zdania).

Chodzi o to, że robi to umieszcza makro w nieskończonej pętli przy jednym określonym zdaniu.

Nie mam pojęcia o mechanice każdego z nich, nie mam pojęcia, co powoduje zawieszenie.Oczywiście zmiana kolekcji jest kłopotliwa, ale nie rozumiem dlaczego.

Mogę pętli dla i = 0 do wrdDoc.Sentences.Count, ale myślę, że to pozwoli mi pominąć zdania z tych samych powodów, które powtarzam teraz, i nie mogę ryzykować (nawet jeśli testuję OK, Muszę być pewien, że to się nigdy nie wydarzy).

Więc pytanie jest (są):

  1. Może ktoś mi pomóc dowiedzieć się, dlaczego jest blokowanie na zdaniu
  2. Czy istnieje lepszy sposób to zrobić?
  3. Jak rozwiązać problem, nie pomijając zdań.

Dziękuję bardzo!

PS: Mogę dostarczyć przykładowe dokumenty, daj mi znać, jeśli jest to potrzebne (może to, co robię źle, jest już jasne dla kogoś, i musiałbym zrobić próbki, ponieważ nie mogę udostępnić dokumentów pracować nad).

--EDIT--

Ok tak to gdzie to wisi tylko na plik 32.

Nie zawiesza się na zdaniu, faktycznie robi kilka na początku dokumentu, a następnie wraca na początek.

Poprzednio napotkałem ten sam błąd, ale zapętlono go w jednym zdaniu i nie wróciłem do początku. Myślę, że to ten sam problem. Spróbuję odtworzyć tutaj wersje oryginalne i poprawione.

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

Istnieją 2 wpisy sprzęt przed ponownym uruchomieniu pętli.

Rewizja polegała na wstawieniu numeru dokumentu, kilku pierwszych liter w słowie i zmianie kolejności między Urządzeniem PN a "Zestawem".

wersja poprawiona

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

Nagrane pary oryginalny/revison były:

Original ......................... ......... Zmienione

{Puste} ................................. .. Numer dokumentu

Pomiar pewnej zmiennej .............. Pomiar pewnej zmiennej

Narzędzia specjalne ............................ Narzędzia specjalne

(angielski) zestaw z ....... ........... (angielski) zestaw z zestawem

(angielski) zestaw z .................. (angielski) zestaw z zestawem

Następnie zaczyna się ponownie, rejestrując te same wpisy, aż do momentu ich pęknięcia. Nie widzę nakładających się zdań, o których mówiłem, ale w wersji wprowadzono wstawienie linii.

Dzięki!

+0

Czy zawsze trzyma się tego samego zdania? Jeśli tak, jakie to zdanie? – nhee

+0

Muszę dotrzeć do mojej stacji roboczej, ponieważ pliki nie opuszczają klienta. Spróbuję na innych plikach, żeby sprawdzić, czy mogę je odtworzyć. – RSinohara

+0

"Podoba mi się to, ponieważ kończę niezmienionym dokumentem (z wyjątkiem ostatniego zdania).": FYI, aby cofnąć ostatnie zdanie, po prostu przenieś 'wrdDoc.Undo' na poniżej' before = sent.text' –

Odpowiedz

1

Nie można zmieniać obiektów podlegających wymianie podczas wyliczania lub może się zdarzyć, że coś złego się nie uda (zależy to od rodzaju kolekcji).

Domyślam się, że proces zmiany/cofnięcia, w połączeniu z wyimaginowanym zdaniem, powoduje przekształcanie zdań w zmienne.

Najpierw należy przygotować własną kolekcję, aby sprawdzić, czy to ma znaczenie. Po prostu spróbuj Set sents = New Collection: For Each sent in wrdDoc.Sentences: sents.Add sent: Next, a następnie użyj wysyłanych wiadomości do głównej pętli For Each.