2013-10-07 3 views
0

Привет всем и спасибо заранее за любые ответы;Условное замещение в Word Macro

Этот вопрос возникает при замене текста только при определенных условиях.

Предыстория: Я работаю над макросом для редакционного отдела академического учреждения. Они получают множество документов, которые имеют одинаковые проблемы, и попросили помочь сократить время, затрачиваемое на каждую из них.

Две вещи, которые они хотят:

  • Если дефис между двумя цифрами, изменить его на ан-тире
  • Изменение каждый амперсанд (&) к слову «и»

У меня есть RegExp, который находит и заменяет эти дефисы просто отлично, но я заметил проблему. Мой поиск/замена изменяет «отображаемый текст» гиперссылок. То же самое с амперсандами. Плохо. Так что я пытаюсь выяснить, как в исключить текст, который имеет Selection.Style = Word.ActiveDocument.Styles («Гиперссылка»)

BTW, что логический оператор «не равно»? Я пробовал <> и> <, но я всегда получаю сообщение об ошибке, указывающее, что выражение ожидается. Я новичок в VBA, поэтому, пожалуйста, простите вопрос новичка.

Это работает (часть гораздо большей подпрограмма):

Selection.Find.ClearFormatting 
Selection.Find.Replacement.ClearFormatting 
With Selection.Find 
    .Text = "([0-9])-([0-9])" 
    .Replacement.Text = "\1" & Chr$(150) & "\2" 
    .Forward = True 
    .Wrap = wdFindContinue 
    .Format = False 
    .MatchCase = False 
    .MatchWholeWord = False 
    .MatchWildcards = True 
    .MatchSoundsLike = False 
    .MatchAllWordForms = False 
End With 
Selection.Find.Execute Replace:=wdReplaceAll 

Так я могу создать If/Then заявление, чтобы сказать, чтобы заменить только если стиль не гиперссылке?

Еще раз спасибо, Рисса

P.S. Я искал похожие сообщения и нашел один, но на него никогда не отвечали.

ответ

0

Может быть, безопасный способ узнать, если ваш выбор является гиперссылкой использовать следующий код VBA:

If Selection.Hyperlinks.Count = 1 Then 
    MsgBox "The selection is a hyperlink" 
Else 
    MsgBox "The selection is not a hyperlink" 
End If 

Я просто проверил его быстро, и это работает прекрасно. Чтобы ответить на второй вопрос, такие операции, как «=» и «<>», предназначены для базовых типов, таких как Integer, Float, Long и т. Д. Word.ActiveDocument.Styles («Гиперссылка») возвращает объект. Поэтому вам нужно будет использовать «Is» и «Is Not»

Надеюсь, что это поможет.

0

(Спасибо Black Cr0w, логический оператор хорошо знает)

ОК, вот сделка ... Word макросы не точно выполнять линейно.

В итоге я понял, как написать инструкцию If/Then/Else, которая в основном работала. В основном. Он фактически не проверял состояние, пока не заменил (wdReplaceOne). Поэтому он изменил бы первый дефис в гиперссылке, а затем перешел «о, подождите! Это гиперссылка!» и затем он будет пропускать любые последующие дефисы в этой гиперссылке.

Итак, я закончил разделение моего If/Then/Else на два отдельных блока If/Then. Первый говорит: «Двигайся дальше, здесь нечего делать», а второй говорит: «Ага! Вот где нам нужно изменение."Код ниже, хотя пресмыкаться достойный, делает именно то, что я хочу.

Sub replaceHyphens() 
' 
' Find hyphens that occur between digits and change them to en-dash, EXCEPT in hyperlinks 
' 
Selection.Find.ClearFormatting 
Selection.Find.Replacement.ClearFormatting 
With Selection.Find 
    .Text = "([0-9])-([0-9])" 
    .Forward = True 
    .Format = True 
    .Wrap = wdFindContinue 
    .MatchCase = False 
    .MatchWholeWord = False 
    .MatchWildcards = True 
    .MatchSoundsLike = False 
    .MatchAllWordForms = False 
    .Execute 
End With 
Do While (Selection.Find.Found = True) 
    If (Selection.Style = ActiveDocument.Styles("Hyperlink")) Then 
     Selection.Move Unit:=wdSentence, Count:=1 
    End If 
    Selection.Find.Execute 
    If (Selection.Style <> ActiveDocument.Styles("Hyperlink")) Then 
     Selection.Find.Replacement.Text = "\1" & Chr$(150) & "\2" 
     Selection.Find.Execute Replace:=wdReplaceOne 
    End If 
Loop 
End Sub 

Если кто-то хочет, чтобы предложить более рациональный способ сделать это, я все уши.

Спасибо!

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