Код, который вы указали, не компилируется. Выдает ошибку на
While Not (IsEmpty(pStyle))
, потому что метод IsEmpty должен использоваться только для типа Variant, а тип, назначенный для pStyle, является String. Чтобы достичь своих целей, вам нужно изменить эту строку на
While Not pStyle = vbNullString
Обновлен для предоставления исправленной функции
Sub TestFindParagraph()
Dim IsFound As Boolean
IsFound = FindParagraph(ActiveDocument.StoryRanges(wdMainTextStory), "Heading 1")
End Sub
Public Function FindParagraph(ByVal SearchRange As Word.Range, ByVal ParaStyle As String) As Long
Dim ParaIndex As Long
For ParaIndex = 1 To SearchRange.Paragraphs.Count
If doc.Paragraphs(ParaIndex).Range.Style = ParaStyle Then
FindParagraph = ParaIndex
Exit Function
End If
Next
End Function
Обновление 2020-апрель-15 Восстановление TO C Проблема
Код, отправленный ФП и мной самим, не работает, когда абзац является полем Оглавления. Эта ошибка возникает из-за функции элемента по умолчанию для объектов VBA.
Элементом по умолчанию для объекта является метод, который вызывается, если экземпляр объекта задан без квалифицирующего метода. Эта функция может быть полезна, поскольку она упрощает код, но может привести к странным ошибкам, похожим на те, которые мы испытываем.
В Word стили - это объекты с многочисленными свойствами и методами. Метод стиля по умолчанию - NameLocal (см. Браузер объектов для Word.Style), который возвращает Variant, содержащий строку (см. Тип для стиля в locals windows). Следовательно, даже если pStyle определен как тип String, приведение VBA позволяет назначить вариант / строку для String pStyle, и все выглядит нормально.
Однако в случае поля TO C выясняется, что Word не возвращает стиль, заключающий в себе поле TO C, вместо этого он возвращает значение 'nothing', т. Е. Нет стиля для ТО C. Ничто (не то же самое, что vbNullString) не может быть присвоено строке, и, следовательно, возникает ошибка.
Похоже, есть два решения для проблемы, с которой вы столкнулись выше.
Измените код, чтобы использовать правильный синтаксис для необходимой нам информации. то есть Style.NameLocal. К сожалению, это решение также не будет выполнено, потому что мы не можем вызвать метод (NameLocal) для объекта, который является ничем.
Измените тип переменной для pStyle со String на Variant. Типы вариантов могут содержать объекты и, следовательно, могут содержать значение ничто, которое генерируется, когда абзац является полем TO C.
Решение 2, как представляется, будет работать нормально, однако из пуриста В перспективе у вас будет промежуточная переменная варианта, которая захватывает результат из Style и затем проверяет вариант на пустое значение, прежде чем присваивать строковому значению или vbNullString значение pStyle.
Окончательное обновление 2020-апр-15
К сожалению, миссис Ф. отозвала меня на несколько срочных заданий, поэтому забыла добавить этот последний кусочек.
Ловушки для членов по умолчанию можно легко избежать. Это связано с удивительной работой, проделанной людьми в Rubberduck.
http://rubberduckvba.com/
Надстройка Rubberduck для VBA (которая бесплатна) имеет, как один из его многих талантов, гораздо более строгий анализ кода (проверки кода) VBA. Одной из проверок является предупреждение о том, где в коде был использован элемент по умолчанию. Rubberduck действительно устраняет значительную боль при написании кода на VBA, поскольку помогает вам точно понять предположения, которые вы сделали в своем коде (о которых вы даже не подозревали) ...