Раздражающая проблема с предложением "with" в VBA - PullRequest
3 голосов
/ 22 ноября 2010

Я использую эту функцию, чтобы заменить некоторые строки из доступа в текстовом документе.Эта функция работает очень хорошо

Sub reemplazar(doc As Word.Document, after As String, before As String, replaceall As Boolean)
    With doc.Content.Find
        .Text = after 
        .Replacement.Text = before 
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = True
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
        If replaceall Then
            .Execute replace:=wdReplaceAll
        Else
            .Execute replace:=wdReplaceOne
    End If
    End With
End Sub

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

Sub reemplazar(doc As Word.Document, after As String, before As String, replaceall As Boolean)
    doc.Content.Find.Text = after 
    doc.Content.Find.Replacement.Text = before 
    With doc.Content.Find
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = True
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
        If replaceall Then
            .Execute replace:=wdReplaceAll
        Else
            .Execute replace:=wdReplaceOne
        End If
    End With
End Sub

Может кто-нибудь объяснить, в чем разница между этими двумя фрагментами или почему второй не работает должным образом?Спасибо!

Ответы [ 2 ]

7 голосов
/ 23 ноября 2010

Свойство Find возвращает объект Find каждый раз, когда вы вызываете его. Итак, во втором фрагменте кода вы

  1. Создание объекта Find и настройка его свойства Text
  2. Создание нового объекта Find и настройка его свойства Replacement.Text
  3. Создание третьего объекта Find, установка множества других свойств и выполнение

У последнего выполненного объекта Find не установлены свойства Text или Replacement.Text. Если вы хотите использовать его таким образом, вы можете создать переменную объекта, такую ​​как

Sub reemplazar(doc As Word.Document, after As String, before As String, replaceall As Boolean)

    Dim fnd As Find

    Set fnd = doc.Content.Find

    fnd.Text = after
    fnd.Replacement.Text = before
    With fnd
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = True
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
        If replaceall Then
            .Execute Replace:=wdReplaceAll
        Else
            .Execute Replace:=wdReplaceOne
        End If
    End With
End Sub
1 голос
/ 22 ноября 2010

Является ли это действительно верным фрагментом кода?Эти два должны работать одинаково.Вы уверены, что больше ничего не происходит, как нечетные окончания строк?

(я заметил, что в первом примере ваш End If не имеет правильного отступа, но я сомневаюсь, что это как-то связано с этим)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...