VBA для каждого цикла заблокирован, когда я возвращаю версии

Я хочу получить как исправленный, так и исходный текст из документа. Я делаю это так:

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

Все бы ничего, если бы не искаженные предложения вроде

Это одно предложение. Это другое.

Будет разобран странным образом. Сначала будет это: Это одно предложение., затем это с обоими Это одно предложение. Это другое.

Что происходит, когда там есть ревизии? Первая итерация вернет исправления в первое предложение, тогда вторая итерация не «увидит» эту исправленную часть.

Суть в том, что первая итерация получит обе версии первого предложения, а вторая итерация получит только исходную версию первого предложения (получив обе версии из второго предложения).

Позвольте мне уточнить:

Допустим, у меня был оригинал

Мы начали с этого предложения. И этого предложения.

И он был пересмотрен на

Мы закончили этим предложением. И этим другим предложением.

Первая итерация приведет к

До: Мы начали с этого предложения.

После: Мы закончили этим предложением.

Но вторая итерация будет иметь

До: Мы закончили этим предложением. И этим предложением.

После: Мы закончили этим предложением. И этим другим предложением.

Ну, что я сделал, так это изменил логику, отменив реверсию версии:

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

Мне это нравится, потому что в итоге я получаю неизмененный документ (за исключением последнего предложения).

Дело в том, что это помещает макрос в бесконечный цикл в одном конкретном предложении.

Я понятия не имею о механике for each, я понятия не имею, что заставляет его зависать. Очевидно, что изменение коллекции портит цикл, но я не понимаю, почему.

Я мог бы зациклить i=0 до wrdDoc.Sentences.Count, но я думаю, что это заставит меня пропускать предложения по тем же причинам, по которым я повторяю одно сейчас, и я не могу рисковать (даже если я проверю нормально, я должен быть уверен, что никогда не будет).

Итак, вопрос (есть):

  1. Может ли кто-нибудь помочь мне понять, почему он блокирует предложение,
  2. Есть ли лучший способ сделать это?
  3. Как я могу решить это, не пропуская предложения.

Большое спасибо!

PS: Образцы документов могу предоставить, дайте знать, если нужно (может быть, что я делаю не так, уже кому-то понятно, и мне придется сделать образцы, так как я не могу поделиться документами, над которыми работаю).

--РЕДАКТИРОВАТЬ--

Ок так вот где висит, только на 32-м файле.

Он не висит на предложении, он фактически делает несколько в начале документа, а затем возвращается к началу.

Ранее я сталкивался с той же ошибкой, но она зацикливалась на одном предложении и не возвращалась к началу. Я думаю, что это та же проблема. Я постараюсь воспроизвести здесь оригинальные и переработанные версии.

Оригинальная версия

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

Есть 2 записи оборудования, прежде чем он перезапустит цикл.

Ревизия заключалась во вставке номера документа, нескольких заглавных букв в словах и изменении порядка между номером детали оборудования и комплектом.

Пересмотренный вариант

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

Записанные пары оригинал / редакция были:

Оригинал..............................Пересмотренный

{Пустой}...................................Номер документа

Измерение некоторой переменной............... Измерение некоторой переменной.

Специальные инструменты...............Специальные инструменты

(английский) в сборе с.................(английский) в сборе с комплектом

(английский) в сборе с.................(английский) в сборе с комплектом

Потом начинается снова, записывая те же записи, пока я не сломаюсь. Я не вижу перекрывающихся предложений, о которых я говорил, но в редакции был вставлен разрыв строки.

Спасибо!


person RSinohara    schedule 28.04.2015    source источник
comment
Он всегда висит на одном и том же предложении? Если да, то что это за фраза?   -  person nicolaus-hee    schedule 28.04.2015
comment
Мне нужно добраться до своей рабочей станции, так как файлы не покидают клиент. Я попробую другие файлы, чтобы увидеть, смогу ли я воспроизвести это.   -  person RSinohara    schedule 28.04.2015
comment
Мне это нравится, потому что я получаю неизмененный документ (за исключением последнего предложения). К вашему сведению, чтобы отменить последнее предложение, просто переместите wrdDoc.Undo под before=sent.text.   -  person Cor_Blimey    schedule 01.05.2015
comment
Перечисляемые объекты не должны изменяться во время перечисления, иначе могут произойти плохие вещи. Я предполагаю, что процесс пересмотра/отмены в сочетании с шатким предложением вызывает изменение перечисляемых предложений. Сначала вы должны подготовить свою собственную коллекцию, чтобы увидеть, имеет ли это значение. Просто попробуйте Set sents = New Collection: For Each sent in wrdDoc.Sentences: sents.Add sent: Next, а затем используйте sents для основного цикла For Each.   -  person Cor_Blimey    schedule 01.05.2015
comment
@Cor_Blimey Ваш ответ решил мою проблему. Если вы хотите опубликовать это, я приму это.   -  person RSinohara    schedule 06.05.2015
comment
@RSinohara спасибо, рад, что с этим разобрались. Такие вещи трудно зафиксировать.   -  person Cor_Blimey    schedule 17.05.2015


Ответы (1)


Перечисляемые объекты не должны изменяться во время перечисления, иначе могут произойти плохие вещи (что зависит от типа коллекции).

Я предполагаю, что процесс пересмотра/отмены в сочетании с шатким предложением вызывает изменение перечисляемых предложений.

Сначала вы должны подготовить свою собственную коллекцию, чтобы увидеть, имеет ли это значение. Просто попробуйте Set sents = New Collection: For Each sent in wrdDoc.Sentences: sents.Add sent: Next, а затем используйте sends для основного цикла For Each.

person Cor_Blimey    schedule 17.05.2015