2016-04-28 3 views
0

Мой макрос должен сделать следующее:Слово VBA макрос работает только в режиме отладки

  1. Посмотрите на случаи двойных пространств.
  2. Замените эти экземпляры двойных пространств на отдельные пробелы.
  3. Снова просмотрите документ, чтобы увидеть, есть ли более двойные пробелы и заменить их, если они есть. Например, если бы где-то было изначально 4 пробела, все равно будут двойные пробелы, поэтому замените оставшиеся пробелы пробелами.
  4. Повторите предыдущий шаг, пока не будет больше двойных пробелов.

Проблема заключается в том, что макрос прекрасно работает в режиме отладки, но работает только один проход при нормальной работе. Что я делаю не так? Обратите внимание, что мой код может быть не самым компактным, но это не проблема; что мне действительно интересно, почему код работает только в режиме отладки, а не в обычном режиме, и как это можно исправить.

Sub Test_for_doubles() 
' 
' Test_for_doubles Macro 
' 
Dim blnFoundDoubles As Boolean 
blnFoundDoubles = True 
Do While blnFoundDoubles = True 
    Selection.HomeKey Unit:=wdStory 'Go to the beginning of the document. 
    blnFoundDoubles = False 'Don't go through this loop again unless we find a double this time through 
    With Selection.Find 
     .Text = " " 
     .Replacement.Text = " " 
     .Forward = True 
     .Wrap = wdFindContinue 
     .Format = False 
     .MatchCase = False 
     .MatchWholeWord = False 
     .MatchWildcards = False 
     .MatchSoundsLike = False 
     .MatchAllWordForms = False 
     If .Found = True Then 
      blnFoundDoubles = True 
     End If 
    End With 
Selection.Find.Execute Replace:=wdReplaceAll 
Loop 
End Sub 
+0

@CindyMeister: Ваше предложение сработало. Благодаря! – user6267463

ответ

0

Я всегда находил, что тестирование Found свойство немного хит-и-мисс: иногда это работает, иногда нет. Я предпочитаю объявлять логическую переменную и назначать ее Find.Execute, так как метод возвращает True, если поиск выполнен успешно, иначе False.

Код, который вы показываете, имеет другую проблему: он тестирует Found до того, как будет выполнен поиск. Попробуйте изменить код на что-то еще:

Dim blnFoundDoubles As Boolean 
Dim bFound as Boolean 
blnFoundDoubles = True 
bFound = False 
Do While blnFoundDoubles = True 
    Selection.HomeKey Unit:=wdStory 'Go to the beginning of the document. 
    blnFoundDoubles = False 'Don't go through this loop again unless we find a double this time through 
    With Selection.Find 
     .Text = " " 
     .Replacement.Text = " " 
     .Forward = True 
     .Wrap = wdFindContinue 
     .Format = False 
     .MatchCase = False 
     .MatchWholeWord = False 
     .MatchWildcards = False 
     .MatchSoundsLike = False 
     .MatchAllWordForms = False 
     bFound = .Execute(Replace:=wdReplaceAll) 
     If bFound Then 
      blnFoundDoubles = True 
     End If 
     'OR 
     'blnFoundDoubles = bFound 
    End With 
Loop 
+0

Я провел некоторое дополнительное тестирование с вашим кодом и моим исходным кодом, и я решил, что прямое тестирование метода .Found не является проблемой. Вместо этого, как вы сказали позже, проблема заключалась в том, что я тестировал .Found перед выполнением .Execute. Просто подумал, что вы, возможно, захотите узнать. Спасибо еще раз за помощь. – user6267463

+0

Спасибо за отзыв :-) Да, прямое использование. .Found' может работать, но я столкнулся со многими случаями, когда у меня нет, что я просто играю в это безопасно и советую ... –

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