Решение, предоставляемое @eaazel, попадает в ловушку участника по умолчанию.
Код
wrd.Style
в действительности использует элемент по умолчанию для объекта стиля, которым является NameLocal. Таким образом, код, подразумеваемый приведенным выше кодом, в действительности
wrd.Style.NameLocal
Обычно это не будет проблемой, однако уровень детализации, который используется для извлечения объекта стиля, означает, что иногда слова без какого-либо стиля (например, поле To C). В таком случае возвращаемый объект стиля - ничто, и это приводит к неожиданной ошибке, потому что вы не можете вызвать метод NameLocal для объекта, который является ничем.
Поэтому более правильным подходом является использование единицы слова, которая является гарантированно иметь объект стиля (например, абзацы) и проверять стиль этого объекта перед проверкой каждого слова.
Option Explicit
Public Sub TitleCaseDocument()
Dim myDoc As Document: Set myDoc = ActiveDocument
Dim myPara As Range
For Each myPara In myDoc.StoryRanges.Item(wdMainTextStory).Paragraphs
If myPara.Style.NameLocal = "Normal" Then
TitleParagraph myPara
End If
Next
End Sub
Public Sub TitleParagraph(ByVal ipRange As Word.Range)
Dim myText As Range
For Each myText In ipRange.Words
If Not UCase$(myText.Text) = myText.Text Then
myText.Words.Item(1).Case = wdTitleWord
End If
Next
End Sub
Обновление 2020-Apr-16 Пересмотренный ниже код, который, как было доказано, работает на Документ Word.
Параметр Явный
Public Sub TitleCaseDocument()
Dim myDoc As Document: Set myDoc = ActiveDocument
Dim myPara As Word.Paragraph
For Each myPara In myDoc.StoryRanges.Item(wdMainTextStory).Paragraphs
If myPara.Style.NameLocal = "Normal" Then
TitleParagraph myPara
End If
Next
End Sub
Public Sub TitleParagraph(ByVal ipPara As Word.Paragraph)
Dim myText As Range
For Each myText In ipPara.Range.Words
If Not UCase$(myText.Text) = myText.Text Then
myText.Words.Item(1).Case = wdTitleWord
End If
Next
End Sub