2016-02-06 3 views
1

В настоящее время этот код работает без сообщений об ошибках, но не делает запрашиваемую замену:УВЫ «.find» перестал работать

Private Sub TestingButton_Click() 

    Dim RngFound As Range 
    Dim FileToProcess As Word.Document 
    Dim WordInstance As Object 

    Set WordInstance = CreateObject("Word.Application") 'For these tests I close Word first. 
    Set FileToProcess = WordInstance.Documents.Open("c:\sarah\junk\Attach.doc") 
    WordInstance.ActiveDocument.Range.Select 'Gets the whole document 
    Toolbox.SetupFind (WordInstance.ActiveDocument.Range) 
    With WordInstance.ActiveDocument.Range.Find 
     .Text = "rock" 
     .Replacement.Text = "found it!" 
     .Execute 
    End With 

End Sub 

В модуле Toolbox:

Public Function SetupFind(ByRef RngPassed As Word.Range) 

    With RngPassed.Find 
     .ClearFormatting 
     .Replacement.ClearFormatting 
     .Text = "" 
     .Replacement.Text = "" 
     .Forward = True 
     .Wrap = wdFindContinue 
     .Format = False 
     .MatchCase = False 
     .MatchWholeWord = False 
     .MatchWildcards = False 
     .MatchSoundsLike = False 
     .MatchAllWordForms = False 
     .Execute 
    End With 

End Function 

Код выше из тестовой базы данных, которую я создал для устранения неполадок. Мой пункт назначения - это форма доступа, целью которой является извлечение некоторой информации из набора документов и размещение информации в базе данных. Он работал нормально. Он прекратил работать после особенно впечатляющего краха. Я попытался удалить ярлык, пока форма находилась в режиме разрыва. (Я знаю, ... глубокое сожаление) Я не мог закрыть Access даже с помощью ctrl-break. Вероятно, самой жуткой частью является то, что аналогичный код теперь больше не работает в резервных копиях базы данных.

Вот вещи, которые я пробовал, не работали:

Реимпорта все объекты в новую database.Similarly, перестраивать базу данных бэкэнда. Разбейте код формы (пару тысяч строк) в модули. Скопируйте весь код в Блокнот, сохраните его, затем создайте кнопку в новой пустой базе данных. Повторно создайте вспомогательные функции &, используя команду , затем, как только они существуют, вставьте код с Wordpad. Сбросьте ссылки на форму, которые включают MSWord. Сделайте новую форму в новой базе данных с помощью одной кнопки, которая имеет только отображаемый код . Используйте определенный диапазон: все это началось, когда я получил постоянную ошибку в RngToSearch.find.execute findtext: = "reason". Ошибка подчеркнута .find и указана «Аргумент не факультативен». Так что среди других вещей я переключился на выбор, а не на определенный диапазон в моих попытках изолировать проблему. Но работа с диапазоном довольно , чем выбор, где мне действительно нужно снова закончить.

Возможно соответствующие наблюдения:

Другие формы в той же базе данных с большим количеством бэкенд кода работают нормально. Так же делают другие процедуры в одной и той же форме. Открыт только один документ. Насколько я могу судить, в документе нет ничего необычного. Я попробовал несколько документов. Текст, который нужно найти, содержится в документе за пределами таблицы.

Вещи, которые сработали, поскольку они могут быть улики: В Word прямо вверх, без кода, ничего нечего, используйте «найти», чтобы выбрать целевое слово. WordInstance.ActiveDocument.Range.Text = Replace (WordInstance.ActiveDocument.Range.Text, "rock", "Found it!"). Проблема в том, что мне в конечном итоге нужно сделать снова, это сложнее, чем может заменить Replace.

+0

Это работает! THANK вы – InColorado

+0

... и оказывается, основная проблема заключалась в том, что при воссоздании баз данных в течение недель я был неаккуратным с приоритетом ссылок. Поскольку Excel предшествует Word в алфавитном порядке и оба указаны в коде формы, мой диапазон пытался быть excel.range и поэтому не был заполнен. Указав его таким образом: dim RngFound как word.range. – InColorado

ответ

1

Укажите область замены (замены). Код работал для меня с Access 2010 с этим изменением в TestingButton_Click() ...

'.Execute 
.Execute Replace:=wdReplaceAll 

Toolbox.SetupFind также вызывает .Execute. Так как текст поиска и замены - это пустые строки в этой точке и не задано ни одной области, .Execute не наносит вреда ... но это тоже не кажется полезным.

+1

^^ Босс. - Кроме того: строка 'WordInstance.ActiveDocument.Range.Select' не нужна, потому что вы не работаете с' Selection', а на диапазоне. @InColorado – Andre

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