Word 2010 VBA неправильно считает слова в предложении против самого себя

Макрос ниже должен получить среднее количество слов в предложении, а затем сделать текст красным во всех предложениях, которые составляют> = 150% от этого.

Проблема в том, что некоторые более короткие предложения также окрашиваются в красный цвет. Например, он раскрасил эти предложения (отредактировано, чтобы добавить: в исходном документе 150% средней длины составляет 35 слов):

31 слово: FSAIP обеспечивают основу для оценки адекватности нормативной реализации проекта на основе этого предполагаемого рабочего процесса и поддерживают подготовку перспективных оценок дозы.

29 слов: (В соответствии с 10 CFR 835.2 критерии мощности эквивалентной дозы применимы на расстоянии 30 см от источника излучения или 30 см от любой поверхности, через которую проходит излучение.)

(Я бы привел еще примеры, но это процедура радиационного контроля на федеральном ядерном проекте, поэтому мне нужно тщательно выбирать.)

Количество слов в приведенных выше предложениях взято из строки состояния в нижней части окна. Таким образом, кажется, что Word подсчитывает количество слов по-разному в зависимости от того, какая часть Word подсчитывает. Я думаю.

Есть ли какие-либо предложения о том, как сделать подсчет более точным или, по крайней мере, одинаковым для обеих ситуаций? О, и последнее замечание: это не считая видимых удаленных слов. В некоторых случаях это может быть подсчет таких вещей, как неразрывные дефисы, но не в тех, которые были описаны выше.

Sub Mark_Long()

'''''''''''''''''''
' Adapted from "Allen Wyatt's Word Tips, wordribbon.tips.net.
' I added to it so it pulls the avg sentence length from
' the readability stats, and only marks the sentences that are 150%
' of the average.
''''''''''''''''''''

Dim iMyCount As Integer
Dim iWords As Integer
Dim bTrackingAsWas As Boolean

    If Not ActiveDocument.Saved Then
        ActiveDocument.Save
    End If


Set myRange = ActiveDocument.Content
    wordval = myRange.ReadabilityStatistics(6).Value
    bTrackingAsWas = ActiveDocument.TrackRevisions

    'Turn off tracked changes
    ActiveDocument.TrackRevisions = False

    'Reset counter
    iMyCount = 0

    'Set number of words
    iWords = (wordval * 1.5)

    For Each MySent In ActiveDocument.Sentences
        If MySent.Words.Count > iWords Then
            MySent.Font.Color = wdColorRed
            iMyCount = iMyCount + 1
        End If
    Next
    'Restore tracked changes
    ActiveDocument.TrackRevisions = bTrackingAsWas

    'Report results
    MsgBox iMyCount & " sentences longer than " & _
      iWords & " words."

End Sub

person TheFontSnob    schedule 07.11.2014    source источник
comment
Я просто потратил некоторое время, пытаясь воссоздать его проблему. Это правда, что количество слов VBA отличается от количества слов в графическом интерфейсе Word. В большинстве случаев это добавление слова, но мне кажется, что в некоторых случаях оно отстает почти на 5. Пока не нашел объяснения.   -  person Matt    schedule 07.11.2014


Ответы (2)


вы должны использовать .Range.ComputeStatistics(wdStatisticWords) вместо .Words.Count. Первый возвращает отфильтрованное значение, второй — нефильтрованное.

См.: http://www.vbaexpress.com/forum/archive/index.php/t-21723.html

person Frank van der Burg    schedule 08.10.2015
comment
Более конкретная ссылка документация Microsoft. Примечание. это ComputeStatistics занимает довольно много времени для больших документов, даже если вы просто хотите подсчитать количество слов для определенного абзаца. - person Yeshurun Kubi; 09.09.2020

Свойство .Words возвращает настоящие слова, а также знаки препинания и абзацы. Чтобы получить реальное количество слов, вы можете использовать этот — немного странный — метод.

Set dlg = Dialogs(wdDialogToolsWordCount)
For Each MySent In ActiveDocument.Sentences
    MySent.Select
    Set dlg = Dialogs(wdDialogToolsWordCount)
    dlg.Execute
    Count = dlg.Words
    ' Count is the number you are looking for
Next

Вы просто имитируете диалоговое окно «Подсчет слов».

person Fratyx    schedule 07.11.2014
comment
Мне НАСТОЛЬКО жаль, что это засохло за три недели. Приоритеты клиентов мешали мне работать над этим. @Fratyx, я пытался добавить MsgBox Count перед Next, и ваш метод дает точный подсчет для каждого предложения, хотя в самом начале и в конце документа я получаю общее количество слов в файле (и таблицы очень медленные). С MsgBox Count в конце Sub я получаю количество слов только в последнем предложении. Как будто мне нужно усреднить все результаты. Если нет простого способа сделать это, я просто увеличу множитель в своем исходном коде и назову его достаточно близким. Спасибо. - person TheFontSnob; 26.11.2014