Неправильная замена двойных кавычек вместо двойных угловых кавычек VBA Word - PullRequest
2 голосов
/ 07 января 2020

Я пытаюсь заменить все Left and Right double angle quotes chr (171) и chr (187), а затем пробел chr (32), равный « или », только chr (171) или chr (187). ) соответственно.

Заменить это "« Ab c "на это" «Ab c"

и

Замените это " xyz»"на это" xyz »"

Я использую приведенный ниже код, но после замены символ становится двойным цитата вместо двойного угла цитата «

Sub ReplaceDoubleAngleQuotes()

With Selection.Find
 .ClearFormatting
 .Text = Chr(171) & Chr(32)
 .Replacement.ClearFormatting
 .Replacement.Text = Chr(171)
 .Execute Replace:=wdReplaceAll, Forward:=True, _
 Wrap:=wdFindContinue
End With

End Sub

Как это исправить? Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 07 января 2020

Возможно, вы включили .AutoFormatAsYouTypeReplaceQuotes, и ваше слово заменяет chr (171) («) на" ".

Если вы хотите просто отключить это для функции Find & Replace, сделайте вот что:

Sub ReplaceDoubleAngleQuotes()

Dim userSmartQuotes As Boolean

userSmartQuotes = Options.AutoFormatAsYouTypeReplaceQuotes
Options.AutoFormatAsYouTypeReplaceQuotes = False

With Selection.Find
 .ClearFormatting
 .Text = Chr(171) & Chr(32)
 .Replacement.ClearFormatting
 .Replacement.Text = Chr(171)
 .Execute Replace:=wdReplaceAll, Forward:=True, _
 Wrap:=wdFindContinue
End With

Options.AutoFormatAsYouTypeReplaceQuotes = userSmartQuotes

End Sub

Если вы хотите просто отключить это (не возвращаясь к основным настройкам), поставьте

Options.AutoFormatAsYouTypeReplaceQuotes = False

в начале, и это все.

1 голос
/ 07 января 2020

Прежде всего, Chr(171) и Chr(187) не являются угловыми кавычками. Они могут быть в определенных местах, но в других они будут разными персонажами. Вы хотите использовать ChrW(171) и ChrW(187).

. Имея это в виду, ваш код действительно работает и корректно заменяет цитату, но затем Word Файл - Параметры - Проверка - Параметры автозамены - Автоформат по мере ввода - Прямые кавычки с умными кавычками запускается и заменяет окончательные « с .

Один из вариантов - отключить эту функцию:

Dim prev_value As Boolean
prev_value = Application.Options.AutoFormatAsYouTypeReplaceQuotes

Application.Options.AutoFormatAsYouTypeReplaceQuotes = False

With Selection.Find
  .ClearFormatting
  .Replacement.ClearFormatting
  .Execute FindText:=ChrW$(171) & " ", _
           ReplaceWith:=ChrW$(171), _
           Replace:=wdReplaceAll, _
           Forward:=True, _
           Wrap:=wdFindContinue
End With

Application.Options.AutoFormatAsYouTypeReplaceQuotes = prev_value

Другой вариант - использовать сопоставление с подстановочными знаками, захватывать кавычку anlge как отдельную группу и упоминать ее в замене. подстановочный знак:

With Selection.Find
  .ClearFormatting
  .Replacement.ClearFormatting
  .Execute FindText:="(" & ChrW$(171) & ")( )", _
           MatchWildcards:=True, _ 
           ReplaceWith:="\1", _
           Replace:=wdReplaceAll, _
           Forward:=True, _
           Wrap:=wdFindContinue
End With

По какой-то причине в этом случае функция умного цитирования не срабатывает.

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