Я хочу получить как исправленный, так и исходный текст из документа. Я делаю это так:
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, но я думаю, что это заставит меня пропускать предложения по тем же причинам, по которым я повторяю одно сейчас, и я не могу рисковать (даже если я проверю нормально, я должен быть уверен, что никогда не будет).
Итак, вопрос (есть):
- Может ли кто-нибудь помочь мне понять, почему он блокирует предложение,
- Есть ли лучший способ сделать это?
- Как я могу решить это, не пропуская предложения.
Большое спасибо!
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...
Записанные пары оригинал / редакция были:
Оригинал..............................Пересмотренный
{Пустой}...................................Номер документа
Измерение некоторой переменной............... Измерение некоторой переменной.
Специальные инструменты...............Специальные инструменты
(английский) в сборе с.................(английский) в сборе с комплектом
(английский) в сборе с.................(английский) в сборе с комплектом
Потом начинается снова, записывая те же записи, пока я не сломаюсь. Я не вижу перекрывающихся предложений, о которых я говорил, но в редакции был вставлен разрыв строки.
Спасибо!
wrdDoc.Undo
подbefore=sent.text
. - person Cor_Blimey   schedule 01.05.2015Set sents = New Collection: For Each sent in wrdDoc.Sentences: sents.Add sent: Next
, а затем используйтеsents
для основного цикла For Each. - person Cor_Blimey   schedule 01.05.2015