Должен ли макрос Word для 365 ComputeStatistics распознавать аргумент IncludeFootnotesAndEndnotes в диапазоне?

#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 есть ошибка. Я не видел вашего обновленного вопроса — извините за дублирование