#vba #ms-word #word-count #footnotes
Вопрос:
Я хочу написать макрос Word, который подсчитывает слова в активном разделе документа, включая текст сноски.
Этот метод работает правильно при применении ко всему документу:
SectionWordCount = ActiveDocument.ComputeStatistics(Statistic:=wdStatisticWords, _
IncludeFootnotesAndEndnotes:=True)
Я могу считать слова в активном разделе без текста сноски, когда этот метод без аргумента Include применяется к диапазону, определяемому как активный раздел:
SectionNum = Selection.Information(wdActiveEndSectionNumber)
Set myRange = ActiveDocument.Sections(SectionNum).Range
SectionWordCount = myRange.ComputeStatistics(Statistic:=wdStatisticWords)
Однако этот метод завершается неудачей, когда я пытаюсь установить аргумент Include true:
SectionNum = Selection.Information(wdActiveEndSectionNumber)
Set myRange = ActiveDocument.Sections(SectionNum).Range
SectionWordCount = myRange.ComputeStatistics(Statistic:=wdStatisticWords, _
IncludeFootnotesAndEndnotes:=True)
Это вызывает «Ошибку 448 во время выполнения: именованный аргумент не найден».
У кого-нибудь есть исправление или обходной путь в макросе, который обеспечит количество слов, включая сноски для раздела активного документа?
Обходной Путь, В Котором Есть Своя Ошибка
Не увидев ответа, я добавлю эту попытку обходного пути. Поскольку флаг IncludeFootnotesAndEndnotes кажется неработоспособным с диапазоном текста, охватывающим активный раздел, я расширил макрос, чтобы выполнить итерацию по каждой сноске документа и добавить количество отдельных слов в сноске к общему количеству для раздела. Однако при этом возникает проблема, связанная с тем, что сноски, подлежащие повторению, не ограничиваются сносками в активном разделе, так что итоговое количество слов захватывает все сноски документа (оно пересчитывается).
Итак, как я могу ограничить итерацию только сносками в активном разделе?
Это пересмотренный макрос:
Sub SectionWordCount()
Dim SectionWordCount As Integer
Dim SectionNum As Integer
Dim f As Footnote
Dim fTempCount As Integer
SectionWordCount = 0
SectionNum = 0
fTempCount = 0
SectionNum = Selection.Information(wdActiveEndSectionNumber)
Set myRange = ActiveDocument.Sections(SectionNum).Range
SectionWordCount = myRange.ComputeStatistics(Statistic:=wdStatisticWords)
' Now get word count in each footnote and accumulate in <fTempCount>
For Each f In myRange.Footnotes
' For some reason Word is iterating over entire document (all footnotes) rather than those associated with the active section.
fTempCount = fTempCount f.Range.ComputeStatistics(Statistic:=wdStatisticWords)
Next
SectionWordCount = SectionWordCount fTempCount
MsgBox "Section " amp; SectionNum amp; vbCrLf amp; _
"The current section has " amp; SectionWordCount amp; " words including footnotes."
End Sub
Пересмотренный и рабочий макрос
Sub SectionWordCount()
Dim SectionWordCount As Integer
Dim SectionNum As Integer
Dim f As Footnote
Dim fTempCount As Integer
SectionWordCount = 0
SectionNum = 0
fTempCount = 0
SectionNum = Selection.Information(wdActiveEndSectionNumber)
Set myRange = ActiveDocument.Sections(SectionNum).Range
SectionWordCount = myRange.ComputeStatistics(Statistic:=wdStatisticWords)
If myRange.Footnotes.Count > 0 Then
For idx = 1 To myRange.Footnotes.Count
Set f = myRange.Footnotes(idx)
fTempCount = fTempCount f.Range.ComputeStatistics(Statistic:=wdStatisticWords)
Next
End If
SectionWordCount = SectionWordCount fTempCount
MsgBox "Section " amp; SectionNum amp; vbCrLf amp; _
"The current section has " amp; SectionWordCount amp; " words including footnotes."
End Sub
Ответ №1:
IncludeFootnotesAndEndnotes доступен только на уровне документа (https://docs.microsoft.com/de-de/office/vba/api/word.document.computestatistics) но не на уровне диапазона (https://docs.microsoft.com/de-de/office/vba/api/word.range.computestatistics)
Похоже, в VBA есть ошибка. Вы должны перебирать сноски по индексу, а не по коллекции:
' Now get word count in each footnote and accumulate in <fTempCount>
If myrange.Footnotes.Count > 0 Then
For i = 1 To myrange.Footnotes.Count
Set f = myrange.Footnotes(i)
' For some reason Word is iterating over entire document (all footnotes) rather than those associated with the active section.
fTempCount = fTempCount f.Range.ComputeStatistics(Statistic:=wdStatisticWords)
Next
end if
```
Комментарии:
1. Спасибо, Айк, это выглядит многообещающе. Однако, просматривая активный документ. StoryRanges(wdFootnotesStory), похоже, что это все еще возвращает текст сноски, который не привязан к конкретным сноскам в активном разделе. У вас есть быстрый способ ограничить выбор этой сноски?
2. Спасибо, Айк. Я думаю, вы увидите, что я попробовал этот конкретный подход в своей работе, как указано выше, но он по-прежнему не ограничивает сноски сносками в конкретном разделе документа. Получаете ли вы другой результат, когда используете его?
3. Попробуйте выполнить итерацию по индексу — похоже, в vba есть ошибка. Я не видел вашего обновленного вопроса — извините за дублирование