2016-06-01 3 views
0

В моем коде я разбиваю документ Word на многие, используя Range.Find, чтобы выбрать текст текста (startoftext * endoftext), а затем сохранить его. В этом выделенном тексте я пытаюсь использовать вложенный вызов Range.Find для поиска выделенного фрагмента текста для выделенного полужирного заголовка и использования его как SaveAs [FileName].VBA: Range.Find, вложенный в другой Range.Find

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

Sub DocSplitter() 

Dim R As Range 
Dim inR As Range 
Set R = ActiveDocument.Range.Duplicate 
Dim name As String 
Application.ScreenUpdating = False 

With R.Find 
    .Text = "^m*^l^t^l" ' <- Copies all text from ^m to "^l^t^l" 
    .MatchWildcards = True 
    While .Execute 
     Set inR = R.Duplicate '<- Setting Range equal to selected text range 
     With inR.Find 
      .Format = True 
      .Font.Bold = True 
      .Text = "^13([0-9]).([0-9])*^13^13" '<- Selecting header within 
      .MatchWildcards = True 
      .Execute 
     End With 
     CopyAndSave R, inR 
    Wend 
End With 
R.Collapse wdCollapseEnd 
R.End = R.Parent.Range.End 
CopyAndSave R, inR 

End Sub 




Static Sub CopyAndSave(R As Range, inR As Range) 
Dim D As Document 
Dim Count As Long 
Count = Count + 1 
R.Copy 
Set D = Documents.Add 
D.Range.PasteAndFormat wdFormatOriginalFormatting 
D.SaveAs R.Parent.Path & Application.PathSeparator & _ 
inR.Text, wdFormatFilteredHTML '<-- File Name ERROR: Too long 
D.Close 

End Sub 

поэтому inR.Text возвращает весь текст, выбранный R.Find.Execute. Любые идеи?

Редактировать: Я обновил Set inR = R.Duplicate, спасибо за этот улов. Моя проблема оказалась проблемой форматирования с заголовками.

ответ

1

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

Чтобы создать второй Range на основе другого, но не зависимо от него, вам необходимо свойство Duplicate. Таким образом:

Set inR = R.Duplicate 
0

Если вы установите Set inR = R, а затем выполните команду find на inR, R также изменится. Это не похоже на Excel. Если вы знаете язык C, это помогает считать переменную диапазона как указатель. Использование Set inR = R означает, что обе переменные указывают на одно и то же; изменяя одно, изменяет другое.

Один из способов обойти это, чтобы хранить R.Start и R.End как целые числа перед поиском, а затем, после завершения внутреннего поиска, вы можете воссоздать R из activedocument.Range (r.Start, r.End).

+0

Хорошая находка, я использовал 'Set inR = R.Duplicate', но это не исправить мою проблему. inR по-прежнему охватывает весь диапазон R после '.execute'. Я думаю, что проблема исходит от использования и сохранения '.execute' должным образом. –

Смежные вопросы