WORD VBA 统计字数

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/5645762/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-11 13:00:26  来源:igfitidea点击:

WORD VBA Count Word Occurrences

vbams-wordword-vba

提问by decrementor

i have a code below that is already working. However i need to simplify the code even further. The code i have below counts the word occurrences in a document. The code is as follows:

我下面有一个已经在工作的代码。但是我需要进一步简化代码。我下面的代码计算文档中出现的单词。代码如下:

Option Base 1

Sub arrangepara()
Dim r As Range

Set r = activedocument.Range
If (r.Characters.Last.text = vbCr) Then r.End = r.End - 1
sortpara r
End Sub

Function sortpara(r As Range)
Dim sWrd As String
Dim Found As Boolean
Dim N As Integer, i As Integer, j As Integer, k As Integer, WordNum As Integer
N = r.Words.count
ReDim Freq(N) As Integer
ReDim Words(N) As String
Dim temp As String

i = 1
WordNum = 0
Do While r.Find.Execute(findtext:="<*>", MatchWildcards:=True, Wrap:=wdFindStop) = True
   If i = N Then Exit Do
        Found = False
        For j = 1 To WordNum
               If Words(j) = r.text Then
                   Freq(j) = Freq(j) + 1
                   Found = True
                   Exit For
               End If
        Next j
        If Not Found Then
            WordNum = WordNum + 1
            Words(WordNum) = r.text
            Freq(WordNum) = 1
        End If
   i = i + 1
Loop

Set r = activedocument.Range
r.Collapse wdCollapseEnd
r.InsertParagraphBefore
r.Collapse wdCollapseEnd

r.InsertAfter "Occurrence List:"
r.Collapse wdCollapseEnd
r.InsertParagraphBefore
r.Collapse wdCollapseEnd


For j = 1 To WordNum
    r.InsertAfter Words(j) & " (" & Freq(j) & ")" & vbCr
Next j

r.Select
Selection.sort SortFieldType:=wdSortFieldAlphanumeric, SortOrder:=wdSortOrderAscending
r.Font.Color = wdColorAqua

End Function

I need to simply this part and i dont know how. Are there any good samaritans out there that can simplify the codes for me? Thanks much! Below is what i need to simplify:

我需要简单的这部分,我不知道如何。有没有好的撒玛利亚人可以为我简化代码?非常感谢!以下是我需要简化的内容:

Do While r.Find.Execute(findtext:="<*>", MatchWildcards:=True, Wrap:=wdFindStop) = True
   If i = N Then Exit Do
        Found = False
        For j = 1 To WordNum
               If Words(j) = r.text Then
                   Freq(j) = Freq(j) + 1
                   Found = True
                   Exit For
               End If
        Next j
        If Not Found Then
            WordNum = WordNum + 1
            Words(WordNum) = r.text
            Freq(WordNum) = 1
        End If
   i = i + 1
Loop

回答by Chris Rae

I'm going to assume that by "simplify" you mean "improve performance", as I suspect this is going to be horrendously slow.

我将假设“简化”的意思是“提高性能”,因为我怀疑这会非常慢。

I would avoid getting all the words by using Find. Instead of:

我会避免使用 Find 获取所有单词。代替:

Do While r.Find.Execute(findtext:="<*>", MatchWildcards:=True, Wrap:=wdFindStop) = True
   ...
Loop

I think you should use:

我认为你应该使用:

Dim w as Word
For each w In ActiveDocument.Words
   ...
Next