标签:Word VBA
在某些情况下,可能想知道在文档中每个字母有多少个,即字母a-Z中每个有多少,或者可能想找出特定文本中最常用的字母。
本文包括两个VBA宏,计算Word文档中每个字母或其他字符的数量。
程序1:在对话框中显示结果,其中按指定的顺序显示每个字符的计数。
Sub FindNumberOfEachCharacterInActiveDocument_SortedAlphabetically()
Dim strText As String
Dim strTextNew As String
Dim lngCount As Long
Dim strInfo As String
Dim strMsg As String
Dim lngTotal As Long
Dim strCharacters As String
Dim strChar As String
'为便于编辑要计数的字符列表,
'列表定义为字符串,strCharacters.
'按你的需要编辑这个字符串 - 例如,添加要统计的数字.
'不区分大小写.
strCharacters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
strMsg = ""
strText = UCase(ActiveDocument.Range.Text)
lngTotal = Len(strText)
For lngCount = 1 To Len(strCharacters)
'从strCharacters中获取字符
strChar = Mid(strCharacters, lngCount, 1)
'要获取出现的次数:
'使用""代替strChar并计算不同的长度
strTextNew = Replace(UCase(strText), strChar, "")
strInfo = strChar & ":" & vbTab & lngTotal - Len(strTextNew) & vbCr
'追加信息到消息框
strMsg = strMsg & strInfo
Next lngCount
'在对话框显示信息
strMsg = strMsg & vbCr & vbCr & _
"主文档中字母数量: " & lngTotal
'如果列表strCharacters没有按字母顺序排列,
'你应该编辑下面的MsgBox标题
MsgBox strMsg, vbOKOnly, "按字母顺序统计"
End Sub
程序2:在对话框中显示结果,其中按出现次数降序排列字符计数,即首先显示最常出现的字符。
Sub FindNumberOfEachCharacterInActiveDocument_SortedByOccurrences()
Dim strText As String
Dim strTextNew As String
Dim lngCount As Long
Dim strInfo As String
Dim strMsg As String
Dim lngTotal As Long
Dim lngChar As Long
Dim strCharacters As String
Dim strChar As String
Dim oDocTemp As Document
Dim oTable As Table
Application.ScreenUpdating = False
'为便于编辑要计数的字符列表,
'列表定义为字符串,strCharacters.
'按你的需要编辑这个字符串 - 例如,添加要统计的数字.
'不区分大小写.
strCharacters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
strMsg = ""
strText = UCase(ActiveDocument.Range.Text)
lngTotal = Len(strText)
'创建用于存储字符计数和执行排序的临时文档
'阻止自动新建宏运行(如果找到)
WordBasic.DisableAutoMacros 1
Set oDocTemp = Documents.Add
'插入用于为最终消息添加信息的表
With oDocTemp
.Range.Text = ""
'插入2列表, 行数 = strCharacters的长度
Set oTable = .Tables.Add(.Range, Len(strCharacters), 2)
End With
'添加strCharacters中每个字符的信息
For lngCount = 1 To Len(strCharacters)
'从strCharacters获取字符
strChar = Mid(strCharacters, lngCount, 1)
'要获取出现的次数:
'使用""代替strChar并计算不同的长度
strTextNew = Replace(UCase(strText), strChar, "")
lngChar = lngTotal - Len(strTextNew)
'在表中单元格2插入结果
oTable.Cell(lngCount, 2).Range.Text = lngChar
'在表中单元格1插入字符
oTable.Cell(lngCount, 1).Range.Text = strChar
Next lngCount
'按列2排序表并转换成文本
oTable.Sort ExcludeHeader:=False, FieldNumber:="Column 2", _
SortFieldType:=wdSortFieldNumeric,
SortOrder:=wdSortOrderDescending
oTable.Rows.ConvertToText Separator:=wdSeparateByTabs
'从oDocTemp存储文本, 准备在最终消息中使用
strInfo = oDocTemp.Range.Text
'不保存关闭oDocTemp
oDocTemp.Close wdDoNotSaveChanges
Application.ScreenUpdating = True
'在对话框中显示信息
strMsg = strInfo & vbCr & vbCr & _
"主文档中字母数量: " & lngTotal
MsgBox strMsg, vbOKOnly, "按字符统计数值降序排列"
'清理
Set oDocTemp = Nothing
Set oTable = Nothing
'再次启用自动运行宏
WordBasic.DisableAutoMacros 0
End Sub
注意,这些程序只计算主文档中的内容,而不会统计页眉、页脚、尾注、脚注等中的字符。
你可以以这些代码为基础,统计其他字符的数量。例如,如果还想统计每个数字的数量,可以添加数字0-9。
如何修改程序来仅统计所选内容中的字符
要统计文档中所选内容的字符,将代码中的:
strText = UCase(ActiveDocument.Range.Text)
修改为:
strText = UCase(Selection.Text)
在运行程序前,需要选择想要统计的文档内容。
使用VBA统计字符总数
代码为:
ActiveDocument.Characters.Count
注:本文学习整理自thedoctools.com,供学习参考。