ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 8146|回复: 12

[求助] 如何用VBA代码计算文档中单词出现的频次及单词数

[复制链接]

TA的精华主题

TA的得分主题

发表于 2010-8-15 11:21 | 显示全部楼层 |阅读模式
请教:
如何通过VBA代码把英文文档中所有的单词列出来,出现一次或多次的都只列入一次,并在单词后面用括号标出其出现的频次;在下一段出现如这样的信息:
本文档出现的单词数共计X个。

TA的精华主题

TA的得分主题

发表于 2010-8-17 15:31 | 显示全部楼层
Sub Macro3()
On Error Resume Next '忽略错误继续执行VBA代码,避免出现错误消息
Selection.WholeStory
Dim myString2 As String, ppp
Dim myArray2() As String
Dim strFind2 As String
Dim myArray3() As String

aaa = Selection.Words.Count
ppp = ""
For fb = 1 To aaa

    strFind2 = Selection.Words(fb)
    myString2 = ActiveDocument.Content.Text
    myArray2 = Split(myString2, strFind2)
   mm = UBound(myArray2)
   
   myArray3 = Split(ppp, "一共有" & mm & "个          ")
   mmm = UBound(myArray3)
If Not mmm > 0 Then
ppp = ppp & Selection.Words(fb) & "一共有" & mm & "个          "

End If
Next
msgbox "本文档出现的单词数共计" & aaa & "个"
MsgBox ppp
End Sub
我是菜鸟,仅写了这一段,还应该排除标点的,另外我不知道怎么全部列出,msgbox有字数限制吧

[ 本帖最后由 sqhsqhli 于 2010-8-17 16:03 编辑 ]

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-8-17 18:21 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
谢谢sqhsqhli 兄!
能否将列出的单词及频次生成在活动文档中?
这里的单词数不是指单词总数,即如果一个单词出现2次或2次以上的,按一个单词计算;以此来计算单词的数量
请各位再帮帮忙!

[ 本帖最后由 tangqingfu 于 2010-8-17 18:35 编辑 ]

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-8-18 17:08 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2010-8-19 14:39 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
呵呵,可以参考守柔的正则查找(速度快)!也可以用错误次数来统计!

TA的精华主题

TA的得分主题

发表于 2010-8-20 17:51 | 显示全部楼层
可试试如下代码:
Option Compare Text
Sub test()
    Dim a As String, Dic As Object
    Dim myReg As Object, Matches As Object, Match As Object
    Dim k, i As Long, j As Long, temp As String, c As String
   
    a = ActiveDocument.Content.Text
    Set Dic = CreateObject("Scripting.Dictionary")
    Dic.CompareMode = vbTextCompare
    Set myReg = CreateObject("VBScript.RegExp")
    With myReg
        .Pattern = "[A-Za-z]+"  '匹配模式:由纯字母组成的字符串
        .Global = True
        Set Matches = .Execute(a)
        For Each Match In Matches  '统计频次
            With Match
                If Dic.Exists(.Value) Then Dic(.Value) = Dic(.Value) + 1 Else Dic.Add .Value, 1
            End With
        Next
        k = Dic.Keys  '获取各“单词”
        For i = 0 To UBound(k) - 1 '排序
            For j = i + 1 To UBound(k)
                If k(i) > k(j) Then
                    temp = k(i)
                    k(i) = k(j)
                    k(j) = temp
                End If
            Next
        Next
        For i = 0 To UBound(k)  '合并以用于输出
            c = c & k(i) & vbTab & Dic(k(i)) & Chr(13)
        Next
        Documents.Add.Content.Text = "共有如下" & Dic.Count & "个英文单词(含频次):" & Chr(13) & c
    End With
End Sub

TA的精华主题

TA的得分主题

发表于 2010-8-21 09:49 | 显示全部楼层
原帖由 tangqingfu 于 2010-8-20 23:23 发表
谢谢sylun兄!
比如don't , I'm
代码将don't视为两个单词:don和t;I'm视为两个单词I和m,像上面的这两个单词我don't和I'm应视为一个单词处理.
请sylun兄再帮帮忙!

怎么样才算一个英文单词?其判断标准如何?我想这是一个复杂的问题。比如名词复数,加“s"后,两者是不是不同的单词?
前面的代码只针对纯字母字符串,也就是说,其对单词的判断标准很简单:只是字母组合。至于中间带标点的单词不予考虑。
如一定要将don't , I'm之类的组合计算在内(不含'与s的组合),可试将上面的匹配模式代码改为“[A-Za-z]+('[A-RT-Za-rt-z]+|[A-Za-z]?)”。

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-8-20 23:23 | 显示全部楼层
谢谢sylun兄!
比如don't , I'm
代码将don't视为两个单词:don和t;I'm视为两个单词I和m,像上面的这两个单词我don't和I'm应视为一个单词处理.
请sylun兄再帮帮忙!

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-8-21 10:23 | 显示全部楼层
好像有些问题:
比如:
I'm OK. I like English. I’d like English. English is my favorite. That's Ok. That is right. Those are buses. These are bikes
用sylun兄8楼所说的操作,计算结果如下:
共有如下17个英文单词(含频次):
are        2
bikes        1
buses        1
d        1
English        3
favorite        1
I        3
is        2
like        2
m        1
my        1
OK        2
right        1
s        1
That        2
These        1
Those        1
如何让计算结果变成:
共有如下17个英文单词(含频次):
are        2
bikes        1
buses        1
I'd        1
English        3
favorite        1
I        1
is        2
like        2
I'm        1
my        1
OK        2
right        1
That        1
That's        1
These        1
Those        1

[ 本帖最后由 tangqingfu 于 2010-8-21 10:25 编辑 ]

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-8-21 10:08 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
如sylun兄所言,要界定一个英语单词的判断标准,的确有些难度。除了名词外,动词原形与动词的第三人人称单词或ing形式是否算一个单词?是吧,好像也不是。只能说是仁者见仁,智者见智。
谢谢sylun兄的帮忙,好像sylun兄用到正则表达式,看不太懂,有些难度……

[ 本帖最后由 tangqingfu 于 2010-8-21 10:27 编辑 ]
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2025-1-16 16:53 , Processed in 0.030032 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表