Word 2010 VBA错误地将每个句子的单词反对自己

时间:2014-11-07 00:19:00

标签: vba ms-word word-count

下面的宏应该拉出每个句子的平均单词,然后在所有<> = 150%的句子中将文本变为红色。

问题是,它将一些更短的句子变为红色。例如,它为这些句子着色(编辑添加:在源文档中,150%的平均长度为35个单词):

31个字:FSAIPs为基于该假设的操作过程评估设计的监管实施的充分性提供了基础,并支持准备预期的剂量评估。

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

2 个答案:

答案 0 :(得分:0)

属性.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

您只需模拟“字数”即可。对话框。

答案 1 :(得分:0)

你应该使用.Range.ComputeStatistics(wdStatisticWords)而不是.Words.Count。 第一个返回过滤后的值,第二个返回未过滤的值

请参阅: http://www.vbaexpress.com/forum/archive/index.php/t-21723.html